Fråga:
Kan jag använda GPIO för pulsbreddsmodulering (PWM)?
berry120
2012-06-14 18:47:44 UTC
view on stackexchange narkive permalink

Kan jag använda GPIO som en pulsbreddsmodulation -utgång?

Om så är fallet, hur skulle jag göra det och hur många samtidiga, distinkta PWM-utgångar kan jag har?

Du måste antagligen ange vilken modell du använder. De är alla lite annorlunda.
@user1147688 Denna fråga ställdes tillbaka när det bara fanns en modell!
Fem svar:
Mark Booth
2012-06-14 19:34:05 UTC
view on stackexchange narkive permalink

Som föreslagits av Alex Chamberlain, verkar WiringPi -biblioteket stödja både hårdvaru-PWM-utdata på en eller två GPIO-stift beroende på modell och programvara PWM på någon av de andra GPIO-stiften. Under tiden RPIO.PWM-biblioteket gör PWM av DMA på alla GPIO-stift. Effektivt är detta ett halvvägs hus mellan hårdvara och mjukvara PWM, vilket ger en 1 µs tidsupplösning jämfört med 100 µs med WiringPis programvara PWM [1] .

Vilken av dessa är lämplig för dina applikationer beror på hur många PWM-utgångar du behöver och vilken prestanda du vill ha av dessa utdata.

Om din applikation är tolerant mot lågtidsupplösning och hög jitter så kan du använda en mjukvara eller DMA-assisterad timing loop. Om du vill ha högre precision / lägre jitter PWM kan du behöva hårdvaruassistans.

När kan programvaran PWM vara lämplig?

Om du vill blinka en massa lysdioder med olika synliga människor kadenser (tiotal hertz) med mjuk realtid svarskrav, då kan programvaruslingan hantera så många PWM-enheter som du har GPIO-stift.

När kan PWM-maskinvara vara lämplig?

Om du vill styra en servomotor med hårda realtids svarskrav måste du använda hårdvarupwm. Även då kan du ha problem med att säkerställa ett realtidssvar för servoslingan som binder kodaringång till PWM-utgång.

En stabil servoslinga behöver läsa kodare med en vanlig hastighet (låg jitter), skriv ut reviderade PWM-utgångsvärden med en vanlig hastighet och latensen mellan dessa bör fixas (totalt sett låg jitter). Om du inte kan göra det måste du ställa in (mjuk inställning) din motor för att förhindra att den blir instabil under belastning. Det här är svårt att göra med ett multi-tasking-operativsystem utan stöd på låg nivå.

Vad händer om jag behöver fler PWM-utdata för maskinvara?

Om du behöver köra fler servoslingor än vad du har PWM-utgångar av hårdvara, kommer du troligtvis att behöva ladda ner dem till en annan enhet för att säkerställa hård realtidsprestanda och förvandla din Raspberry Pi till en mjuk realtid övervakare.

Ett alternativ, skulle vara något som Adafruit 16-kanals 12-bitars PWM / Servo Driver - I²C gränssnitt - PCA9685 som skulle möjliggöra du kan styra 16 PWM-utgångar med bara några stift GPIO för I²C-bussen. För ett exempel på dess användning, kolla in inlägget I²C 16 Channel PWM / Servo Breakout - Working på Raspberry Pi-forum.

1. Tack vare dm76 för förslaget säger dock heather att RPIO.PWM kanske inte längre fungerar för nyare pi-modeller.

Kan jag använda programvarans PWM-metod för att köra likströmsmotorer?
@gideon - Ja, de motorförstärkare som jag har använt har alla tagit PWM som sin ingång.
FYI, RPI-biblioteket (http://pythonhosted.org/RPIO/pwm_py.html) verkar ha en mycket bättre upplösning (1us) jämfört med WiringPi med 100us upplösning
@MarkBooth - Inga probs. Biblioteket är riktigt välskrivet och kan användas som drop-in-ersättning för RPi.GPIO vilket är väldigt praktiskt om du startade ett projekt med det senare och senare insåg att PWM-signaler behövdes ...
RPIO.PWM kanske inte längre fungerar för nyare pi-modeller, tror jag.
Alex Chamberlain
2012-06-14 19:40:48 UTC
view on stackexchange narkive permalink

Hardware PWM

Ja, det finns en PWM-maskinvaruutgång på Raspberry Pi, ansluten till P1-12 (GPIO18). Vidare kan PWM-utgångar läggas till med hjälp av ett I²C eller SPI -gränssnitt; vissa människor har haft framgång med detta ( foruminlägg).

Exempelkod

Du kan använda WiringPi-biblioteket för att kontrollera PWM-stiftet; du kan titta på koden för att undvika att inkludera hela biblioteket.

Programvara PWM

Raspberry Pi är inte lämplig för någon seriös programvaru-PWM eftersom Linux inte är ett realtidsoperativsystem .

Fråga, vad är definitionen eller ett exempel på seriös PWM-programvara? Och vad är "realtidsoperativsystem" och finns det någonsin någon chans att få en på en Pi
@AnthonyBlake Tja, du kan nog styra ljusets ljusstyrka med hjälp av programvaran PWM, men jag misstänker att en motor stannar. Det finns inget behov av att göra programvara PWM men hårdvara är enklare och effektivare. Realtidsoperativsystem kommer att förklaras bättre av Google; de garanterar vissa saker om hur länge och ofta programvara körs.
@AnthonyBlake A "Real-Time OS" (RTOS) är ett operativsystem som ger dig en garanti på den övre tidsgränsen för körning. Som att säga till programmet "Ja, du kommer att ha en viss exekveringstid på 33ms (ge eller ta 2ms tolerans) för att vända den GPIO-pin-biten för att ge din stegmotor en signal i exakt tidsfönster när han behöver det. Och du kan lita på på det!" Det finns en RT Linux där ute. Vet inte om den har överförts till RPi (ännu).
Tyvärr Alex, jag stjäl inte medvetet en annan del av ditt svar, men jag har precis märkt att vi kom till samma foruminlägg via olika rutter.
Nyare modeller med 40 stift har en andra PWM-maskinvara ansluten till GPIO19 (stift 35).
Hej! Tack för informationen, kan du uppdatera ditt inlägg för att återspegla Raspberry Pi 3? Jag kan inte hitta någon tillförlitlig dokumentation som bekräftar förekomsten av en HW PWM-stift på den enheten. Finns det 1 eller 2 eller något? Vilka stift?
joan
2015-11-06 04:46:42 UTC
view on stackexchange narkive permalink

Senaste Pis har två PWM-kanaler för hårdvara. Dessutom kan hårdvarutimade PWM-pulser genereras oberoende på alla GPIO som är anslutna till 40-stifts expansionshuvudet.

I praktiken betyder det att det finns två mycket exakta PWM-kanaler och alla andra GPIO kan ha Arduino-stil PWM (800 Hz, 0 av - 255 helt på).

t.ex. servoblaster och min pigpio, etc.

Bra svar! Hur kan jag använda dessa två HW PWM? Jag måste kontrollera 2 servor, jag vet att du säger att servoblaster och pigpio är OK för det, men jag undrar bara om HW PWM, för jag kan inte hitta något om dem ... finns det några dokument för det där ute? Jag har en RPi 2 V1.1 för test.
[C] (http://abyz.co.uk/rpi/pigpio/cif.html#gpioHardwarePWM), [Python] (http://abyz.co.uk/rpi/pigpio/python.html#hardware_PWM), [kommandorad för svin] (http://abyz.co.uk/rpi/pigpio/pigs.html#HP).
OK tack. Är servostyrningen via gpioServo () -funktionen tillförlitlig under tung CPU-belastning också eller behöver jag använda HW PWM då? Jag måste bearbeta datorns visionsstack så att alla mina CPU-kärnor kommer att vara under anständig belastning ... Vad är gpioHardwarePWM freq och arbetsvärden för den vanliga 50 Hz 1-2ms servostandarden?
Tung CPU-belastning bör inte göra någon skillnad. Tung nätverksbelastning kan göra skillnad för gpioServo, särskilt om man samplar vid 1MHz snarare än standard 200kHz. Frekvensen är 50 (Hz), intervallet för arbetscykler är 0 - 1000000 (mappas till det verkliga underliggande värdet 0 - 5000000). 1 ms är 1 ms i 20 ms så en arbetscykel på 5% så 50000, 1,5ms-> 7,5% -> 75000, 2ms-> 10% -> 100000.
Kan du skicka referenser för denna information tack. Jag menar, var är till exempel de 2 HW-drivna GPIO: erna på Rpi3?
Sida 102 av [BCM2835 ARM-kringutrustning] (http://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf) visar de olika lägena som GPIO kan tilldelas. Titta online för vilken GPIO leds ut till de olika Pi-modellens expansionshuvuden.
Tack @joan, jag tittade på det, men jag försöker hitta maxfrekvensen för PWM, som borde vara långt över 125 MHz som visas i det dokumentet. Någon nämnde 750 MHz någonstans i en sändartråd ... Dessutom kanske rubrikerna inte är uppdaterade eftersom inget datablad har släppts och ingen har bekräftat motsvarigheten till BCM2835.
@user1147688 Jag föreslår att du får någon att visa dig hur du ställer in en PWM-frekvens på 750 MHz då. Låt någon upplysa oss alla.
Jag håller med om att det är för bra för att vara sant. Så det är förmodligen ett stavfel och borde vara 750 ** kHz **. Men jag ser inte heller att det är helt omöjligt att vara 2-4 gånger 125 MHz.
@user1147688 PLLD (500MHz) används som PWM-klocka. På grund av hur "det" fungerar är PWM-kärnfrekvensen 250 MHz. För att kunna slå på och av (ganska viktigt för PWM) är maximalt 125 MHz. Du kan fördubbla siffrorna genom att använda PLLC (1000 MHz) men den PLL varierar med klockfrekvensen.
Hej @joan, Jag har sett ditt [inlägg] (http://raspberrypi.stackexchange.com/a/23277/17798). "* Med PLLC (1000 MHz) men den PLL varierar med kärnhastigheten *" är precis vad jag vill veta! Hur så? Var i kärnkällorna är det här?
@user1147688 Kan inte hjälpa till med det. Jag är inte så bekant med kärnkällstrukturen. Jag är inte ens säker på att kärnan har någon kunskap eller kontroll över PLL: erna.
John
2012-12-14 06:43:26 UTC
view on stackexchange narkive permalink

Inte riktigt ett operativsystem i realtid, men RISC OS för Raspberry Pi är samarbetsvillig multitasking, så du kan enkelt köra en applikation som har 100% CPU så att du kan hantera dina tider mycket bättre. Förvänta dig inte att göra något annat än din egen kod.

Jag läste någonstans att det också finns en hårdvarubegränsning för kopplingsfrekvensen för en utgångsstift. Jag tror att det var runt 20 MHz. Så förvänta dig inte att kunna dra 300 MHz PWM eller något sådant, inte ens med 100% CPU-användning.
@Wallacoloo: Vilka applikationer kräver 300 MHz PWM?
@PeterMortensen: Tja, jag vet inte hur radiosändare och sådant genererar sina signaler, men vissa kanske gör det med PWM. PiFM gör det vid 100 MHz. Det verkar dock motsäga min kommentar, så jag undrar om stiftet fortfarande kan styras vid den frekvensen, men det är bara att stiftkapacitansen dämpar sådana signaler, så att en 100 MHz fyrkantvåg faktiskt kan svänga från t.ex. (1,0 V, 2,3 V) istället för hela området (0 V, 3,3 V).
Glantucan
2017-01-15 17:16:23 UTC
view on stackexchange narkive permalink

Jag har hittat det här biblioteket ( pi-blaster) som påstår sig vara "extremt effektivt: använder inte CPU och ger mycket stabila pulser."

Jag har har inte testat det ännu, men kommer att uppdateras så snart jag gör (förmodligen idag)

Jag har försökt detta men hittills ingen tur. Såvitt jag kan säga byter det inte faktiskt hårdvaran?
Vill bara stöta på det här. Pi-blaster har fungerat för mig där de andra svaren inte gjorde det.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...