PWM és kezelése, felhasználása

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

PWM és kezelése, felhasználása

Hozzászólás Szerző: Robert »

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...
Avatar
Gogolak
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2007. január 22. hétfő, 7:00

PWM gondok

Hozzászólás Szerző: Gogolak »

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

Kód: Egész kijelölése

ISR(TIMER0_COMPA_vect)         
{
	PORTA=0x001; 
}
    

ISR(TIMER0_OVF_vect)
		{

		PORTA=0;
		}
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 :x


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)
  	   }   
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
Avatar
Gogolak
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2007. január 22. hétfő, 7:00

Hozzászólás Szerző: Gogolak »

Bocsi, kicsit elirtam a komentarokat a kodban, de gondolom nem kell magyaraznom mi micsoda.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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:)

Kód: Egész kijelölése

config pwmx=....
enable timerx
pwmxa=ertek
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

3 Led PWM szabalyzasat kellene megoldanom logaritmikusan! , Sajnos mindemellett az Attiny meg kene fogadjon RC5 jeleket. mivel ezek nem fernek meg egy helyne egy ATTiny2313 es egy ATTiny13 al oldanam meg.
A nagyobbik oldana meg a PWM-et. Otletek?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Szoftveres PWM. Bármely lábra mehet, 1 TIMER-t foglal csak meg prociidőt (keveset ha jól írod meg)...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

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.)
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

Közbe rájöttem hogy símán használhatom a Harweres pwm-et. :oops: 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

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
nemtudom mit szúrhatok el. amugy valóban hardweres pwm-el siman megfér minden egy prociban.
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

A te megoldásod se tünik rossznak, csak ha lehet már használnám a hw-s cucot. Valahogy így képzeltem el én is, csak ha az rc-5 nél elidözik a program ne e kezdenek el villogni a ledek :?:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Jgos. de az RC5ben nem sok időzgetés van... Azért az a 1/20 sec nagy idő ám! Ennél nem finomabb a szemed felbontása:).
A pwm0a és pwm0b a Timer0-t, a pwm1a és a pwm1b a Timer1-t használja! itt nem fér el a RC5.....

pwm2b; pwm2a nincs a T2313ban:)....

Igy marad a SW pwm:)
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

A mega8-nak ha jol emlekszem 3 timere van, es amugy is szuksegem lenne egy ADC bemetre fenyero meresere. igy elmeletileg szerintem megoldhato a 3pwm es az rc5..... javits ki ha tevednek :roll:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Nyert.
De én M48/88/168-t használnék inkább. Többet tud és az összes PWM A és B-je ki van vezetve... M8 esetén nem!
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

Méretes darab. :lol: 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. :wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az egyik GND a digit részé, a másik az analógé. Illik összekötni (én direktben szoktam. A Vcc szintén.
A VRef 100nF-l a GNDre, és a belső 1.1 vagy 2.56 V-os referenciát érdemes használni.

Az M88/168 azért is jobb, mert ha kinőnéd a procit (8k), akkor lehet a M168 fele nyújtózni:).
Avatar
huba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2006. október 17. kedd, 6:00

Hozzászólás Szerző: huba »

Na valahogy kezdek haladni a programal :lol: az lenne a kérdésem, hogy hogyan tudnám ellenörizni, hogy érkezik e sorosporton valami, mert nem tudok állandóan utánna állni :?
Válasz küldése