PWM vezérlés RS485 buszon át

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Akkor így ki tudnám számolni, most már csak azt kéne tudnom hogy a timer0 ténylegesen mennyit számol 1 sec alatt. 11059200hz ról jár az atmega8. Utoljára az elő osztó értéke 1 volt. De amikor leosztottam a prescale 1 et az órajellel akkor valami 9,0xxxxx a -8.on jött ki. De ezzel még nem tudom mit kéne kezdenem. Ez csak az a szám lenne hogy hány us enként növekszik a timer0 értéke ? Ezt kéne osztani/ szorozni hogy lássam hogy másodpercenként mennyit számol?
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

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

Innen is letöltheted az AVRCalc programot, az kiszámolja neked, milyen frekinél, osztásaránynál mi lesz a periódusidőd stb.
JAni
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp: AVRCALC vag y aKavrcalc segédprogram.
Ebben sokminden ilyen kérdésre ott a válasz (az adatlap kicsit bonyolult képlettel számol :) )
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Letöltöttem, megadtam neki a órajelet prescale 8 at, 64 et vagy akármit egyen kívül mert arra azt írja hogy kicsi a 8bites timer, de mindenre ugyan az az actual timer isr. Vagy én csinálok valamit rosszul megint?
Meg súgnátok hogy mennyit ugrik a timer0 1 sec alatt ha az órajel 11059200hz? prescale ezek szerint 8 kellene hogy legyen. vagy ezt is félre értem?
Avatar
muszer
Biztosítékgyilkos
Hozzászólások: 50
Csatlakozott: 2009. december 28. hétfő, 7:00

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

Az órajeled 11059200Hz, 8-as előosztóval 1382400Hz, ez 8 bites timeren futtatva, ami egy 256-os osztást jelent, 5400 lesz a másodpercenkénti ugrásod.
Két ugrás között, 1/5400, azaz 185us lesz az idő. Innen tudsz tovább számolgatni, hogy mennyi a fordulatszámod.
Én rátennék egy frekimérőt a ventilátor kimenetére, csak úgy viszonyításképpen, hogy hány impulzus jön ki fordulatonként.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Freekimérőd meg van: hangkártya. Kb. 50Hz...16kHz biztosan megy.
A jellemző frekvenciára a gitárhangoló WTune nevű programot használd....

Kész.
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Na most egy picit össze zavarodtam.
Tehát 5400 ig ugye nem tud számolni a timer0 mert ő csak 8 bites és akkor max 255 -ig megy. Nem?
Akkor 5400 szor fog 1sec alatt körbe fordulni(túlcsordulni) ?
Vagy amíg a timer0 érték lép egyet(0 és 255 közt) addig telik el az 1/5400(185us)?
Az int0 jó nekem hogy falling ? Az nem a feszültség változás? Mert akkor számolna fel és lefutó éleket is ami duplázna.

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

$regfile = "m8def.dat"
$crystal = 11059200
$baud = 115200

Config = TIMER0 = Timer , Prescale = 8
On TIMER0 Idovan
Enable TIMER0

Config INT0 = Falling
On INT0 Impulzus
Enable INT0

Enable interrupts

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

'main
do
wait 3
print rpm
loop
Ide majd jön ha megalkottam az infók alapján a dolgot:

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

idovan:

return

impulzus:

return
Avatar
zb83
Biztosítékgyilkos
Hozzászólások: 69
Csatlakozott: 2008. október 24. péntek, 6:00

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

Oké. 0000000011059200-on megy a chip, így a timer-ed egy másodperc alatt 11059200-ig számolna el, ha tudna. De nem tud, mert csak 255-ig tud elszámolni.

Ha 1 másodpercenként kell kiírni a fordulatszámot, akkor én úgy csinálnám, hogy az int0-val számolnám a fordulatokat egy változóban. (int0: címke )

Timer0 megszakításban pedig az eltelt időt figyelem. Egy órajel ciklus ezen a frekvencián 0.0000000904224537 másodpercig tart. Tehát, mivel a timer 255ig tud elszámolni, a timer0 megszakításai között eltelt idő 255*0.0000000904224537=0.000023057725694másodperc. Állítsunk be 1024-es előosztást, így csak minden 1024. órajel fogja növelni a timer0 értékét, tehát 1024szer több idő fog eltelni a megszakítások között. Így 0.000023057725694*1024=0.023611111másodperc lesz az az idő, ami eltelik két timer0 megszakítás között. Ha másodpercenként szeretnéd kiíratni a fordulatot, akkor 42,35. timer0 megszakítás után kell kiíratni a cuccot, mivel 42,35*0.023611111=1. Tehát, mivel nem atomóráról beszélünk, a 42. túlcsordulás után kiírod a cuccot, de nem a megszakítás rutinban, hanem a fő programban.



dim fordulatok_szama as integer
dim timer0_tulcsordulas_szamlalo as integer
dim írd_ki_flag as byte
dim fordulat_per_perc as integer

do
if írd_ki_flag=1 then
írd_ki_flag=0
print fordulat
end if
loop

timer0_tulcsordulas:
if timer0_tulcsordulas_szamlalo=42 then
fordulat_per_perc=fordulatok_szama*60
fordulatok_szama=0
timer0_tulcsordulas_szamlalo=0
írd_ki_flag=1
else
incr timer0_tulcsordulas_szamlalo
end if

return

int0:
incr fordulatok_szama
return


én valahogy így csinálnám
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00

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

Hát ez most egy kicsit sült galamb annak ellenére hogy próbálkoztam.
De legalább tudom hogy 2 jelet ad egy fordulatra mert 6000 és 1600 közt mozgott. így még osztottam 2vel és változóba pakolgatom át hogy akkor kérdezzem le amikor akarom.
Még rakok bele egy kis szabályzást a hőmérséklet függvényében és kész is.
Köszönöm!
Válasz küldése