 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sob Dec 12, 2009 5:42 pm Naslov sporočila: Osnovni soft. PWM |
|
|
Živijo, spisal sem si neko kodo, ki naj bi izvajala PWM.
Ampak imam en problem iz LED... namreč, LED ne pojema lepo z svetlobo, ampak se zmanšuje,zmanšuje... po pa crkne. Ni tako, kot bi lepo iz potenciometrom ugasnil LEDico.
Uporabljam breadboard, AtMega88, na kristal 16Mhz...
Koda: |
int x,i,j,mult,cons; //x,i,j so števci. cons je konstanta, ki drži začetno vrednost x, mult je multiplier
int bajt,bajt2; //bajt predstavla "prižgani del" PWMja, bajt2 pa "ugasnjeni"
int spiid; //hitrost, ki je tudi pomnožena z mult
void up(int x)
{
cons=x;
while(x>1)
{
for(j=mult;j>1;j--)
{
PORTD=bajt2;
for(i=x;i>1;i--){}
PORTD=bajt;
for(i=cons-x;i>1;i--){}
}
x=x-1;
}
}
void down(int x)
{
cons=x;
while(x>1)
{
for(j=mult;j>1;j--)
{
PORTD=bajt;
for(i=x;i>1;i--){}
PORTD=bajt2;
for(i=cons-x;i>1;i--){}
}
x=x-1;
}
}
void main() {
DDRD=255;
mult=10;
spiid = 250;
while(1)
{
bajt =0b11111111;
bajt2=0b00000000;
up(spiid);
down(spiid);
}
}
|
 |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Sob Dec 12, 2009 6:09 pm Naslov sporočila: |
|
|
Tole je en del kode, ki je generiral PWM na LPT port
Koda: |
int stevec;
int frekvenca =100;
int stevec2;
int duty =155 ; /štartni duty
do {
for (stevec=1; stevec<=255; stevec++)//ponavljaj ...
{
if (stevec<=duty)
{
vrednost=255 ; // prižgi vse led diode
Out32(naslov_porta,vrednost); // kam pošlje podatke
}
else
{
vrednost=0 ; // ugasne vse led diode
Out32(naslov_porta,vrednost); // kam pošlje podatke
}
for (stevec2=1; stevec2<=frekvenca;stevec2++) //zakasnitev za izbiro frekvence
{}
if (kbhit()) {beri_tipke(); duty=y; frekvenca=x;}
printf("Duty cycle: %d Frekvenca: %d \r",duty, frekvenca);
}
} while (1==1); //dokler
int beri_tipke(){
int tipka;
tipka=getch();
if (tipka==43) // tipka +
y++; // poveča duty
if (tipka==45) // tipka -
y--; // zmanjša duty
if (tipka==42) // tipka *
x=x+100; // Zmanjša frekvenco
if (tipka==47) // tipoka /
x=x-100; // poveča frekvenco
if (x<=0) // v primeru napačnih vrednosti
x=1 ;
if (y<=0) // v primeru napačnih vrednosti
y=1;
if (y>=255)
y=255;
return(y,x); // vrne x in y vrednost
|
Vmes se kliče funkcijo beri tipke, ki pogleda katera tipka je bila pritisnjena, da popravi stanje če je treba. Upam, da ti kaj prav pride  _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
cfrik Član


Pridružen-a: Sre 24 Jan 2007 16:15 Prispevkov: 39 Aktiv.: 0.17 Kraj: Trbovlje
|
Objavljeno: Ned Dec 13, 2009 4:05 pm Naslov sporočila: |
|
|
Elegantno lahko to izvedeš, če uporabiš timer mikrokontrolerja. Na razpolago imaš 4 kanale in sicer 2 8 bitna in 2 16 bitna PWM kanala. Širino impulza pa lahko spreminjaš enostavno z vpisom v OCRxy register (x in y sta namesto številke timerja in kanala A ali B). Svetloba se ti bo spreminjala linearno s širino impulza. _________________ lepo je imeti poklic in hobi na istem področju vendar je časa premalo |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Ned Dec 13, 2009 4:13 pm Naslov sporočila: |
|
|
Hvala vama.
Za hard. PWM bom še malo pogledal, sicer imam pa eno vprašanje, ali hard. PWM dela PWM poleg izvajajočega programa, ali se mora program prekinit, da se naredi PWM? |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4769 Aktiv.: 20.13 Kraj: Kobarid
|
Objavljeno: Ned Dec 13, 2009 4:30 pm Naslov sporočila: |
|
|
HW PWM ti nastaviš in on dela svoje delo ne glede kaj ti "čaraš" z MPU. Dočim pri SW pa moraš vsakič, ko se ti generira prekinitev na novo nastavljati vrednosti _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Ned Dec 13, 2009 5:02 pm Naslov sporočila: |
|
|
Aha, to sem želel vedeti  |
|
Nazaj na vrh |
|
 |
Mihec Član


Pridružen-a: Pet 24 Mar 2006 20:10 Prispevkov: 415 Aktiv.: 1.77 Kraj: Mengeš
|
Objavljeno: Tor Mar 16, 2010 11:57 pm Naslov sporočila: |
|
|
Upam da ne bo narobe ker pišem tukaj...
Tudi sam imam problem z ugašanjem LEDice s pomočjo PWM modulatorja. Uporabljam Teksasov procesor. Ledico prižigam in ugašam s PWM načinom. Pri prižigu se Ledica lepo vklopi, problem nastane pri ugasnitvi.
Sicer ne vedno ampak pogosto se zgodi da preden Ledica popolnoma ugasne, žmigne z večjo svetlostjo kot bi teoretično morala (teoretično bi se morala lepo ugasniti, brez "te špice"). Sedaj pa me zanima ali je to kakšna fizikalna omejitev ali kakšna druga iddeja? |
|
Nazaj na vrh |
|
 |
xsyt Član


Pridružen-a: Sre 28 Maj 2008 22:19 Prispevkov: 1346 Aktiv.: 6.48 Kraj: Slov.Bistrica
|
Objavljeno: Sre Mar 17, 2010 12:34 am Naslov sporočila: |
|
|
PWM bi moral delovati tako; http://www.youtube.com/watch?v=yS0MDNXWV6I
Ko sem uporabil bipolarni tranzistor kot stikalo, so pa bile enake težave, kot jih omenjate.. Vklopil je je preveč nenadno, pa tik pred max vrednosti PWMja je "preskočilo" na polno svetilnost. Z uporabo FET tranzistorja pa deluje kot mora. |
|
Nazaj na vrh |
|
 |
Laney Član

Pridružen-a: Čet 09 Sep 2010 22:11 Prispevkov: 26 Aktiv.: 0.14 Kraj: Nova Gorica
|
Objavljeno: Sob Jun 11, 2011 8:16 pm Naslov sporočila: |
|
|
Mene pa zanima kar se tiče frekvence PWM ja. Recimo pri fast pwm in phase correct pwm na frekvenco vpliva samo predelilnik timerja, ter clock procesorja. Zaradi tega nastanejo precej veliki skoki med frekvencami. Mogoče ve kdo kako bi se dalo naredit PWM, da ima točno določeno frekvenco? Recimo 1khz pa pika.
Delam z ATmega 16 v zbirniku. |
|
Nazaj na vrh |
|
 |
lojzek Član



Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3387 Aktiv.: 15.99
|
Objavljeno: Pon Jun 13, 2011 9:31 am Naslov sporočila: |
|
|
Če ti že tisto, kar je v Atmegi zapečeno hardversko, ni všeč, pa izdelaj svoj takt "recimo 1kHz pa pika". In ta takt uporabi kot signal, pelji ga na vhod za povečevanje PWM števca. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|