Kan jag använda GPIO som pulsbreddsmodulation -utgång?
Om så är fallet, hur skulle jag göra det och hur många samtidiga, distinkta PWM-utgångar kan jag få?
Kommentarer
- Du måste nog ange vilken modell du ’ använder. De är alla något annorlunda.
- @ user1147688 Denna fråga ställdes tillbaka när det bara fanns en modell!
Svar
Som föreslagits av Alex Chamberlain visas WiringPi -biblioteket för att stödja både maskinvaru-PWM-utdata på en eller två GPIO-stift beroende på modell och PWM-programvara på någon av de andra GPIO-stiften. Under tiden gör RPIO.PWM-biblioteket PWM med 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 WiringPi ”s 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 för låg tidsupplösning och hög jitter kan du använda en programvaru- eller DMA-assisterad tidsslinga. Om du vill ha högre precision / PWM med lägre jitter kan du behöva hårdvaruhjälp.
När kan programvaran PWM vara lämplig?
Om du vill blinka en massa lysdioder med olika mänskliga synliga kadenser (10 tum) hertz) med mjuka realtidsansvar , då kan programvaruslingan hantera så många PWM som du har GPIO-stift.
När kan maskinvaru-PWM vara lämplig?
Om du vill styra en serv o motor med svåra realtids svarskrav då 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), skriva 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 detta måste du ställa in (mjukjustera) 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-utgångar för hårdvara?
Om du behöver köra fler servo-loopar än du har PWM-utgångar för hårdvara kommer du förmodligen att behöva ladda ner dem till en annan enhet för att säkerställa hård realtidsprestanda, att förvandla din Raspberry Pi till att vara en mjuk handledare i realtid .
Ett alternativ skulle vara ungefär som Adafruit 16-kanals 12-bitars PWM / Servo Driver – I²C-gränssnitt – PCA9685 vilket gör att 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 I²C 16 Channel PWM / Servo Breakout – Working inlägg på Raspberry Pi-forum.
1. Tack till dm76 för förslaget, dock heather säger att RPIO.PWM kanske inte längre fungerar för nyare pi-modeller.
Kommentarer
- 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 ingång.
- FYI, RPI-biblioteket ( 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.
Svar
Hårdvara PWM
Ja, det finns en hårdvara-PWM-utgå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-bibliotek för att styra 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 mjukvara PWM eftersom Linux inte är ett realtidsoperativsystem .
Kommentarer
- Fråga, vad är definitionen eller ett exempel på seriös PWM-programvara? Och vad är ” operativsystem i realtid ” 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 kommer att stanna. 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 ” OS i realtid ” (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å 33 ms (ge eller ta 2 ms tolerans) för att vända den GPIO-pin-biten för att ge din stegmotor en signal exakt tidsfönster när han behöver det. Och det kan du lita på! ” ’ finns en RT Linux där ute. Vet inte ’ om det ’ har överförts till RPi (ännu).
- Tyvärr Alex, jag stjäl ’ inte avsiktligt en annan del av ditt svar, men jag ’ har precis märkt att vi kom till samma foruminlägg via olika vägar .
- Nyare modeller med 40 stift har en andra PWM-maskinvara ansluten till GPIO19 (stift 35).
Svar
Senaste Pis har två PWM-kanaler för hårdvara. Dessutom kan maskinvarutimade PWM-pulser genereras oberoende på alla GPIO 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.
Kommentarer
- Trevligt 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 tester.
- C , Python , kommandorad för grisar .
- Tung CPU-belastning borde inte ’ t göra en 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.
- Sida 102 av BCM2835 ARM-kringutrustning visar de olika lägen som GPIO kan tilldelas. Titta online för vilka GPIO som leds ut till de olika Pi-modellens expansionshuvuden.
- @ user1147688 PLLD (500MHz) används som kärnan i PWM-klockan. Pga att sättet ” 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 klockhastigheten.
Svar
Inte riktigt ett operativsystem i realtid, men RISC OS för Raspberry Pi är samarbetsvillig multitasking, så du kan enkelt köra ett program som har 100% CPU så du kan hantera dina tider mycket bättre. Bara inte förvänta dig att göra något annat än din egen kod.
Kommentarer
- Jag läste någonstans att det finns en hårdvarubegränsning när det gäller byte frekvensen för en utgångsstift också. Jag tror att det var cirka 20 MHz. Så ’ t förväntar dig att kunna dra av 300 MHz PWM eller något av det slaget, även med 100 % CPU-användning.
- @Wallacoloo: Vilka applikationer kräver 300 MHz PWM?
- @PeterMortensen: Jag vet inte ’ vet inte hur radio sä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 kommanderas 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 full (0 V, 3,3 V) räckvidd.
Svar
Jag har hittat det här biblioteket ( pi -blaster ) som påstår sig vara ”extremt effektiv: använder inte CPU och ger mycket stabila pulser.”
Jag har inte testat den ännu, men kommer att uppdateras så snart jag gör (förmodligen idag)
Kommentarer
- Jag ’ har försökt detta men hittills ingen tur. Såvitt jag kan säga byter det inte ’ egentligen hårdvaran?
- Vill bara stöta på det här. Pi-blaster har fungerat för mig där dessa andra svar gjorde det inte.