← Kursens material Motordrivare och PWM · område 5 Område 5

Område 5 · lektion 26

Motordrivare och PWM

Med en transistor kan motorn gå eller stå still, åt ett håll. Den här guiden lägger till de två saker som gör den användbar: riktning, genom fyra transistorer kopplade som en H-brygga, och hastighet, genom att slå på och av matningen hundratals gånger i sekunden. Det andra är det som förvirrar mest, för analogWrite() heter fel: den lämnar ingen analog spänning.

Mål

Genomgång

H-bryggan: fyra brytare kring en motor

En likströmsmotor byter riktning när du byter polaritet på den. Det går att göra med händerna genom att kasta om två sladdar, men det ska koden kunna göra. Kopplingen som löser det heter H-brygga, efter hur den ser ut på ett schema: fyra brytare kring motorn, som bildar bokstaven H.

Schema över en H-brygga. En vågrät ledning högst upp är märkt plus VM och en vågrät ledning längst ned går till en jordsymbol. Mellan dem går två lodräta grenar. I den vänstra grenen sitter brytaren S1 upptill och S3 nedtill, i den högra brytaren S2 upptill och S4 nedtill. Mitt emellan grenarna sitter motorn M1, ritad som en cirkel med bokstaven M, kopplad vågrätt från en punkt mitt på vänstra grenen till en punkt mitt på högra grenen. +VM S1 S3 S2 S4 M M1

S1 och S3 får aldrig slutas samtidigt Då går det en rak väg från plus till jord, förbi motorn. Kortslutningen förstör bryggan på bråkdelen av en sekund. Det är skälet till att en färdig drivkrets inte har fyra separata insignaler utan två per motor: elektroniken inuti chippet gör den kombinationen omöjlig åt dig. Bygger du en H-brygga av lösa transistorer är det däremot ditt ansvar, och det är ett av flera skäl att inte göra det i den här kursen.

Broms eller frihjul — två olika sätt att stanna

Det här är en skillnad som syns direkt i ett bygge och som förvånar första gången. Ett tåg som ska stanna på ett streck och en kran som ska släppa ned en last mjukt vill ha olika saker.

LägeVad som händerPassar när
BromsLindningen kortsluts, rörelsen bromsar sig själv. Motorn står nästan direktMekanismen ska stanna där den är, eller inte glida tillbaka
FrihjulLindningen kopplas bort. Motorn rullar ut på sin egen rörelseenergiStoppet ska bli mjukt, eller mekanismen ska gå att vrida för hand

Två drivkretsar, och vad de kostar i spänning

De två moduler du med störst sannolikhet möter är L298N och TB6612FNG. De gör samma sak och kopplas nästan likadant, men de är byggda med olika sorters transistorer, och det syns i ett enda tal: spänningsfallet över utgångssteget.

L298NTB6612FNG
UtgångsstegBipolära darlingtontransistorerMOSFET
Spänningsfall över brygganTypiskt 2–3 V vid 1 A, mer vid högre ström, och upp mot 5 V på ett dåligt exemplarOmkring 0,5 Ω totalt, alltså 0,5 V vid 1 A
Ström per motorUpp till 2 A1,2 A kontinuerligt, 3,2 A kortvarigt
Matningsspänning till motornUpp till 46 V2,5 till 13,5 V
FrihjulsdioderKrävs externt. Modulkortet har dem monteradeInbyggda i chippet
KylningKylfläns behövs. Chippet blir varmtBehövs normalt inte i vår storleksordning

Talen ovan är hämtade ur databladen och ska kontrolleras mot ditt eget. Modulerna säljs i många varianter, och särskilt L298N-kortens spänningsfall varierar med ström och temperatur.

Räknat exempel: vad motorn faktiskt får. Matning 6,0 V, motorn drar 1 A. Med en L298N:

Umotor = 6,0 − 2,5 = 3,5 V

2,5 / 6,0 = 0,42 = 42 % av matningen försvinner i drivkretsen

Effekten som blir värme i chippet:

P = U · I = 2,5 V · 1 A = 2,5 W

Motorn får

P = 3,5 V · 1 A = 3,5 W

så drivsteget har verkningsgraden

3,5 / 6,0 = 0,58 = 58 %

Fyra tiondelar av batteriet går alltså åt att värma en kylfläns. Med en TB6612FNG, där fallet är resistivt:

U = R · I = 0,5 Ω · 1 A = 0,5 V

Umotor = 6,0 − 0,5 = 5,5 V

P = I² · R = 1² · 0,5 = 0,5 W i chippet

Motorn får då

5,5 / 3,5 = 1,57, alltså över 50 % mer spänning

av exakt samma batteri, och drivkretsen värms med en femtedel så mycket. Det är hela skälet till att den äldre L298N håller på att försvinna ur nya konstruktioner.

Räkna in fallet när du väljer batteri En motor märkt 6 V bakom en L298N behöver en matning på ungefär 6 + 2,5 = 8,5 V för att få sina sex volt — och marginal uppåt, eftersom fallet varierar mellan exemplar. Sex alkaliska AA-celler i serie ger 6 · 1,5 = 9,0 V, alltså 9,0 − 2,5 = 6,5 V till motorn med ett typiskt fall men bara 9,0 − 5,0 = 4,0 V med ett dåligt. Bakom en TB6612 räcker fyra celler: 4 · 1,5 = 6,0 V och 6,0 − 0,5 = 5,5 V till motorn, och spridningen mellan exemplar är dessutom mycket mindre. Två batterier mindre att bära, och ett tal du kan lita på. Laddningsbara NiMH-celler ger 1,2 V styck, alltså 4 · 1,2 = 4,8 V, och då märks fallet ännu mer.

Sanningstabellen — läs din egen

Båda kretsarna styrs med två riktningssignaler och en hastighetssignal per motor. Namnen skiljer sig, och det gör beteendet också i ett av lägena. Här är TB6612FNG, med STBY hög:

AIN1AIN2PWMAMotorn
HIGHLOWpulsGår åt ena hållet, med farten som pulsen ger
LOWHIGHpulsGår åt andra hållet
HIGHHIGHvad som helstBroms
HIGH eller LOWtvärtomLOWBroms
LOWLOWHIGHFrihjul

Och här är en L298N-modul, där hastighetssignalen heter ENA:

IN1IN2ENAMotorn
HIGHLOWpulsGår åt ena hållet
LOWHIGHpulsGår åt andra hållet
likalikaHIGHBroms
vad som helstvad som helstLOWFrihjul

Jämför de två sista raderna i tabellerna. Kombinationen "båda riktningssignalerna låga" ger frihjul på en TB6612 — så länge PWM-signalen är hög, annars bromsar den — och broms på en L298N. Samma kod, två chip, två olika beteenden — och skillnaden syns bara när mekanismen ska stanna. Det är precis den sortens detalj som står i databladet och ingen annanstans, och att hitta den där är ett belägg för F2. Skriv in din egen tabell i dokumentationen, med chipets beteckning ovanför.

PWM: analogWrite lämnar ingen analog spänning

Funktionen ser ut som motsatsen till analogRead, och det är den inte. analogRead mäter en verklig spänning. analogWrite slår i stället pinnen på och av mycket snabbt, och det du styr är hur stor andel av tiden den är på. Andelen heter pulsförhållande eller pulskvot.

analogWrite(pin, varde) där varde går från 0 till 255. Värdet 0 betyder alltid av, 255 alltid på, och däremellan är

pulsförhållande ≈ varde / 255

Medelspänningen över motorn blir pulsförhållandet gånger den spänning som faktiskt ligger på — alltså matningen minus drivkretsens fall.

Räknat exempel. En TB6612 på 6,0 V matning ger 5,5 V ut när den är på. Med analogWrite(PWM_PIN, 128):

128 / 255 = 0,502 = 50,2 %

Umedel = 0,502 · 5,5 V = 2,76 V

Med värdet 200:

200 / 255 = 0,784 = 78,4 %

Umedel = 0,784 · 5,5 V = 4,31 V

Och med värdet 64:

64 / 255 = 0,251 = 25,1 %

Umedel = 0,251 · 5,5 V = 1,38 V

Men motorn ser aldrig 2,76 V. Den ser 5,5 V i lite drygt halva tiden och 0 V i resten. Att medelvärdet blir 2,76 V är en räkning, och den stämmer med vad en multimeter i likspänningsläge visar — instrumentet medelvärdesbildar nämligen också. Det är två olika påståenden, och skillnaden mellan dem är hela poängen med PWM: en transistor som är antingen helt på eller helt av blir aldrig varm, medan ett motstånd som sänker spänningen till hälften gör sig av med lika mycket effekt som motorn får.

Var 490 och 980 hertz kommer ifrån

Talen ser godtyckliga ut men går att räkna fram, och räkningen är värd att göra en gång. Uno-kortets klocka går på 16 MHz, alltså 16 000 000 gånger i sekunden. Kortets timrar delar ned den med 64 innan de räknar:

16 000 000 / 64 = 250 000 räknesteg i sekunden

Pinne 5 och 6 räknar 0 till 255 och börjar om, alltså 256 steg per period:

250 000 / 256 = 976,6 Hz ≈ 980 Hz

De övriga PWM-pinnarna räknar upp och ned igen, alltså 510 steg per period:

250 000 / 510 = 490,2 Hz ≈ 490 Hz

Pinnar med PWM på UnoFrekvensPeriodtid
5 och 6omkring 980 Hz1 / 980 = 0,00102 s = 1,02 ms
3, 9, 10 och 11omkring 490 Hz1 / 490 = 0,00204 s = 2,04 ms

Andra pinnar än de sex har ingen PWM alls. analogWrite på en av dem ger bara HIGH över 127 och LOW under, och det är ett tyst fel som ser ut som en trasig motor.

Servo och PWM slåss om pinne 9 och 10 Det här stod redan i servoguiden och blir konkret först nu. Servo-biblioteket tar kortets Timer1 i anspråk, och det är samma timer som ger PWM på pinne 9 och 10. Så länge ett servo är anslutet — även om det sitter på en helt annan pinne — fungerar inte analogWrite() på D9 och D10. Bygge 4 kan mycket väl innehålla både ett servo och en motor. Lägg då motorns PWM-signal på 3, 5, 6 eller 11. Symtomet annars är en motor som bara går för fullt eller inte alls, med kod som ser helt riktig ut.

En sak till om pinne 5 och 6: de sköts av samma timer som millis(). Att använda analogWrite på dem stör inte tidmätningen — timern räknar vidare precis som förut, och det är bara jämförelsevärdet som ändras. Påståendet att man inte får blanda dem dyker upp ibland och stämmer inte.

Varför motorn inte hackar, och varför den inte startar på låg puls

Vid 490 Hz slås matningen av och på 490 gånger i sekunden. Att motorn ändå går jämnt beror på två sorters tröghet.

Det finns ett lägsta pulsförhållande som gör något alls. Under det står motorn still och surrar, eftersom medelmomentet inte räcker för att bryta vilofriktionen i lager och växlar. Var gränsen ligger beror på din motor och din mekanik — storleksordningen är 25 till 40 procent på en liten växelmotor, och du ska mäta din egen. Är gränsen 90 av 255 är

90 / 255 = 0,353 = 35,3 %

ditt lägsta användbara värde, och allt under det är slöseri med rader i koden. Ett vanligt knep är att låta koden hoppa direkt från 0 till det värdet i stället för att kliva sig upp genom ett område där ingenting händer.

Strömförsörjning och brownout

Brownout förklarades i servoguiden, och den förklaringen gäller ordagrant här. Symtomen är desamma: seriemonitorn tappar förbindelsen och börjar om, lysdioder blinkar till i takt med rörelsen, programmet ser ut att starta om. Det gör det också — men inte för att koden är fel, utan för att matningen dyker. Testet är detsamma: ta bort lasten. Försvinner felet var det aldrig i koden.

Tre saker är nya när det är en motor och inte ett servo.

Gemensam nolla är det vanligaste felet i hela området Utan en gemensam GND har drivkretsens insignaler ingenting att mäta sina 5 V mot. Symtomet är ingenting alls, eller något som fungerar ryckigt och slumpmässigt och blir bättre när du råkar hålla i sladden. Det ser ut som ett glapp eller ett kodfel och är ingetdera. En sladd mellan batteriets minuspol och kortets GND löser det, och den ska ritas ut i schemat — annars finns den inte när någon annan bygger efter din ritning.

Ett bra sätt att mäta problemet i stället för att gissa: sätt multimetern över batteriet medan motorn startar. Sjunker spänningen från 6,0 V till under 4,5 V i startögonblicket är batteriet, och inte koden, det du ska arbeta med. Alkaliska AA-celler har relativt hög inre resistans; laddningsbara NiMH-celler och ett litet blybatteri klarar strömryck betydligt bättre.

Koden, i sin minsta form

Tre pinnar per motor: två riktningar och en fart. Här på en TB6612, med STBY på en fjärde pinne.

const int IN1_PIN  = 7;    // riktning A
const int IN2_PIN  = 8;    // riktning B
const int PWM_PIN  = 5;    // fart. Pinne 5: 980 Hz, och inte upptagen av Servo
const int STBY_PIN = 4;    // hog = drivkretsen vaken

void setup() {
  pinMode(IN1_PIN,  OUTPUT);
  pinMode(IN2_PIN,  OUTPUT);
  pinMode(PWM_PIN,  OUTPUT);
  pinMode(STBY_PIN, OUTPUT);

  digitalWrite(STBY_PIN, HIGH);
  analogWrite(PWM_PIN, 0);          // sakert utgangslage: motorn star still
}

void loop() {
  digitalWrite(IN1_PIN, HIGH);      // framat
  digitalWrite(IN2_PIN, LOW);
  analogWrite(PWM_PIN, 180);        // 180 / 255 = 70,6 procent
}

Två saker i den koden är viktigare än de ser ut. Den första är att setup() sätter farten till 0 innan någonting annat händer — ett bygge som rusar i väg i det ögonblick du sätter i strömmen är farligt och svårt att felsöka. Den andra är att riktningen sätts med digitalWrite och farten med analogWrite: det är två skilda beslut, och de ska stå på skilda rader.

Byt riktning gör du genom att kasta om de två raderna. Men gör det aldrig medan motorn snurrar för fullt — det är ungefär som att lägga i backen i full fart. Stanna först, vänta en kort stund, och starta åt andra hållet. Väntetiden ska mätas med millis() och en tidsstämpel, som i område 3, inte med delay().

I industrin och i vardagen

I industrin: en eldriven lagertruck har körmotorer på 24 V som kan dra 100 A när den drar i väg med last. Bryggan som styr dem är byggd av MOSFET:ar med en kanalresistans på storleksordningen 2 mΩ, alltså 0,002 Ω. Strömmen går genom två transistorer på vägen, så fallet över hela bryggan blir

2 · 0,002 Ω · 100 A = 0,4 V

P = 0,4 V · 100 A = 40 W

Fyrtio watt värme, vilket redan kräver en rejäl kylplåt. Hade samma brygga varit byggd med darlingtontransistorer och deras fasta fall på ungefär 2 V hade det blivit

P = 2,0 V · 100 A = 200 W

alltså 160 W mer, som måste tas ur samma batteri:

160 W / 24 V = 6,7 A extra ur batteriet, hela tiden

Det är därför truckens drivsteg är byggt precis som din TB6612, fast större — samma resonemang, tusen gånger strömmen. Switchfrekvensen väljs dessutom medvetet till 16–20 kHz, i eller strax ovanför övre kanten av vad ett ungt öra hör: en truck som visslar hela arbetsdagen är en arbetsmiljöfråga, och högre frekvens än så kostar mer i switchförluster utan att ge något.

I vardagen: fläkten över processorn i en dator har fyra sladdar, och den fjärde är en PWM-signal. Standarden ligger på omkring 25 kHz, alltså en periodtid på

1 / 25 000 = 0,00004 s = 40 µs

Frekvensen är vald av exakt samma skäl som truckens: under ungefär 20 kHz hörs pulsandet som ett tjut, och en dator på ett skrivbord får inte tjuta. Två saker till är värda att notera. PWM-signalen går inte ut i motorns lindning utan in i fläktens egen lilla styrelektronik, som läser den som ett önskemål om varvtal — precis som servots pulser i område 2 är ett önskemål om vinkel, inte en matning. Och den tredje sladden går åt andra hållet: den lämnar två pulser per varv tillbaka till datorn. En fläkt som går 1 200 varv per minut ger alltså

1 200 / 60 · 2 = 20 · 2 = 40 pulser i sekunden

vilket datorn räknar och jämför med vad den bad om. Där sitter hela kedjan sensor → styrenhet → aktuator i en pryl för hundra kronor, och den kan dessutom larma när fläkten kärvar — eftersom varvtalet då sjunker medan begäran är oförändrad.

Prova själv

  1. Koppla in drivkretsen utan mekanik. Motorn fri i luften, egen matning till motorn, gemensam GND. Kör exempelkoden ovan och kontrollera att motorn går åt det håll du väntade dig. Gör den inte det byter du de två riktningsraderna — det är rätt sätt, inte att vända sladdarna.
  2. Gå igenom alla fyra lägen. Framåt, bakåt, broms, frihjul. Snurra axeln med fingrarna i bromsläget och i frihjulsläget och känn skillnaden. Skriv ned vilken kombination som gav vad — det är din egen sanningstabell, och den ska in i dokumentationen.
  3. Mät medelspänningen. Multimetern i likspänningsläge rakt över motorn. Skriv ut ett värde i taget: 64, 128, 192, 255. Jämför med varde / 255 gånger den spänning du mätte vid 255. Gör en tabell med fyra rader — beräknat mot uppmätt, precis som i bygge 0.
  4. Hitta ditt lägsta pulsförhållande. Kör från 0 uppåt i steg om 10 tills axeln börjar röra sig, med den mekanik du tänker använda. Anteckna värdet och räkna om det till procent. Gör om samma sak efter att du monterat lasten — talet blir högre, och det är en av de mätningar som gör dokumentationen bra.
  5. Lyssna på frekvensen. Kör motorn på ungefär halv fart med PWM på pinne 9 och sedan på pinne 5. Hör du skillnad mellan 490 och 980 Hz? Tonen kommer från lindningen som rör sig i takt med pulserna.
  6. Mät matningen under start. Multimetern över batteriet, motorn med last. Läs av precis när den drar i väg. Hur mycket sjunker spänningen? Om kortet startar om har du nu ett mätvärde i stället för en gissning.
  7. Prova felet med flit. Slå först av motorns matning, lyft bort GND-sladden mellan batteriets minuspol och kortet, och slå på igen. Se vad som händer, och sätt tillbaka sladden inom någon sekund. Ordningen spelar roll: lyfter du nollan medan motormatningen är på får styrsignalerna sin återväg genom drivkretsens ingångsskydd, och det är inte den vägen de är byggda för. Nu känner du igen symtomet nästa gång det uppstår av misstag klockan nio på kvällen.

Kontrollfrågor

Din matning är 7,2 V och drivkretsen är en L298N. Vad får motorn, och hur mycket effekt blir värme i chippet vid 0,8 A?

Umotor = 7,2 − 2,5 = 4,7 V. Värmen i chippet blir P = 2,5 V · 0,8 A = 2,0 W, och motorn får 4,7 · 0,8 = 3,76 W. Drivsteget har alltså verkningsgraden 4,7 / 7,2 = 0,65 = 65 %. En kylfläns behövs.

Vad blir medelspänningen över motorn vid analogWrite(PWM_PIN, 100) om det ligger 5,5 V på när pulsen är hög?

100 / 255 = 0,392 = 39,2 % och 0,392 · 5,5 = 2,16 V. Men motorn ser inte 2,16 V — den ser 5,5 V i knappt fyra tiondelar av tiden och 0 V i resten. 2,16 V är medelvärdet, och det är också vad en multimeter i likspänningsläge visar.

Varför blir en transistor som pulsar mycket kallare än ett motstånd som sänker spänningen lika mycket?

Effekt är spänning gånger ström. En transistor som är helt på har nästan ingen spänning över sig, och en som är helt av har ingen ström genom sig — i båda lägena blir produkten nästan noll. Ett motstånd som halverar spänningen har däremot halva spänningen över sig och hela strömmen genom sig hela tiden, och gör sig alltså av med lika mycket effekt som motorn får.

Motorn på pinne 9 går bara för fullt eller inte alls, fast koden skriver 120. Vad är fel?

Ett servo är anslutet någonstans i bygget. Servo-biblioteket tar Timer1, som är samma timer som ger PWM på pinne 9 och 10, och då blir analogWrite där bara HIGH eller LOW. Flytta motorns PWM till 3, 5, 6 eller 11.

Varför skiljer sig frekvensen mellan pinne 5 och pinne 9?

De sköts av olika timrar som räknar på olika sätt. Båda får 250 000 räknesteg i sekunden ur klockan, men pinne 5 räknar 256 steg per period och ger 250 000 / 256 = 977 Hz, medan pinne 9 räknar upp och ned igen, alltså 510 steg, och ger 250 000 / 510 = 490 Hz.

Bygget fungerar när kortet sitter i datorn men inte när det körs på batteri, och tvärtom fungerar motorn ibland utan att koden ändrats. Vad letar du efter först?

Den gemensamma nollan. Så länge datorn är inkopplad kan det finnas en oavsiktlig jordförbindelse via USB-kabeln som döljer att din egen GND-sladd saknas. Dra en riktig sladd mellan batteriets minuspol, drivkretsens GND och kortets GND, och rita in den i schemat.

Vad är skillnaden på broms och frihjul, och när vill du ha vilket?

Broms kortsluter lindningen, så att motorns egen rörelse driver en ström som motverkar rörelsen. Mekanismen stannar nästan direkt och står emot att vridas. Frihjul kopplar bort lindningen, och mekanismen rullar ut. Broms vill du ha när något ska stanna på ett bestämt ställe eller inte glida tillbaka; frihjul när stoppet ska bli mjukt eller mekanismen ska gå att flytta för hand.

Vanliga fel

Vidare

analogWrite() är ett funktionsanrop, inte en ny språkkonstruktion, så inget nytt kapitel i språkreferensen öppnar här. De två som blir aktuella igen är Tid — för väntan mellan riktningsbyten och för mjukstart utan delay() — och Villkor, för de beslut som avgör riktning och fart.

Nästa guide är Utväxling och kraft. Där lämnar vi elektroniken och tar tillbaka mekaniken från din tidigare kurs: kugghjul, moment och varvtal, och hur du väljer en utväxling så att motorn orkar det du tänkt. Där kravställs också bygge 4.

Två veckor till nästa pass Mellan den här lektionen och nästa ligger påsklovet, alltså två veckor. Det är gott om tid att koppla drivkretsen, mäta ditt lägsta pulsförhållande och leta fram kugghjul eller remskivor — och kort om tid om du börjar veckan innan bygget. Kravlistan för bygge 4 kommer först nästa pass, men de tre mätningarna i Prova själv kan du göra nu.