pigpio PWM

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

pigpio PWM

Inlägg av Oltronix »

Efter ett antal år med Rasberry Pi fick för mig att använda GPIO för första gången för att skapa PWM-signaler. Hittade pigpio. Den verkar vara händig att använda.

Det verkar som att flera GPIO-utgångar påverkar varandra. Jag kör först en PWM på en GPIO-utgång med 800Hz. Därefter startar jag fyra PWM på olika andra GPIO-utgångar. Det som händer är att 800Hz signalen försvinner och ersätts med en c:a 5MHz signal. Det händer bara om jag har en PWM på första GPIO-utgången. Är detta ett problem med:
1. pigpio demonen?
2. GPIO-HW?
3. Mitt exemplar av RPI?
4. Annat?

Kod som skickar PWM på första GPIO-utgången

Kod: Markera allt

#!/usr/bin/env python
import time
import pigpio

pi = pigpio.pi() 
pi.write(18, 1)
pi.hardware_PWM(18, 800, 250000) # 800Hz 25% dutycycle

pi.stop()
Kod som "stör" första GPIO-utgång hittade jag här:
http://abyz.me.uk/rpi/pigpio/examples.h ... hon%20code
Filen "Wave PWM 1"

Kod: Markera allt

#!/usr/bin/env python

import time
import pigpio

# wave_PWM.py
# 2016-03-19
# Public Domain

"""
This script shows how to use waves to generate PWM with a
set frequency on any spare GPIO.

Note that only one wave can be transmitted at a time.  So if
waves are being used to generate PWM they can't also be used
at the same time for another purpose.

The frequency is defined by the number of cycles per second.

A wave is generated of length 1000000/frequency microseconds.
The GPIO are switched on and off within the wave to set the
duty cycle for each GPIO.  The wave is repeatedly transmitted.

Waves have a resolution of one microsecond.

You will only get the requested frequency if it divides
exactly into 1000000.

For example, suppose you want a frequency of 7896 cycles per
second.  The wave length will be 1000000/7896 or 126 (for an
actual frequency of 7936.5) and there will be 126 steps
between off and fully on.

One function is provided:

set_dc(channel, dc)

channel: is 0 for the first GPIO, 1 for the second, etc.
     dc: is the duty cycle which must lie between 0 and the
         number of steps.
"""

FREQ=5000 # The PWM cycles per second.

PWM1=22
PWM2=23
PWM3=24
PWM4=25

GPIO=[PWM1, PWM2, PWM3, PWM4]

_channels = len(GPIO)

_dc=[0]*_channels

_micros=1000000/FREQ

old_wid = None

def set_dc(channel, dc):

   global old_wid

   if dc < 0:
      dc = 0
   elif dc > _micros:
      dc = _micros

   _dc[channel] = dc

   for c in range(_channels):
      d = _dc[c]
      g = GPIO[c]
      if d == 0:
         pi.wave_add_generic([pigpio.pulse(0, 1<<g, _micros)])
      elif d == _micros:
         pi.wave_add_generic([pigpio.pulse(1<<g, 0, _micros)])
      else:
         pi.wave_add_generic(
            [pigpio.pulse(1<<g, 0, d), pigpio.pulse(0, 1<<g, _micros-d)])

   new_wid = pi.wave_create()

   if old_wid is not None:

      pi.wave_send_using_mode(new_wid, pigpio.WAVE_MODE_REPEAT_SYNC)

      # Spin until the new wave has started.
      while pi.wave_tx_at() != new_wid:
         pass

      # It is then safe to delete the old wave.
      pi.wave_delete(old_wid)

   else:

      pi.wave_send_repeat(new_wid)

   old_wid = new_wid

pi = pigpio.pi()
if not pi.connected:
   exit(0)

# Need to explicity set wave GPIO to output mode.

for g in GPIO:
   pi.set_mode(g, pigpio.OUTPUT)

for i in range(_micros):

   set_dc(0, i)
   set_dc(1, i+(_micros/4))
   set_dc(2, (_micros/4)-i)
   set_dc(3, _micros-i)

   time.sleep(0.5)

pi.wave_tx_stop()

if old_wid is not None:
   pi.wave_delete(old_wid)

pi.stop()
CPU:
En RPI 2B
uname -a
Linux mumin1 4.1.7-v7+ #817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015 armv7l GNU/Linux
Senast redigerad av Oltronix 26 augusti 2018, 17:34:02, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: pigpio PWM

Inlägg av Icecap »

Hmmm - kan det vara vad som står i texten:
"Note that only one wave can be transmitted at a time. So if
waves are being used to generate PWM they can't also be used
at the same time for another purpose."


Det bordet vara klart nog...
Användarvisningsbild
Oltronix
Inlägg: 408
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: pigpio PWM

Inlägg av Oltronix »

Mja så kan man tolka texten, som är lite otydlig, man pratar om wave och inte GPIOx. Och visst så kan det vara och därmed svar på min fråga. Men det är ju så att koden skickar ut PWM på 4 GPIO,

Kod: Markera allt

GPIO=[PWM1, PWM2, PWM3, PWM4]
Och var tusan kommer 5MHz signalen på GEN18 ifrån.

Edit:
Dock under beskrivningen av anropet "wave_send_using_mode(wave_id, mode)"
står det "NOTE: Any hardware PWM started by hardware_PWM will be cancelled"
Tyvärr står det om detta gäller alla GPIO eller bara de man tänker använda.
Och igen vad tusan kommer 5MHz ifrån? En bug eller?
Skriv svar