Fordulatszám mérés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

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

DOGMAN írta:timer0 nem adja ki 250 ms-ra

ezt a programot használd: http://www.tanyalap.hu/Moslekos/dogman/ ... 0Timer.exe

Kép

Kép
Szia Dogman!
Fel tudnád rakni ezt a programot mégegyszer valahova? Ezt keresem már fél éve, mivel az enyém elveszett...
Hálásan köszönöm előre is!
Geht nicht, Gibt's nicht!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Felraktam neked!
File csere-bere: Avr Timer.zip
:wink:
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

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

kapu48 írta:Felraktam neked!
File csere-bere: Avr Timer.zip
:wink:
Köszönöm Kapu!
Minden bűnöd megvan bocsájtva! (Amúgy nem is volt...:D )
Geht nicht, Gibt's nicht!
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

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

kapu48 írta:Felraktam neked!
File csere-bere: Avr Timer.zip
:wink:
Közben megtaláltam a 1.25-ös verziót is, ez már fejlettebb! Felrakom a file
csere-bere alá!
Geht nicht, Gibt's nicht!
s3seawa
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2013. november 4. hétfő, 11:43

Re: Fordulatszám mérés

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

Sziasztok.
Én is próbáltam írni egy minta programot ami vissza küldi a com porton az értéket.
Suzuki swift 1.3 (95)be kerülne ott 1rpm alatt 4 jelet küld így ugye 15kell felszorozni és jó is mert megnő a fordulatszám kijelzés felbontása , 15 lépés lesz 60 helyet.

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

$regfile = "attiny2313.dat"
$baud = 4800

Config Pind.1 = Output
Config Pinb.0 = Output
Config Pind.2 = Input

Enable Interrupts
Enable Int0
Enable Timer1
Dim Wtime As Byte
Dim Szam As Integer
Dim Zval As Integer

Wtime = 100

Config Timer1 = Timer , Prescale = 8
Config Int0 = Rising
On Timer1 Pulse
On Int0 Setting
Szam = 0
Waitms 10

Do
Waitms 10
Loop

Setting:
   Szam = Szam + 1
   Zval = Szam * 15
Return


Pulse:
  Set Portd.1
  Print Szam ; " befutott jelek szama"
  Print Zval ; " RPM"
  Reset Portd.1
  Szam = 0
  Toggle Portb.0
Return



End
Pár véleményt várnék (foglalkozgattam avrrel csak eddig c-ben most tértem átt a bascomra mert cben kevesebb sikerem volt :D ).
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Fordulatszám mérés

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

A pulse megszakitasod tul hosszu a printek miat!
Ezeket atraknam a do - loop ciklusba.
8)
Avatar
irak
Biztosítékgyilkos
Hozzászólások: 73
Csatlakozott: 2005. november 2. szerda, 7:00

Re: Fordulatszám mérés

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

Kapu48-nak igaza van.
Pláne hogy üres a főciklus:D
A külső int megszakítás is detto, miért nem csak növeli a számlálót?
Kijelzés elött elég 1x felszorozni az eredményt.

Amúgy az időalapod hogy jön össze?
16 bites a timer1, x8...akárhogy számolom 524288 Hz külső órajellel jön csak ki az 1Hz-s irq.
A köztes port állítgatásoknak meg bizti meg van az oka, csak mi nem látjuk.
s3seawa
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2013. november 4. hétfő, 11:43

Re: Fordulatszám mérés

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

16bit 4Mhz 64 leosztás a számoló szerint 1 sec akkor az már jó nekem. (vagy 16mhzen 16bit timer 256os leosztás ha jól használtam a programot..)
A kapcsolgatás meg csak egy ledet kapcsolgat.
tehát az általatok javasolva át írtam. Tehát két adatot tudnék elvileg mérni ugye? Esetleg ha lenne adc bemenetem akkor azt hova kéne írni m h működjön pl a timer0-al csak nézzen rá vagy mi?

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

$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 9600

Config Pind.1 = Output
Config Pinb.0 = Output
Config Pind.2 = Input

Enable Interrupts
Enable Int0
Enable Int1
Enable Timer1
Dim Szam As Integer
Dim Zval As Integer
Dim Szam1 As Integer
Dim Xval As Integer

Config Timer1 = Timer , Prescale = 64
Config Int0 = Rising
Config Int1 = Rising
const Timer1Reload = 62500
On Ovf1 Pulse
On Int0 Interupt0
On Int1 Interupt1

Szam = 0
Waitms 10
Print "Test duma"

Do
Waitms 500
  Set Portd.1
  Print Zval ; " RPM"
  Print Xval ; " RPM 2 " ; Szam1 ; " jel"
  Reset Portd.1
Loop

Interupt0:
   Szam = Szam + 1
Return

Interupt1:
   Szam1 = Szam1 + 1
Return

Pulse:
  Zval = Szam * 15
  Xval = Szam1 * 15
  Szam = 0
  Szam1 = 0
  Toggle Portb.0
Return


End
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: Fordulatszám mérés

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

Szervusz s3seawa!
Amint az írásodból kivettem, egy négyütemű autóhoz szeretnél egy motorfordulatszám mérőt készíteni, amit soros porton monitorozni szeretnél.
Lenne nagy hirtelen két észrevételem.
1. Fentebb írtad, hogy 4 impulzus jut 1 fordulatra. Nos ez hibás feltételezés csak 2 impulzus jut 1 fordulatra.
2a. 4MHz-es órajel, 64-es leosztás, 16bit-es timer. Eredmény: 1sec, ha a timer1-et H0BDC (dec 3036)-ról indítod.
2b. 16MHZ-es órajel, 1024-es leosztás, 16bit-es timer. Eredmény: 1sec, ha a timer1-et HC2F7 (dec 49911)-ről indítod.

Amit tudnék javasolni:
- Csinálsz egy 1sec-os megszakítást a timer1 segítségével. (A megszakításban a számláló kezdőértékét mindig meg kell adni.
- Figyelsz egy megszakítás bemenetet (INT0, vagy INT1). Itt csak egy változó értékét növeled (incr impulus)
- Timer1 túlcsordulásakor kiolvasod az impulzusok számát, lemented, majd nullázod
- Az impulzusok számából kiszámolod a fordulatszámot.
Pl.: Alapjárat 500ford/perc = 8,33ford/sec = 16,66impulzus/sec
Viszont az AVR byte változóval csak egész számokat tud kezelni. Visszaszámolva pontatlan fordulatszámot kapnál vissza.
1impulzus/sec = 0.5ford/sec = 30ford/perc (maximum ekkora a felbontásod).
Ha pontosabb értéket szeretnél, növeld a timer1 idejét.
Do-Loop ciklusban kiírod a mentett fordulatszám értékét.

Ez csak egy elvi felépítés és fejben elgondolt elképzelés, ami hibákat is tartalmaz(hat) de én így kezdenék neki.

Ha lenne ADC bemeneted, akkor a "Config ADC" paranccsal konfigolod. De max 5V kerülhet a bemenetre! Bascom súgót nézd meg hozzá :wink:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Fordulatszám mérés

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

A pontossago novelheted ha pl. 10sec-ig mered az impulzusokat.
A 4MHz szerintem keves lessz, ide gyorsabb mukodes kel.
Ha hasznalsz soros komunikaciot, baud hibaszazalekra is figyelni kel.
Ezert inkabb 14.74MHz orajelet ajanlok.
s3seawa
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2013. november 4. hétfő, 11:43

Re: Fordulatszám mérés

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

A soros kommunikáció csak addig lesz benne amíg nem érkezik meg az lcd hozzá (2*16 karakter), így az kiesik amint meg van az lcd.
Szuzukim elektromos megszakítású rotoros gyújtással van és mivel írtad hogy nem 4 hanem 2 megnéztem a szerviz könyvet miként veszi le a rotor egy fordulata a motor két fordulatával bír tehát nem volt jó a 15 de ha a timert felezem tehát 0,5sec eként nulláza a dolgot marad a 15ős felbontásom.
Timer1 ideje nem lehet nagyobb hisz nem fél percenként akarok látni egy fordulatszámot én is gondoltam rá de 1sec vagy a fele a jó.

Másik gondom ,hogy kéne egy olyan változó is nekem ami 0,00 ként jelenik meg.
ezt találtam

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

Config Single = Scientific , Digits = x

Single értéke így deklarálva jónak tűnik. X= pl 2 vel így a megjelenése jó lesz.

ui.: most egész szépen teszi a dolgát a program. :)
Cél valami ilyen lenne de majd szépen lassan amint sikerül mindent egyesével megcsinálni:
https://www.youtube.com/watch?v=O25yMblj-rk
Atmega8-ra fogok váltani amint minden kis rész össze jön. Addig tanulgatni jó lesz az attiny2313 is.... :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Fordulatszám mérés

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

LCD még rosszabb és időigényesebb a kiírás!
Egy sima CLS: 80 msec! Egy karakter: 2-4 msec lehet!

Single-t felejtsd el. Pontos, de baromi erőforrásigényes. Nézd meg az órajeligényt a Bascom szimulátorban.

Mérési tipp:
Párhuzamosan, átfedésben fusson négy számlálásod:

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

+------------+
   +------------+
      +------------+
         +------------+
            +------------+
Ezen egyes idők alatt _beesett_impulzust számolod. És az utolsó 4 eredményét átlagolod. Így egy időegység alatt _négy_ párhuzamos mérésed van!
s3seawa
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2013. november 4. hétfő, 11:43

Re: Fordulatszám mérés

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

Szerintem a másik használható dolog h megmérem két impulzus között az időt , 1rpm ugye akkor 500ms.
Erre is írtam magamnak egy mintát. Single értéket nem tudtam használni a nagy számok a pontosság miatt vannak.
Tudom ,hogy erőforrás igényes de nem hiszem ,hogy ennél pontosabb lehet bárhogyan is vagy ,hogy kell. :D
0-1000 1esével lépked 1000-2000 3asával azt 6 azt 9és így tovább...
Azt is tudom h így másra nem használható az avrem. 8O
Kírás lcd-re vagy com-porta ami kényes azt kellene majd optimizálnom...

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

$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 9600

'Config Pind.6 = Output
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Rising
Config Pind.1 = Output

Dim Wtime As Integer
Dim Timercounter As Word
Dim Ertek0 As Word
Dim Ertek1 As Dword


On Capture1 Captmr

Wtime = 500
Timercounter = 0

Enable Interrupts
Enable Capture1

Do
  Ertek0 = Capture1 * 16
  Ertek1 = 500000000 / Ertek0
  Ertek1 = Ertek1 * 3
  Ertek1 = Ertek1 / 100
  Waitms Wtime

  Set Portd.1
  Print "pwidth: " ; " " ; Ertek1 ; " RPM"
  Reset Portd.1

Loop

Captmr:
  Timercounter = Capture1
  Timer1 = 0
Return

End
Avatar
GPeti
Bitmanipulátor
Hozzászólások: 131
Csatlakozott: 2011. március 3. csütörtök, 7:00

Re: Fordulatszám mérés

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

Kicsit lehet csalni hogy a számok egyenletesebbnek tűnjönek, aluláteresztő, átlagoló szűrővel itt egy példa, a 10 meg a 10+1 (11) tetszés szerint változtatható:

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

meanb = meanb * 10
        meanb = meanb + temperature_a                                         '"lowpass filter"
        meanb = meanb / 11                                      
        temperature_a = meanb
Válasz küldése