PWM és kezelése, felhasználása
PWM és kezelése, felhasználása
PWM használható, mint a könyvben is írtam:
- kitöltési tényezőként analóg jel előállítására
- impulzusok előállítására adott szélességarányú magas-alacsony aránnyal
- precíz hangkeltésre
- léptetőmotorokhoz
- teljesítmény szabályozására kapcsolótranzisztorral
Ez utóbbi tapasztalatai:
túl gyors PWM esetén nem tud az áramkör normálisan működni, a PWM sebesseget lejjebb kell venni (prescale=1024, pwm=10)! a végső megoldásként szoftveres megoldást is alkalmazhatunk, ekkor a timerrutin megszakításgenerálást használjuk ki. Így a pwm lemehet 1-2 impulzus / másodpercre is. Jellemző ki/bekapcsolási szabályzáskor a 8-15 Hz-s tartományba is! Ezta sima timerrel csak trükközéssel vagy alacsony kvarcórajellel lehet ellérni.
Ha mégis a HW alapú PWM-t használjuk, akkor a tranzisztor nem mindig tud a gyors váltások miatt kinyitni.
Nálam a felépítés a következő volt:
Optokapu (ILQ1), BC856 kapcsolótranzisztor és TIP142/147 tranzisztor
Ekkor HW PWM esetén ~3-5 khz jel ment ki rá. Ezzel nem tudott jól működni, kb. 1/3 átlagfeszültség ment ki. Ezt szoftveresen kezelve sikerült a 0-100%-ot kihozni. A tranzisztoron ~1,2-1,8V esik 12V táp esetén.
Most a motor vezérléseknél valószínűleg a tehetetlenség is belejátszik (motor tehetetlensége, kapacitív terhelések késleltetések stb.) Ez a lassabb PWM szabályzás esetén elenyészővé vált.
Mindíg csináljunk előtesztet sima kapcsolással is, mintha a tranzisztor kapcsolóelem lenne, 1-2 hz-s jellel. Ha ekkor jól működik, és a PWM szabályozáskor a max teljesítményt nem tudjuk kivenni akkor SW alapon lassítsuk le!
Remélenm segítettem - ha valaki ilyen PWM alapú szamályozsra adja a fejét... Meg nem is volt ilyen fórum...
- kitöltési tényezőként analóg jel előállítására
- impulzusok előállítására adott szélességarányú magas-alacsony aránnyal
- precíz hangkeltésre
- léptetőmotorokhoz
- teljesítmény szabályozására kapcsolótranzisztorral
Ez utóbbi tapasztalatai:
túl gyors PWM esetén nem tud az áramkör normálisan működni, a PWM sebesseget lejjebb kell venni (prescale=1024, pwm=10)! a végső megoldásként szoftveres megoldást is alkalmazhatunk, ekkor a timerrutin megszakításgenerálást használjuk ki. Így a pwm lemehet 1-2 impulzus / másodpercre is. Jellemző ki/bekapcsolási szabályzáskor a 8-15 Hz-s tartományba is! Ezta sima timerrel csak trükközéssel vagy alacsony kvarcórajellel lehet ellérni.
Ha mégis a HW alapú PWM-t használjuk, akkor a tranzisztor nem mindig tud a gyors váltások miatt kinyitni.
Nálam a felépítés a következő volt:
Optokapu (ILQ1), BC856 kapcsolótranzisztor és TIP142/147 tranzisztor
Ekkor HW PWM esetén ~3-5 khz jel ment ki rá. Ezzel nem tudott jól működni, kb. 1/3 átlagfeszültség ment ki. Ezt szoftveresen kezelve sikerült a 0-100%-ot kihozni. A tranzisztoron ~1,2-1,8V esik 12V táp esetén.
Most a motor vezérléseknél valószínűleg a tehetetlenség is belejátszik (motor tehetetlensége, kapacitív terhelések késleltetések stb.) Ez a lassabb PWM szabályzás esetén elenyészővé vált.
Mindíg csináljunk előtesztet sima kapcsolással is, mintha a tranzisztor kapcsolóelem lenne, 1-2 hz-s jellel. Ha ekkor jól működik, és a PWM szabályozáskor a max teljesítményt nem tudjuk kivenni akkor SW alapon lassítsuk le!
Remélenm segítettem - ha valaki ilyen PWM alapú szamályozsra adja a fejét... Meg nem is volt ilyen fórum...
PWM gondok
Hello!
Meg uj vagyok AVR dolgokban, korabban 8051 essel foglalkoztam.
Az a gondom lenne, hogy PWM el kene DC motort vezerelnem 25-30 Khz en.
Tiny 2313 al probalkozok.
Az a gondom tamadt , hogy nekem mukodnek az interuptok,meg ha beirok az ISR be utasitasokat, hogy valtsa a Port allapotat
Akkor mukodik is.
CSan azt nem ertem , hogy nekem miert nem mukodik direktbe az OC0A
kimeneten??vagyis a POrtB 2. pinjen?vagy nem is mukodhet direktbe?muszaj igy utasitasokkal?
Valamit nem kapcsoltam be?
A DDRB be is engedelyeztem a kimenetet.
Mi a hibam, kerlek segitsetek, mar megorulok a hiba keresesbe
itt a kod:
Az erdekelne meg hogy mi az a prescaling?
nem ertem mire szolgal.milyen prescalingot allitsak en be, ha 30KHZ es jelet akarok?
Milyen kristalyt tegyek (8MHz,12MHz), vagy hasznaljam a belso oscilatorjat?
Elore is halas koszonet es bocs ha hulyeseget kerdezek
Udv
Meg uj vagyok AVR dolgokban, korabban 8051 essel foglalkoztam.
Az a gondom lenne, hogy PWM el kene DC motort vezerelnem 25-30 Khz en.
Tiny 2313 al probalkozok.
Az a gondom tamadt , hogy nekem mukodnek az interuptok,meg ha beirok az ISR be utasitasokat, hogy valtsa a Port allapotat
Kód: Egész kijelölése
ISR(TIMER0_COMPA_vect)
{
PORTA=0x001;
}
ISR(TIMER0_OVF_vect)
{
PORTA=0;
}
CSan azt nem ertem , hogy nekem miert nem mukodik direktbe az OC0A
kimeneten??vagyis a POrtB 2. pinjen?vagy nem is mukodhet direktbe?muszaj igy utasitasokkal?
Valamit nem kapcsoltam be?
A DDRB be is engedelyeztem a kimenetet.
Mi a hibam, kerlek segitsetek, mar megorulok a hiba keresesbe
itt a kod:
Kód: Egész kijelölése
#include <c:\AVRtst\io.h>
#include <c:\AVRtst\interrupt.h>
ISR(TIMER0_COMPA_vect)
{
PORTA=0x001;
}
ISR(TIMER0_OVF_vect)
{
PORTA=0;
}
void ioinit (void)
{
TCCR0A=TCCR0A|0x043; //compare mode A , Fast PWM
TCCR0B=TCCR0B|0x001; //no prescaling
DDRB=DDRB|x002;
SREG=SREG|0x080; //Kitoltesi faktor
TIMSK =TIMSK|0x003;
OCR0A =0x040; az IRQ bekapcsolasa
}
void main (void)
{
ioinit ();
while(1)
}
nem ertem mire szolgal.milyen prescalingot allitsak en be, ha 30KHZ es jelet akarok?
Milyen kristalyt tegyek (8MHz,12MHz), vagy hasznaljam a belso oscilatorjat?
Elore is halas koszonet es bocs ha hulyeseget kerdezek
Udv
A frekvencia beállítása az órajelből jön:
Erre az adatlap tér ki (HSpeedPWM stb). Hogy hogyan kell kiszámolni abban van a képlet. Tartalmazza az előosztást (prescale), a PWM bitszámot (2^8-9-10) illetve a kvarcfrekvenciát.
Ebből számolható az INT gyakorisága.
A kimeneti lábad lehet:
- IO láb
- Funkcióláb
A DDRx-szel az IO lábat kapcsolod be.
Ha így van, akkor az átfordulást NEKED kell megoldani a toggleval. Ha PWMként használod, akkor a TIMER kimenete _direktben_ a lábon van. Azaz a PWM ciklus (0-255/0-511/0-1023) adott szakasza alacsony, adott szakasza magas szinten van. A végén OverFlow esetén ad még egy INTt is. Azaz a COMPARE számláló esetén lehet
- H-val indítok, és L-be fordul
- L-lel indítok, és H-ba billen
A ciklus lefutása után újraindul, vagy úgymarad a végén, vagy mi történjen...
Az M16 adatlapját néztem annó, abban eléggé szemléletesen benne van...
A Programrészletekben - szerintem - a regisztereket írod direktben és tuti ott kavarodik el valami....
Ha SBM betét kell /regiszterírás/, akkor a mikrokontroller.net oldalon vannak jó tippek. C-ül a ATMEL honlapon (pdf+minta, pl. DC motor is:))))) és az AVRFreakson. BASCOMban a PWM kezelése 3 sor:)
Erre az adatlap tér ki (HSpeedPWM stb). Hogy hogyan kell kiszámolni abban van a képlet. Tartalmazza az előosztást (prescale), a PWM bitszámot (2^8-9-10) illetve a kvarcfrekvenciát.
Ebből számolható az INT gyakorisága.
A kimeneti lábad lehet:
- IO láb
- Funkcióláb
A DDRx-szel az IO lábat kapcsolod be.
Ha így van, akkor az átfordulást NEKED kell megoldani a toggleval. Ha PWMként használod, akkor a TIMER kimenete _direktben_ a lábon van. Azaz a PWM ciklus (0-255/0-511/0-1023) adott szakasza alacsony, adott szakasza magas szinten van. A végén OverFlow esetén ad még egy INTt is. Azaz a COMPARE számláló esetén lehet
- H-val indítok, és L-be fordul
- L-lel indítok, és H-ba billen
A ciklus lefutása után újraindul, vagy úgymarad a végén, vagy mi történjen...
Az M16 adatlapját néztem annó, abban eléggé szemléletesen benne van...
A Programrészletekben - szerintem - a regisztereket írod direktben és tuti ott kavarodik el valami....
Ha SBM betét kell /regiszterírás/, akkor a mikrokontroller.net oldalon vannak jó tippek. C-ül a ATMEL honlapon (pdf+minta, pl. DC motor is:))))) és az AVRFreakson. BASCOMban a PWM kezelése 3 sor:)
Kód: Egész kijelölése
config pwmx=....
enable timerx
pwmxa=ertek
2313-ba mehet minden.
RC5 viszi a Tmr0-t. A SW alapú PWM a Tmr1-t. És a billenési küszöböt a timer rutinon kívül számolod és ott csak egy Port=1 ha nagyobb, port=0 ha kisebb ellenőrzés van csak.
Azzaz
'Minden valtozo byte!
Timer1Int:
Incr SWPWMszamlalo
If pwmSW1>SWpwmszamlalo then pin1=1 else pin1=0
If pwmSW2>SWpwmszamlalo then pin2=1 else pin2=0
If pwmSW3>SWpwmszamlalo then pin3=1 else pin3=0
Return
A foprogramban meg logatritmikusan kiszamolod a PWMSWx ertekeit...
A Timer1-t konfiguralod, tulcsordulaskor megy a Timer1INTre. Itt ezen belul ujabb 256-os osztas van.
Ha LEDt hajtasz meg, akkor a frekvencia min 30 Hz legyen (vibralasmentesseg). Igy a Timer1-re lepes 30x256=7600 Hz korul kell legyen... (fugg a kulso kvarctol, en ide a legmagasabbat szoktam rakni, igy nem lesz eroforraselfogyas - T2313 eseten ez 20 MHz. Sorosport ha kell, akklor 18,xxx jó ide.)
RC5 viszi a Tmr0-t. A SW alapú PWM a Tmr1-t. És a billenési küszöböt a timer rutinon kívül számolod és ott csak egy Port=1 ha nagyobb, port=0 ha kisebb ellenőrzés van csak.
Azzaz
'Minden valtozo byte!
Timer1Int:
Incr SWPWMszamlalo
If pwmSW1>SWpwmszamlalo then pin1=1 else pin1=0
If pwmSW2>SWpwmszamlalo then pin2=1 else pin2=0
If pwmSW3>SWpwmszamlalo then pin3=1 else pin3=0
Return
A foprogramban meg logatritmikusan kiszamolod a PWMSWx ertekeit...
A Timer1-t konfiguralod, tulcsordulaskor megy a Timer1INTre. Itt ezen belul ujabb 256-os osztas van.
Ha LEDt hajtasz meg, akkor a frekvencia min 30 Hz legyen (vibralasmentesseg). Igy a Timer1-re lepes 30x256=7600 Hz korul kell legyen... (fugg a kulso kvarctol, en ide a legmagasabbat szoktam rakni, igy nem lesz eroforraselfogyas - T2313 eseten ez 20 MHz. Sorosport ha kell, akklor 18,xxx jó ide.)
Közbe rájöttem hogy símán használhatom a Harweres pwm-et. A doksi szerint 2 duplán buferelt pwm van a T2313-ba. namost 2-öt sikeresen meg tudok hajtani de a harmadik sehogy se jön össze.
Ezzel probalkoztam
nemtudom mit szúrhatok el. amugy valóban hardweres pwm-el siman megfér minden egy prociban.
Ezzel probalkoztam
Kód: Egész kijelölése
$regfile = "ATtiny2313.dat"
$crystal = 7372800
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Pinb.3 = Output
Config Pinb.2 = Output
Config Pinb.4 = Output
Dim A As Byte
Do
For A = 255 To 1 Step -1
Pwm1b = A
Waitus 500
Next
For A = 255 To 1 Step -1
Pwm1a = A
Waitus 500
Next
For A = 255 To 1 Step -1
Pwm0b = A
Waitus 500
Next
For A = 255 To 1 Step -1
Pwm0a = A
Waitus 500
Next
Loop
Méretes darab. lehet egy m48 lesz beletéve. És ahogy elnézem egy weboldalon olcsóbb mint a T 2313. mi lehet az oka?
És egy kérdés hogyha már a nagyobb prociknál kötöttünk ki. össze szokták e kötni a két GND kivezetést? Holnap felhívom a helyi boltot lássam menyiért és milyen idön belül hozzák el. amugy Thanx a segitséget.
És egy kérdés hogyha már a nagyobb prociknál kötöttünk ki. össze szokták e kötni a két GND kivezetést? Holnap felhívom a helyi boltot lássam menyiért és milyen idön belül hozzák el. amugy Thanx a segitséget.