03 november 2015

Tutorial: P-Channel step-up

P-Channel FET step-up

In het volgende plaatje zit een probleem. Wat als we vanuit een standaard controller (die een output heeft van 3,5 tot 5 Volt) een 12 Volts motor aan willen sturen? In de vorige entry is duidelijk gesteld, dat voor een P-Channel FET de VGS negatief moet zijn om te geleiden.
Als de Gate niet op het zelfde niveau als de Source kan worden getrokken, dan blijft de FET dus in geleiding. En aangezien de gate spanning niet hoger kan worden dan 5 Volt; het maximale dat een microcontroller kan afgeven, is de Gate dus nooit op het niveau van de Source te krijgen. De FET blijft dus altijd geleiden!

Dit geldt niet voor een N-Channel FET: daar moet immers VGS positief zijn om te geleiden, en Source ligt hier aan massa (0 Volt).


De oplossing

De oplossing voor dit probleem is het inzetten van een niveau verschuiver in de vorm van een NPN transistor:
Op het moment, dat de Basis van Q1(het 5 Volt PWM-signaal) 0,7 volt hoger wordt dat de Emitter (pijltje), gaat de transistor Q1 geleiden, de spanning op de gate van de FET daalt en de FET gaat geleiden.
Daalt de PWM spanning naar 0 Volt, dan gaat Q1 sperren, de Gate spanning stijgt (naar VDD) en de FET zal weer sperren.

Dus bij een ingangsspanning van +5 tot 0 Volt is het toch mogelijk een Gate spanning te sturen tussen +12 (=VDD) en 0 Volt.


Let op!

De negatieve zijde van alle accu's of voedingen moeten aan elkaar verknoopt worden. De positieve niet!!!


Dit verklaart, waarom Q5 en Q6 in het H-brug ontwerp zitten; IC2 wordt gevoed met 5 Volt, en kan dus geen uitgangsspanning van 12 Volt leveren. IC1 kan wel een voldoende spanning leveren; 5 volt is voldoende on Q1 en Q2 open te sturen en 0 Volt voldoende om die weer te laten sperren.

Achtergrond: N-Channel en P-Channel FET

N-Channel FETs en P-Channel FETs als schakelaar

Wanneer geleiden FET's nu eigenlijk, en wat is het verschil?


N-Channel FET

Een N-Channel FET (die met het pijltje naar de Gate plaat toe) geleidt op het moment, dat de spanning tussen Gate en Source positief is. Of te wel: de Gate moet hoger in spanning zijn dan de Source.
In dit plaatje ligt Source aan de negatieve kant van de batterij en de Gate wordt laag gehouden via de weerstand R2 naar de negatieve kant van de batterij. Er is dus geen spanningsverschil tussen Gate en Source (dus: UGS is 0V) De FET zal dus sperren, en de LED is uit.
Als de schakelaar gesloten wordt, dan gaat de Gate spanning omhoog; deze wordt gelijk aan de batterijspanning; de FET zal geleiden, en de LED zal gaan branden. R1 zorgt voor een stroombegrenzing voor de LED; de stroom door een LED mag namelijk niet te groot worden (plm 20mA continue).
Hierboven de schakeling op het prototype deel van de AXE091.
De schakelaar S1 is, via de gele draad, SW3 op het AXE091 bord.

Hier zie je het resultaat als de schakelaar wordt ingedrukt, de gate krijgt spanning, de FET gaat geleiden en de LED brandt (zwak... het is een Monsanto "Special Product" uit 1980 - individueel(!) verpakt; tegenwoordige LEDs zijn efficiënter)


P-Channel FET

Een P-Channel FET (die met het pijltje van de Gate plaat af) geleidt op het moment, dat de spanning tussen Gate en Source negatief is. Of te wel: de Gate moet lager in spanning zijn dan de Source.
In dit plaatje ligt Source aan de positieve kant van de batterij en de Gate wordt hoog gehouden via de weerstand R2 naar de positieve kant van de batterij. Er is dus geen spanningsverschil tussen Gate en Source (dus: UGS is 0V) De FET zal dus sperren, en de LED is uit.
Als de schakelaar gesloten wordt, dan gaat de Gate spanning omlaag naar 0V; de Source blijft op batterijspanning, en dus is de Gate lager in spanning dan de Source: de FET zal geleiden, en de LED zal gaan branden.


Samenvattend

Een N-Channel FET wordt open gestuurd door "positieve" spanning (VG > VS, of te wel: VGS is positief). Een P-Channel FET wordt open gestuurd door een "negatieve" spanning (VG < VS, of te wel: VGS is negatief)

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.