Digitalstyrd spänningsregulator?
Digitalstyrd spänningsregulator?
Jag försöker febrilt konstruera en digitalstyrd spänningsregulator bestående av en LM317 och en PIC16F84A som kontroller.
Målet är simpelt att styra en motor. Eller rättare sagt två.
Jag såg ett fint schema i databladet till LM:en på hur man kan koppla transistor-resistor-segment parallellt till att sänka strömmen på adjust-sidan:
Problemet med denna är att; hur man än väljer motstånden så får man ingen fin resistanskurva. Antingen blir den logaritmisk eller så går man miste om väldigt många bitar ("dubletter")
Så jag vände på steken och möblerade om lite i schemat:
Detta blev ju jättebra, trodde jag när jag byggde ihop det.
Men så kan man tydligen inte göra.
Jag antar att transistorerna inte kan dumpa sin ström som de vill och allt blir instabilt eller funkar inte alls.
Några tips på hur man kan förbättra min version av schemat? Eller är det bara att lägga ner?
Det finns ju ett smidigt alternativ med en digital potentiometer, men någon sådan har jag inte och Elfa ligger långt bort
Jag vet vad ni tänker: Varför i hela friden använder jag inte PWM istället?
Svaret är att 84A stödjer inte hårdvaru-PWM och då kan det va' så med det. Finns det några andra sätt att styra motorhastigheten? En extern PWM-krets, ja. Men den ska helst vara simpel och lätt kunna styras av en PIC.
Målet är simpelt att styra en motor. Eller rättare sagt två.
Jag såg ett fint schema i databladet till LM:en på hur man kan koppla transistor-resistor-segment parallellt till att sänka strömmen på adjust-sidan:
Problemet med denna är att; hur man än väljer motstånden så får man ingen fin resistanskurva. Antingen blir den logaritmisk eller så går man miste om väldigt många bitar ("dubletter")
Så jag vände på steken och möblerade om lite i schemat:
Detta blev ju jättebra, trodde jag när jag byggde ihop det.
Men så kan man tydligen inte göra.
Jag antar att transistorerna inte kan dumpa sin ström som de vill och allt blir instabilt eller funkar inte alls.
Några tips på hur man kan förbättra min version av schemat? Eller är det bara att lägga ner?
Det finns ju ett smidigt alternativ med en digital potentiometer, men någon sådan har jag inte och Elfa ligger långt bort
Jag vet vad ni tänker: Varför i hela friden använder jag inte PWM istället?
Svaret är att 84A stödjer inte hårdvaru-PWM och då kan det va' så med det. Finns det några andra sätt att styra motorhastigheten? En extern PWM-krets, ja. Men den ska helst vara simpel och lätt kunna styras av en PIC.
Den kopplingen med LM317 kommer nog alldrig ned på 0 volt, ideen med den måste vara typ att kunna välja/trimma utspänningen på en strömforsörjning.
Vad skall din PIC krets göra förutom att varvtalsreglera motorn? Det är inte jättesvårt att skriva ett program som generererar PWM. Det är ju bara två loopar som slår av och på en port-pinne. Fast du måste ha kopior av loop-registren så den kommer ihåg..
PIC kretsar är så snabba, dom hinner med en massa andra saker också samtidigt om man lägger in det i loopen. T.ex en table lookup om man vill skapa sinusvåg.
Vad skall din PIC krets göra förutom att varvtalsreglera motorn? Det är inte jättesvårt att skriva ett program som generererar PWM. Det är ju bara två loopar som slår av och på en port-pinne. Fast du måste ha kopior av loop-registren så den kommer ihåg..
PIC kretsar är så snabba, dom hinner med en massa andra saker också samtidigt om man lägger in det i loopen. T.ex en table lookup om man vill skapa sinusvåg.
Så här kan en SW PWM se ut:
period movf voltage,w ;hämta programmerad spänning
movwf onreg ;kopia
movwf offreg ;kopia
BCF PORTA,0 ;slå av pinne
loop1 incfsz offreg,f ;räkna upp OFF tiden
goto loop1
BSF PORTA,0 ;slå på pinne
loop2 decfsz onreg,f ;räkna ned ON tiden
goto loop2
goto period
Voltage registret kan ha värden mellan 1 och 255. Det är en liten offset på ca 1/255, dödtid, för dom första instruktionerna. Inte särskilt problem på en motor.
Init, när processorn startar måste sätta PORTA till utgång och omedelbart resetta pinnen (i fall resten av initen är så lång motorn börjar gå för fullt).
Med 4MHz kristall: 1Meg/ ungefär 3*256 instruktioner= 1300KHz period.
period movf voltage,w ;hämta programmerad spänning
movwf onreg ;kopia
movwf offreg ;kopia
BCF PORTA,0 ;slå av pinne
loop1 incfsz offreg,f ;räkna upp OFF tiden
goto loop1
BSF PORTA,0 ;slå på pinne
loop2 decfsz onreg,f ;räkna ned ON tiden
goto loop2
goto period
Voltage registret kan ha värden mellan 1 och 255. Det är en liten offset på ca 1/255, dödtid, för dom första instruktionerna. Inte särskilt problem på en motor.
Init, när processorn startar måste sätta PORTA till utgång och omedelbart resetta pinnen (i fall resten av initen är så lång motorn börjar gå för fullt).
Med 4MHz kristall: 1Meg/ ungefär 3*256 instruktioner= 1300KHz period.
Det finns ju för all del möjlighet att skapa pwm med hjälp av digitala räknare.
I skolan funkade roboten enligt följande:
En pinne skickade ut en byte till ett skiftregister (seriell/parallell).
Skiftregistret matades ut till en (binär?)komparator. En räknare matade ut ett fyrabitstal......och detta jämfördes med en halv byte......Den andra "byte-halvan" användes till den andra motorn.........hängdu du med.
pwm utan H-PWM.....men med en upplösning på bara 4 bitar----och en hel del hårvara.......ju.
I skolan funkade roboten enligt följande:
En pinne skickade ut en byte till ett skiftregister (seriell/parallell).
Skiftregistret matades ut till en (binär?)komparator. En räknare matade ut ett fyrabitstal......och detta jämfördes med en halv byte......Den andra "byte-halvan" användes till den andra motorn.........hängdu du med.
pwm utan H-PWM.....men med en upplösning på bara 4 bitar----och en hel del hårvara.......ju.
Så det tror du? Med FET... låter intressant, använder nämligen bara vanliga BC337/40 nudanei skrev:Koppling #2 funkar nog om du använder FET-transistorer, dom drar ingen ström. Behöver du så bra upplösning att den första varianten inte funkar? Man borde väl kunna få 5-6 vettiga hastigets lägen iafa.
Den första ritningen ger, som sagt, en närmare logaritmisk skala, se följande exempel:
(R3=A, R4=B, R5=C, R1≈2k @ 7,2V, R2 och kortslutande transistor utelämnas)
Det är ju i slutet man behöver tätt mellan de olika resistanserna då de högre spänningarna.
Vi skulle gärna vilja ha 8 olika hastigheter att välja mellan, vilket passar alldeles förträffligt med 3 bitar upplösning om allt fungerar som det ska.
Nej, visst når den inte 0V, men vem vill kunna mata en motor med spänning nära 0V? Lägsta spänningen ut ligger runt 1,3V och högsta ut ligger ca 1,0-1,5 under inspänningen (inga mirakelsiffror precis ).hebbe skrev:Den kopplingen med LM317 kommer nog alldrig ned på 0 volt, ideen med den måste vara typ att kunna välja/trimma utspänningen på en strömforsörjning.
Vad skall din PIC krets göra förutom att varvtalsreglera motorn? Det är inte jättesvårt att skriva ett program som generererar PWM. Det är ju bara två loopar som slår av och på en port-pinne. Fast du måste ha kopior av loop-registren så den kommer ihåg..
PIC kretsar är så snabba, dom hinner med en massa andra saker också samtidigt om man lägger in det i loopen. T.ex en table lookup om man vill skapa sinusvåg.
Vi ska ha en PIC till att styra en robot. Antingen en framdrivningsmotor med svängning på framhjulen eller simpelt två framdrivningmotorer som driver varsin sida (höger/vänster, "pansarvagnsstyle"). Kraftkällan är batteri på 7,2V (som visst gärna kräker ut 8,5V ).
Kort sagt så har den PICen massor att hålla reda på, sensorer, styrning och radiokommunikation. Därför kommer den inte att hinna göra PWM-vågor på mjukvaruväg.
Vi håller på att försöka få igång en PIC16F877A, men har problem med programmeringen. När (om?) den kommer igång kan vi ju prova på hårdvarustyrd PWM.
Okej, men tyvärr kör vi med PicBasic, så vi fattar inte så mycket assembler.hebbe skrev:Så här kan en SW PWM se ut:
period movf voltage,w ;hämta programmerad spänning
movwf onreg ;kopia
movwf offreg ;kopia
BCF PORTA,0 ;slå av pinne
loop1 incfsz offreg,f ;räkna upp OFF tiden
goto loop1
BSF PORTA,0 ;slå på pinne
loop2 decfsz onreg,f ;räkna ned ON tiden
goto loop2
goto period
Voltage registret kan ha värden mellan 1 och 255. Det är en liten offset på ca 1/255, dödtid, för dom första instruktionerna. Inte särskilt problem på en motor.
Init, när processorn startar måste sätta PORTA till utgång och omedelbart resetta pinnen (i fall resten av initen är så lång motorn börjar gå för fullt).
Med 4MHz kristall: 1Meg/ ungefär 3*256 instruktioner= 1300KHz period.
Som jag sa ovan, den är upptagen med mycket annat. Men i värsta fall kan man ju dedikera en PIC att göra PWM och skicka duty-datan seriellt tilld en från den andra PICen?
Eller så lägger man helt enkelt ner energin på att få igång en större PIC med hårdvaru-PWM-utgångar.
- EagleSpirit
- Inlägg: 1288
- Blev medlem: 27 maj 2003, 23:15:48
- Ort: Västerås
- Kontakt:
Gäller det varvtalsreglering så är det nog PWM som gäller.
Att bara styra genom att ändra spänningen är svårt eftersom motorn drar olika mycker ström och resistansen varierar.
Digitalstyrd spänningsreglering i andra sammanhang skulle kunna lösas med 723 regulatorn, där man manipulerar referensspänningen i regulatorn
genom att ge den en konstgjord referens från en D/A omvandlare.
Att bara styra genom att ändra spänningen är svårt eftersom motorn drar olika mycker ström och resistansen varierar.
Digitalstyrd spänningsreglering i andra sammanhang skulle kunna lösas med 723 regulatorn, där man manipulerar referensspänningen i regulatorn
genom att ge den en konstgjord referens från en D/A omvandlare.
Ja, vi tänkte reglera hastigheten på motorn med en spänningregulator eftersom vi inte har tillgång till PWM. Någon exakt varvtalsreglering kan jag ju inte säga att vi behöver, det ska bara vara en simpel krets som gör att man kan ändra hastigheten på framdrivningen, helst med 8 steg.janne66 skrev:Gäller det varvtalsreglering så är det nog PWM som gäller.
Att bara styra genom att ändra spänningen är svårt eftersom motorn drar olika mycker ström och resistansen varierar.
Digitalstyrd spänningsreglering i andra sammanhang skulle kunna lösas med 723 regulatorn, där man manipulerar referensspänningen i regulatorn
genom att ge den en konstgjord referens från en D/A omvandlare.
Ett sätt att få PWM:
http://se.msnusers.com/SvenskaRobotbygg ... PhotoID=24
Mata in 8 bitar i skiftregister (seriellt in/parallellt ut) så går det bara åt ett par pinnar för att styra robotens motorer ju.
http://se.msnusers.com/SvenskaRobotbygg ... PhotoID=24
Mata in 8 bitar i skiftregister (seriellt in/parallellt ut) så går det bara åt ett par pinnar för att styra robotens motorer ju.
ja, det skulle kunna vara en bra lösning att ha en PIC som styr och en annan som skapar pulserna. Den som styr kan ju programmeras i basic, den med PWM i ASM.
Ser ni använder 16bitars upplösning, då blir det plats med flera kanaler och instruktioner.
T.ex skulle man med 20-30 ASM linjer i en PIC16C54 (eller någon annan 20pin PIC) LÄTT skapa en krets som det här:
Fyra PWM kanaler (4 motorer) med 16bits upplösning på PORTA,1-3
PORTB: bit0-3: Spänning till vald motor. bit4-7: val av kanal 1-4.
T.ex du vill ändra motor 1 till värdet 8: Sätt värdet 8 på PORTB,1-3. Pulsa sedan PORTB,4 en gång(clocka in). PWM-loopen vill snappa upp värde på 0-3 och lägga in det på rätt kanal.
Säg till om du vill ha en testad kod du kan lägga in i MPLAB.
Ser ni använder 16bitars upplösning, då blir det plats med flera kanaler och instruktioner.
T.ex skulle man med 20-30 ASM linjer i en PIC16C54 (eller någon annan 20pin PIC) LÄTT skapa en krets som det här:
Fyra PWM kanaler (4 motorer) med 16bits upplösning på PORTA,1-3
PORTB: bit0-3: Spänning till vald motor. bit4-7: val av kanal 1-4.
T.ex du vill ändra motor 1 till värdet 8: Sätt värdet 8 på PORTB,1-3. Pulsa sedan PORTB,4 en gång(clocka in). PWM-loopen vill snappa upp värde på 0-3 och lägga in det på rätt kanal.
Säg till om du vill ha en testad kod du kan lägga in i MPLAB.
Jag har funderat på den här kretsen. Eftersom jag fortfarande är nybörjare så kan jag ju passa på att fråga lite:evert skrev:Ett sätt att få PWM:
http://se.msnusers.com/SvenskaRobotbygg ... PhotoID=24
Mata in 8 bitar i skiftregister (seriellt in/parallellt ut) så går det bara åt ett par pinnar för att styra robotens motorer ju.
Med de digitala ingångarna på 7485:an ställer man duty-cycle med 4 bits upplösning (16 lägen), mellan 0% och 100% antar jag. Då lär det ju bara vara de övre 16 lägena som är intressanta för att få snurr på en motor?
Är dessa buffrade eller måste man hålla dem i samma läge hela tiden? (antar att de inte är buffrade).
CLK-ingången på 74191:an är bara att pulsa med godtycklig frekvens, lämpligtvis genererad av en 555:a? är 100Hz en lämplig frekvens för en batteridriven 8V 0,4A motor? Eller ska man sträva efter så hög switchfrekvens så möjligt?
Och sist: Utgången på 7485:an (PWM out) koppas bara till gaten på en MOSFET eller?
Edit: Blandade ihop bits och lägen, ajjabajja.
Senast redigerad av $tiff 22 augusti 2003, 22:50:45, redigerad totalt 1 gång.