Kan jeg bruke GPIO som pulsbreddemodulasjon -utgang?
Hvis ja, hvordan skal jeg gjøre det og hvor mange samtidige, forskjellige PWM-utganger kan jeg ha?
Kommentarer
- Du må sannsynligvis spesifisere hvilken modell du ‘ bruker. De er alle litt forskjellige.
- @ user1147688 Dette spørsmålet ble stilt tilbake da det bare var en modell!
Svar
Som foreslått av Alex Chamberlain , vises WiringPi -biblioteket for å støtte både maskinvare PWM-utgang på en eller to GPIO-pinner, avhengig av modell, og programvare PWM på noen av de andre GPIO-pinnene. I mellomtiden gjør RPIO.PWM-biblioteket PWM med DMA på en hvilken som helst GPIO-pin. Effektivt er dette et halvveis hus mellom maskinvare og programvare PWM, og gir en 1 µs timingoppløsning sammenlignet med 100 µs med WiringPi «s Programvare PWM [1] .
Hvilken av disse som passer for applikasjonene dine, avhenger av hvor mange PWM-utganger du trenger og hvilken ytelse du vil ha ut av disse utgangene.
Hvis applikasjonen din er tolerant for lav tidsoppløsning og høy jitter , kan du bruke en programvare eller DMA-assistert timing-loop. Hvis du vil ha høyere presisjon / lavere jitter PWM, så kan det hende du trenger maskinvareassistanse.
Når kan programvare PWM være egnet?
Hvis du vil blinke en haug med lysdioder med forskjellige menneskelige synlige kadenser (10 «s hertz) med myke sanntidskrav til svar , da kan programvaresløyfen håndtere så mange PWM-er som du har GPIO-pinner.
Når kan maskinvare-PWM være passende?
Hvis du vil kontrollere en serv o motor med harde sanntids svarkrav, så må du bruke maskinvare-PWM. Selv da kan du ha problemer med å sikre en sanntidsrespons for servosløyfen som binder koderinngang til PWM-utgang.
En stabil servosløyfe trenger å lese kodere med en jevn hastighet (lav jitter), skrive ut reviderte PWM-utgangsverdier med en jevn hastighet, og ventetiden mellom disse skal være fast (samlet sett lite jitter). Hvis du ikke kan gjøre dette, må du avstemme (soft tune) motoren din for å forhindre at den blir ustabil under belastning. Dette er vanskelig å gjøre med et multi-tasking operativsystem uten støtte på lavt nivå.
Hva om jeg trenger flere maskinvare-PWM-utganger?
Hvis du trenger å kjøre flere servoløkker enn du har maskinvare-PWM-utganger, vil du sannsynligvis trenge å laste dem av til en annen enhet for å sikre hard sanntidsytelse, omlegge din Raspberry Pi til å være en myk veileder i sanntid .
Et alternativ, ville være noe som Adafruit 16-kanals 12-biters PWM / Servo Driver – I²C-grensesnitt – PCA9685 som lar deg kontrollere 16 PWM-utganger med bare noen få pinner GPIO for I²C-bussen. For et eksempel på bruken, sjekk ut I²C 16 Channel PWM / Servo Breakout – Working innlegget på Raspberry Pi-forumene.
1. Takk til dm76 for forslaget, dog lyng sier at RPIO.PWM kanskje ikke lenger fungerer for nyere pi-modeller.
Kommentarer
- Kan jeg bruke programvarens PWM-tilnærming til å kjøre DC-motorer?
- @gideon – Ja, motoreffektforsterkerne som jeg har brukt har alle tatt PWM som input.
- FYI, RPI-biblioteket ( pythonhosted.org/RPIO/pwm_py.html ) ser ut til å ha en mye bedre oppløsning (1us) sammenlignet med WiringPi med 100us oppløsning
- @MarkBooth – Ingen probs. Biblioteket er veldig godt skrevet og kan brukes som drop-in erstatning for RPi.GPIO, noe som er veldig nyttig hvis du startet et prosjekt med sistnevnte og senere innså at PWM-signaler var nødvendig …
- RPIO. PWM fungerer kanskje ikke lenger for nyere pi-modeller, tror jeg.
Svar
Maskinvare PWM
Ja, det er en maskinvare-PWM-utgang på Raspberry Pi, koblet til P1-12 (GPIO18). Videre kan PWM-utganger legges til ved bruk av et I²C eller SPI -grensesnitt; noen mennesker har hatt suksess med dette ( foruminnlegg ).
Eksempelkode
Du kan bruke WiringPi-bibliotek for å kontrollere PWM-pinnen; du kan se på koden for å unngå å inkludere hele biblioteket.
Programvare PWM
Raspberry Pi er ikke egnet for seriøs programvare PWM, ettersom Linux ikke er et sanntidsoperativsystem. .
Kommentarer
- Spørsmål, hva er definisjonen eller et eksempel på seriøs programvare-PWM? Og hva er » sanntidsoperativsystemer » og er det noen gang noen sjanse for å få en på en Pi
- @AnthonyBlake Vel, du kan sannsynligvis kontrollere lysstyrken til et lys ved hjelp av programvaren PWM, men jeg mistenker at en motor vil gå i stå. Det ‘ trenger ikke å gjøre programvare PWM, men maskinvaren er enklere og mer effektiv. Sanntidsoperativsystemer vil bli bedre forklart av Google; de garanterer visse ting om hvor lenge og ofte programvare kjøres.
- @AnthonyBlake A » Sanntids OS » (RTOS) er et operativsystem som gir deg en garanti på den øvre tidsgrensen for utførelse. Som å si til programmet » Ja, du vil ha litt utføringstid på 33ms (gi eller ta 2ms toleranse) for å snu den GPIO-pin-biten for å gi trinnmotoren et signal nøyaktig tidsvindu når han trenger det. Og du kan stole på det! » Der ‘ er en RT Linux der ute. Vet ikke ‘ om det ‘ er blitt overført til RPi (ennå).
- Beklager Alex, jeg stjal ikke ‘ med vilje en annen del av svaret ditt, men jeg ‘ har bare lagt merke til at vi kom til samme foruminnlegg via forskjellige ruter .
- Nyere modeller med 40 pinner har en annen hardware PWM koblet til GPIO19 (pin 35).
Svar
Nylig Pis har to maskinvare-PWM-kanaler. I tillegg kan maskinvarestimerte PWM-pulser genereres uavhengig av alle GPIO som er koblet til 40-pins utvidelseshode. (800 Hz, 0 av – 255 helt på).
F.eks servoblaster og min pigpio osv.
Kommentarer
- Fint svar! Hvordan kan jeg bruke de to HW PWM-ene? Jeg må kontrollere to servoer, jeg vet at du sier at servoblaster og pigpio er OK for det, men jeg lurer bare på HW PWM, for jeg finner ikke noe om dem … er det noen dokumenter for det der ute? Jeg har en RPi 2 V1.1 for tester.
- C , Python , grisekommandolinje .
- Tung CPU-belastning skal ikke ‘ t lage en forskjell. Kraftig nettverksbelastning kan utgjøre en forskjell for gpioServo, spesielt hvis du prøver på 1 MHz i stedet for standard 200 kHz. Frekvensen er 50 (Hz), driftssyklusområdet vil være 0 – 1000000 (kartlagt til den virkelige underliggende verdien på 0 – 5000000). 1 ms er 1 ms på 20 ms, så en pliktsyklus på 5% så 50000, 1.5ms- > 7,5% – > 75000, 2ms – > 10% – > 100000.
- Side 102 av BCM2835 ARM-periferiutstyr viser de forskjellige modusene som GPIO kan tildeles. Se on-line for hvilke GPIO som blir ledet ut til de forskjellige Pi-modellutvidelseshodene.
- @ user1147688 PLLD (500MHz) brukes som kjernen i PWM-klokken. På grunn av måten » fungerer «, er PWM-kjernefrekvensen 250 MHz. For å kunne slå på og av (ganske viktig for PWM) er maksimum 125 MHz. Du kan doble tallene ved å bruke PLLC (1000 MHz), men PLL varierer med klokkehastigheten.
Svar
Ikke et sanntids OS, men RISC OS for Raspberry Pi er samarbeidende multitasking, slik at du enkelt kan kjøre et program som har 100% CPU så du kan styre tidene dine mye bedre. Bare ikke forvent å gjøre noe annet enn din egen kode.
Kommentarer
- Jeg leste et sted at det er en maskinvaregrense for bytte frekvensen til en utgangspinne også. Jeg tror det var rundt 20 MHz. Så ikke ‘ forventer ikke å kunne trekke 300 MHz PWM eller noe sånt, selv med 100 % CPU-bruk.
- @Wallacoloo: Hvilke applikasjoner krever 300 MHz PWM?
- @PeterMortensen: Vel, jeg vet ikke ‘ ikke hvordan radio sendere og slikt genererer signalene sine, men noen kan gjøre det med PWM. PiFM gjør det på 100 MHz. Det ser ut til å motsette meg kommentaren skjønt, så jeg lurer på om kanskje pinnen fremdeles kan beordres på den frekvensen, men det ‘ er bare at pin-kapasitansen demper slike signaler, slik at en 100 MHz firkantbølge faktisk kan svinge fra f.eks (1,0 V, 2,3 V) i stedet for full (0 V, 3,3 V) område.
Svar
Jeg har funnet dette biblioteket ( pi -blaster ) som hevder å være «ekstremt effektiv: bruker ikke CPU og gir veldig stabile pulser.»
Jeg har ikke testet den ennå, men vil oppdatere så snart jeg gjør det (sannsynligvis i dag)
Kommentarer
- Jeg ‘ har prøvd dette, men foreløpig ikke hell. Så vidt jeg kan si, bytter det ikke ‘ egentlig maskinvaren?
- Vil bare støte på dette. Pi-blaster har fungert for meg der disse andre svarene gjorde det ikke.