17 oktober 2015

Motoren en H-bruggen - deel 2



Snelheidsregeling

De snelheid waarmee de motor draait, is afhankelijk van de stroom, die erdoorheen loopt. Of liever gezegd, de gemiddelde stroom. Als je de schakelaars snel genoeg open en dicht doen, lijkt de motor gewoon door te draaien in plaats van te starten, te stoppen, enzovoort. Door de verhouding van het "open" en "dicht" te veranderen kunnen we de gemiddelde stroom, en dus de snelheid, regelen.


Pulse Width Modulation

Dit heet Puls Breedte Modulatie. Uiteraard wordt de Engelse term, Pulse Width Modulation, vaker gebruikt, en is de afkorting, PWM, ook in het Nederlands gebruikelijk.


Duty Cycle

In bovenstaand plaatje worden periode en pulsbreedte genoemd. Als de verhouding van pulsbreedte en periode toeneemt, dan neemt ook de (gemiddelde) toegevoerde energie toe. Zo is de gemiddelde waarde laag als de pulsbreedte klein is in vergelijk met de periode.
Deze verhouding heet duty cycle (in correct Nederlands "arbeidscyclus") en wordt gewoonlijk in procenten uitgedrukt.
Zo is bij een duty cycle van 50% de pulsbreedte de helft van van de periode.


Schakelen

De schakelaars uit de vorige entry worden MOSFETs, de elektronische tegenhanger van een schakelaar, die ook nog eens snel schakelt en (relatief) grote stromen kan verwerken. Een H-brug ziet er dan als volgt uit:

Dit is te vereenvoudigen tot onderstaand, waarbij slechts twee stuursignalen gebruikt worden:
Toch is dit geen goede schakeling; een wisselend signaal (PWM!) laat weliswaar de MOSFET snel in geleiding gaan, maar een MOSFET heeft capaciteit; hij zal dus niet snel uit geleiding gaan.
Gedurende een korte periode zullen zowel T3 als T5 geleiden: een volledige kortsluiting!
Dit valt wel te voorkomen, bijvoorbeeld door een comparator in te bouwen (dit is een ontwerp van OddBot, die niet langer actief is op letsmakerobots, but credit's due where credit's due):
De schakeling bestaat uit de LM339, een viervoudige comparator en weerstandsbruggen. Er zijn twee weerstandsbruggen actief; R15/R16/R17 en R13/R14/R5/R6. Voor mij niet bruikbaar, want twee ingangssignalen. Hier worden de low-side zowel als de high-side aangestuurd. Er is nogal wat discussie gaande over dit onderwerp, zie hier (en kijk dan ook even naar YT, hier!)


Low-side, high-side

Ik heb P-channel MOSFETs (IRF9540N) liggen, en N-channel MOSFETs (IRFZ44N). N-channel MOSFETs zitten in de low side, omdat de spanning op de gate hoger moet zijn dan de source om te geleiden.
Bij P-channel MOSFETs is dat andersom: de spanning op de gate moet lager zijn dan de source om te gaan geleiden. Deze zul je dus makkelijker in de high side inzetten.


RDS(ON)

Een ander fenomeen is de weerstand van de Drain-Source overgang bij geleiding, of te wel de RDS(ON). Deze is bij P-channel MOSFETs hoger dan bij N-channel MOSFETs. Heeft iets van doen met de bouwwijze.
Zo heeft de IRFZ44N een RDS(ON) van 0,0175 Ω en de IRF9540N een van 0,117 Ω. Dat is dus ruim zes keer zoveel! Aangezien belasting vooral tijdens het schakelen naar voren komt, is het het beste om de P-channel MOSFET zo min mogelijk te schakelen. Of helemaal niet.


Half bridge

Wat er dan nodig is, is een stuursignaal op de high-side, dat aangeeft welke kant de motor op moet draaien. Of de A-side high side geleidt continue, en de B-side low side wordt gepulst, of de B-side high side geleidt, en de A-side low side wordt gepulst.
Aangezien eigenlijk alleen de onderste helft van de brug (de low side) aangestuurd wordt met een PWM signaal heet dit soort schakeling een half bridge sturing. Er zijn veel half bridge stuur IC's te koop, maar het kan ook met wat simpele logic IC's.

Eisen

Uiteindelijk hebben alle bovenstaande overwegingen geleid tot het volgende lijstje met eisen voor mijn Electronic Speed Controller (ESC):
  • fool proof (dwz onmogelijk kortsluiting te veroorzaken, motor altijd gecontroleerd)
  • efficiënt
  • Drie aansluitingen: Enable, Richting, PWM.
Na lang plussen en minnen is dit het idee:

12 oktober 2015

Motoren en H-bruggen

H-Brug

Om een motor links- of rechtsom te kunnen laten draaien, wordt een H-brug gebruikt. Een H-brug dankt zijn naam aan zijn vorm:
De vier schakelaars zitten in de "poten" van de H, de motor vormt het bruggetje.
Met behulp van de vier schakelaars is het mogelijk om de motor zowel links- als rechtsom te laten draaien. Het rechtsom draaien kan door de schakelaars S1 en S4 te sluiten:
Linksom gaat op eenzelfde manier: sluit S2 en S3 in plaats van S1 en S4:
Uiteraard mogen telkens slechts twee schakelaars tegelijk gesloten worden. Als bijvoorbeeld S1 en S3 (of S2 en S4) tegelijk gesloten zijn, dan is er kortsluiting: de positieve kant van de accu is direct verbonden met de negatieve!


De zijden van de H-brug

A en B kant (A-side, B-side)

Om in gesprekken duidelijk te kunnen maken over welk deel van de H-brug gesproken wordt, heten het linker- en rechterdeel de A-zijde (A-side), respectievelijk de B-zijde (B-side):
Schakelaars S1 en S3 horen dus bij de A-zijde, S2 en S4 horen bij de B-zijde.


Hoge en lage kant (High side, Low side)

Natuurlijk zijn er dan ook horizontaal scheidingen te maken; zo is er een "High side" (dat wat het dichtst bij de voedingsspanning zit) en is er een "Low side"(het deel, dat het dichtst bij de min, of grond (Ground of GND) zit):

De oude doos

Onderstaand schema komt echt wel uit de oude doos. Het is door mij getekend in 1980; de NE544 (IC1) was erg nieuw en ik heb bij Philips de datasheets opgevraagd (en gekregen).
De H-brug is te herkennen als T3, T4, T5 en T6. T1 en T2 zijn driver transistoren (BC549C), terwijl T3...T6 darlingtons zijn (TIP140/145):
En dit was dan het resultaat!

06 oktober 2015

Tutorial 3 - Analoge inputs deel 2

Potentiometer

Het vorige experiment kan in plaats van een LDR natuurlijk ook een potentiometer gebruiken. Elektrisch gezien is er geen verschil, alleen de "bediening" is anders. Bij een LDR zorgt de hoeveelheid licht voor de weerstandswaarde, bij een potmeter de positie van een loper op een weerstandsbaan. Deze positie (en daarmee de weerstandswaarde) wordt middels draaiing of heen- en weer schuiven bereikt. Sluit de gele draad niet langer aan op de "LDR" connector, maar op de "POT". Het programma blijft hetzelfde.


Temperatuur

Het volgende experiment is eenvoudig: het de bedoeling, dat de temperatuur uitgelezen wordt. Verwijder hiervoor de rode en groene draden van het vorige experiment (die van C.0 en C.4 naar de rode en groene LED), en verhuis de gele draad van de uitgangsconnector "LDR" naar "TMP". Zie onder:

Temperatuur uitlezen wordt gedaan middels het readtemp commando. Dit commando leest de temperatuur van een DS18B20 temperatuursensor uit in hele graden Celsius. Er zit zo'n sensor op het AXE091 bordje (op bovenstaande foto: links boven, met de aanduiding DS18B20 links naast het device zelf), maar hij is ook omhuld, met een draad te krijgen:

Vervolgens is het natuurlijk aardig om te weten hoe hoog de temperatuur is. Dit kan met het sertxd commando (sertxd = serial transmit data). In de Programming Editor zit een terminal programma ingebouwd (F8, of PICAXE, Terminal uit het menu). Stel dat in op een Baud Rate van 4800.


Programma

Het programma is al even simpel als de opzet:
; connect C.1 (physical pin 6) to TMP symbol TMP = C.1 ; define pin 6 with the name "TMP" ; set picaxe type #picaxe 08m2 main: readtemp TMP,b0 ; read ADC1 into variable b0 ; if you want a real time feedback of the actual vaules, use ; debug b0 sertxd("Gelezen temperatuur: ", #b0, cr, lf) pause 1000 goto main ; jump back to start

Uitvoer

Deze keer geen video, maar een schermdump van het terminal programma. Hierin is het effect te zien van het aanraken van de DS18B20:
Jawel; ik heb warme vingers ;)

05 oktober 2015

Achtergrond: resolutie of oplossend vermogen.

Resolutie van A/D converter

In de eerste entry over analoge invoer werd in het programma het volgende commentaar gemaakt:
; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point
Hoezo, moet het tripping point "natuurlijk 127 zijn"?
Dat heeft alles te maken met het gebruikte commando. In het programma werd de volgende opdracht gebruikt:
readadc LDR,b0 ; read ADC1 into variable b0
In de documentatie (handboek 2, sectie 2, pagina 170) wordt al gemeld, dat readadc een 8 bits nauwkeurige waarde aflevert in een variabele. Dat deze variabele ook nog eens als BYTE (b0-b27) gedefinieerd is, zegt genoeg. Meer dan 256 mogelijkheden (2 tot de achtste) zijn er niet.


Dat is niet genoeg!

De configuratie van het experimenteerbord is zodanig van opzet, dat de maximale waarde, die door de ADC ingelezen kan worden, gelijkstaat aan de voedingsspanning (zeg: 5 Volt). Dat betekent een resolutie van 5/256 = 0,01953 Volt.
Maar het kan beter! In de PICAXE-08M2 is namelijk een 10 bits ADC aanwezig. Het commando, dat gebruikt oet worden is dan:
readadc10 LDR,w0 ; read ADC1 into variable w0
De gelezen waarde wordt opgeslagen in een WORD type variabele van 16 bits; de waarde kan dan tussen 0 en 65536 liggen, een betekent dan een resolutie van 0,0000763 Volt (afgerond).


Meer van dat

Er zijn meer commando's, die een "hi-res" broertje hebben:
readdac - readdac10 readtemp - readtemp12 ; readtemp = readtemp12, omgezet naar hele graden Celcius. touch - touch16 ; touch = touch16, omgezet naar 8 bits

Achtergrond: Input en output (PICAXE-08M2)

Input en output definiëren

Bij opstarten configureert de PICAXE-08M2 alle pins als input (met uitzondering van pin0/C.0, dat is altijd output). Pas als een commando gegeven wordt, kan de functie wijzigen naar output. In de vorige post werd gesteld:
C0 gaat als output werken, en bestuurt de groene LED (groene draad)
C1 gaat als input werken, en vraagt de LDR uit (gele draad)

Maar hoe regel je dat nu? Het blijkt, dat er drie manieren zijn om dat te voor elkaar te krijgen:
  1. Het juiste type commando gebruiken
  2. Het input of output commando gebruiken
  3. Het let dirs commando gebruiken
Let op: Pins C.0 en C.3 kunnen niet worden gewijzigd, deze zijn altijd output, respectievelijk input.


Het juiste type commando

Zodra er een "input-type" commando gebruikt wordt, configureert de microcontroller de desbetreffende pin als input. Voorbeelden van "input-type" commando's zijn:
  • count C.2, 100, b0
  • pulsin C.5, 1, w1
  • serin C.0, N2400, b3
  • readadc C.1, b0
De PICAXE chips configureren de correcte pin automatisch als input, en dat blijven ze dan ook.

Het zelfde geldt voor "output-type" commando's. Als zo'n commando gebruikt wordt voor een pin, dan wordt deze pin tot output verklaard, en blijft dat ook (als die pin dat aankan, natuurlijk).
Voorbeelden van output commando's zijn
  • high C.4
  • low C.4
  • toggle C.4
  • serout C.2,N2400,("Hello World")
  • sound C.1,(1,40)

Het input/output commando

Gebruik van het input commando definieert een pin expliciet als input. Voorbeeld:
Input C.0
Een beetje overbodig, want direct bij power-up zijn alle pins immers als input geschakeld. Het output commando wordt dan ook vaker gebruikt.


Het let dirs commando

Het "let dirs" commando is bedoeld om alle pins ineens te configureren. Daarvoor wordt een binair masker gebruikt, waarin een 0 een INPUT voorstelt, en een 1 een OUTPUT. Zoals gebruikelijk wordt er van rechts naar links gewerkt (het Most Significant Bit, of MSB, staat links, of "vooraan", het LSB of Least Significant Bit, rechts).
De pins toewijzing voor de PICAXE-08M2 is:
- - - C5 C4 - C2 C1 -
De eerste drie van de 8 bits, C.3 en C.0 zijn nietszeggend, want de 08M2 heeft maar zes I/O pins. En, nogmaals: Pins C.0 en C.3 kunnen niet worden gewijzigd; C.0 is altijd OUT, C.3 is altijd IN
Het commando
let dirsC = %00000110
maakt C.2 en C.1 tot OUTPUTS, en de overige pins tot INPUT. Het procent symbool ("%") aan het begin van de cijferreeks geeft aan dat de volgende cijfers binair moet worden gezien, en niet decimaal.

Het pins commando

In aanvulling op het dirs commando, en om zaken onoverzichtelijker te maken, hier het bit masker voor het pins commqando:
- - - C5 C4 C3 C2 C1 -
Dit omdat pins gebruikt kan worden om samen met een leesmasker te gebruiken in een if...then commando; alle pins zijn dan inputs en C.3 is immers *altijd* input.

03 oktober 2015

Tutorial 2 - Analoge inputs


Analoge inputs

Op het AXE091 bordje zijn een drietal analoge gevers te vinden; een licht afhankelijke weerstand (LDR, van het engelse Light Dependent Resistor) , een regelbare weerstand of potentiometer, en een temperatuurvoeler. Hier zitten ze:

De LDR

Ik moest de LDR nog zelf solderen; hij zat er los bij.

Wat er dient te gebeuren is:
  • Lees de analoge waarde van de LDR digitaal in (readadc commando)
  • Als de waarde boven een gegeven waarde ligt, switch dan de rode LED aan.
  • Als de waarde beneden een gegeven waarde ligt, switch dan de groene LED aan.
  • En zo niet, doe dan beide LEDs uit
Om dat voor elkaar te krijgen, moeten de volgende verbindingen worden gemaakt:
  • C4 gaat als output werken, en bestuurt de rode LED (rode draad)
  • C0 gaat als output werken, en bestuurt de groene LED (groene draad)
  • C1 gaat als input werken, en vraagt de LDR uit (gele draad)
Ziehier de PICAXE-08M2 kant:
De rode draad zit aan pennetje 3, de groene aan pennetje 7 en de gele aan pen 6.
Aan de invoer/uitvoer terminal kant ziet het er zo uit:
De rode draad zit in de L3 connector, de groene in de L1, en de gele in de LDR connector.


Programma

Onderstaand het programma in knip-en-plak mode:
; connect C.4 (physical pin 3) to L1 (red) ; connect C.0 (physical pin 7) to L2 (green) ; connect C.1 (physical pin 6) to LDR ; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point symbol RED = C.4 ; define pin 3 with the name "RED" symbol GREEN = C.0 ; define pin 7 with the name "GREEN" symbol LDR = C.1 ; define pin 6 with the name "LDR" ; set picaxe type #picaxe 08m2 main: readadc LDR,b0 ; read ADC1 into variable b0 ; if you want a real time feedback of the actual vaules, use ; debug b0 if b0 > 157 then RedOn ; if b0 > 157 then do RedOn if b0 < 127 then GreenOn ; if b0 < 127 then do GreenOn low RED ; else switch off RED low GREEN ; and switch off GREEN goto main ; jump back to the start RedOn: ; make a label high RED ; switch on Red LED low GREEN ; switch off Green LED goto main ; jump back to start GreenOn: ; make a label high GREEN ; switch on C.0 low RED ; switch off C.4 goto main ; jump back to start

Let op de introductie van een nieuw element, de subroutine.
Zowel RedOn, als GreenOn zijn subroutines, die vanuit het hoofdprogramma worden opgeroepen. Beide routines keren na aanroep terug naar de hoofdroutine "main" middels het goto main commando.
Er mag maar een main routine zijn (hoewel... de PICs zijn in staat meer dan een taak tegelijk te vervullen: parallel tasking).

Het resultaat: als de LDR wordt afgedekt, daalt de ingelezen waarde onder 127 en wordt de groene LED ontstoken. Onafgedekt valt zoveel licht op de LDR, dat de waarde boven de 157 komt, en de rode LED oplicht: