Lär dig hur du styr ljusstyrkan på en lysdiod som är ansluten till en Raspberry Pi med PWM.

PWM är något som vi alla använder varje dag, även om vi inte vet det. Det är en teknik som är enkel och otroligt användbar i en rad olika tillämpningar. Bäst ändå, det är något som din Raspberry Pi kan göra utan att svettas. Hur? Låt oss ta en titt.

Vad är PWM?

Som terminologi lyder, "Pulse-Width Modulation" låter ganska fancy. Men allt vi egentligen pratar om här är att stänga av och slå på en elektrisk signal igen - extremt snabbt. Varför skulle vi vilja göra detta? Helt enkelt för att det är ett väldigt enkelt sätt att simulera en variabel analog signal, utan att ta till Raspberry Pi-HATAR, tillägg, eller extra kretsar. För vissa applikationer, som att värma en kamin, driva en motor eller dämpa en lysdiod, är en PWM-signal bokstavligen omöjlig att skilja från en "riktig" analog spänning.

Arbetscykler

Så vi har en serie pulser som matas in i en last (det som vi kör). Bara detta är inte så användbart – tills vi börjar ändra (eller modulera) bredden på dessa pulser. "På"-fasen av en given på-av-period kan ta upp allt från 0–100 % av den totala cykeln. Vi kallar denna procentsats för

instagram viewer
arbetscykel.

Anta till exempel att vi har en 3V PWM-signal med en arbetscykel på 50 %. Den genomsnittliga mängden ström som går genom lysdioden skulle motsvara en alltid-på-signal på 1,5V. Vrid upp arbetscykeln och lysdioden blir ljusare; slå ner den och lysdioden dimper. Vi kan generera ljud med samma metod – det är därför ljudet ut på din Raspberry Pi kan sluta fungera om du använder PWM för andra saker.

PWM på Raspberry Pi

Du kan använda programvaran PWM på varje GPIO-stift på Raspberry Pi. Men hårdvara PWM är endast tillgänglig på GPIO12, GPIO13, GPIO18, och GPIO19.

Vad är skillnaden? Tja, om du ska använda programvara för att generera signalen, kommer du att konsumera CPU-cykler. Din CPU kanske har bättre saker att göra än att säga åt en lysdiod att stängas av och tändas flera hundra gånger per sekund. I själva verket kan det bli distraherat och fastnat av andra uppgifter, vilket allvarligt kan störa dina PWM-timinger.

Följaktligen är det ofta en bättre idé att delegera uppgiften till specialiserade kretsar. I fallet med Raspberry Pi bor den här kretsen inuti System on Chip som rymmer processorn. Hårdvaru-PWM är ofta mycket mer exakt och bekväm, och därför är det det föredragna alternativet i de flesta fall. Om du vill ha en uppfattning om vad som händer under huven i Raspberry Pi 4:s Broadcom BCM2711-chip, då kan du titta på BCM2711-dokumentationen. Kapitel 8 täcker PWM-grejer!

Dimma en LED

För att få vår LED att fungera med vår Raspberry Pi måste vi göra lite breadboarding. Det betyder två komponenter: själva lysdioden och ett strömbegränsande motstånd, som vi seriekopplar med den. Utan motståndet riskerar din LED att dö i en illaluktande rökpuff om för mycket ström passerar genom den.

Att räkna ut motståndsvärdet

Det spelar ingen roll vilken ände av lysdioden du ansluter motståndet till. Det som spelar roll är motståndets värde. Raspberry Pi 4 kan ge cirka 16 milliampere per stift. Så vi kan använd Ohms lag för att räkna ut värdet på motståndet som behövs.

Nämnda lag säger att motståndet ska vara lika med spänningen över strömmen. Vi vet spänningen som kommer ut från Pi: s GPIO-stift (3,3V), och vi vet vad strömmen ska vara (16 milliampere eller 0,016 ampere). Om vi ​​delar det förra med det senare får vi 206,25. Nu, eftersom du kommer att kämpa för att hitta motstånd av detta värde, låt oss gå för 220 ohm istället.

Anslut LED: s anod (långt ben) till GPIO 18 (som är fysisk pin 12 på Raspberry Pi). Anslut katoden (kort ben) till någon av Pi: s jordstift. Glöm inte motståndet, någonstans längs vägen. Du är nu redo att gå!

Implementering av PWM på Raspberry Pi

För att få hårdvaran PWM att fungera på Raspberry Pi kommer vi att använda rpi-hardware-pwm-bibliotek från Cameron Davidson-Pilon, anpassad från kod av Jeremy Impson. Detta har använts i Pioreaktör (en Pi-baserad bioreaktor) – men det är tillräckligt enkelt för våra syften.

Först, låt oss redigera config.txtfil, som finns i /boot katalog. Vi behöver bara lägga till en rad: dtoverlay=pwm-2chan. Om vi ​​ville använda andra GPIO-stift än 18 och 19, kan vi lägga till några ytterligare argument här. För nu, låt oss hålla saker enkla.

Starta om din Pi och kör:

lsmod | grep pwm

Det här kommandot listar alla moduler som är laddade till den centrala delen av operativsystemet, kallad kärnan. Här filtrerar vi dem för att bara hitta PWM-grejer med hjälp av grep (det är "globalt reguljärt uttryck print") kommandot.

Om pwm_bcm2835 dyker upp bland de listade modulerna, då är vi på rätt väg. Vi är nästan klara med förberedelserna! Allt som återstår är att installera själva biblioteket. Från terminalen, kör:

sudo pip3 install rpi-hardware-pwm

Vi är nu redo att börja.

Koda PWM LED-kretsen

Dags att smutsa ner händerna med lite av kodning i Python. Starta Thonny och kopiera in följande kod. Slå sedan Springa.

from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()

Allt är bra kommer du att se att LED-lampan gradvis blir ljusare tills den i räknarvariabeln når 100. Sedan stängs den av. Vad händer här? Låt oss gå igenom det.

Vi importerar den relevanta delen av hårdvaru-PWM-biblioteket (tillsammans med tid modul) och deklarerar en ny variabel. Vi kan ställa in pwm_kanal till 0 eller 1, vilket motsvarar GPIO-stiften 18 respektive 19 på Pi.

De hz värde vi kan ställa in på vilken frekvens vi vill (även om vi i slutändan är begränsade av Pi: s klockhastighet). Vid 60Hz borde vi inte se något PWM-flimmer. Men det kan vara en bra idé att börja med ett mycket lågt värde (som 10) och gradvis flytta upp saker och ting. Gör detta, och du kommer faktiskt att kunna se pulserna hända. Ta inte bara vårt ord för det!

Vi arbetar vår arbetscykel (i) upp från 0 till 100 använder en Python for loop. Det är värt att notera att vi kan ställa in tid.sömn argument till så länge vi vill – eftersom PWM hanteras i hårdvara kommer den att köras bakom kulisserna, hur länge vi än säger åt programmet att vänta.

Det finns mer att lära med PWM

Grattis! Du har skrivit ditt första PWM-program. Men som så ofta är fallet med Raspberry Pi, det finns mycket du kan göra med det här, speciellt om du utökar din Raspberry Pi med rätt PWM-HAT. Så nöj dig inte med en liten lysdiod. Du kan använda denna nya kraft för att styra motorer, koda meddelanden och generera synthesizertoner. En värld av modulering väntar!