Arduino Timer/Counter

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
martinus115
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2010. december 12. vasárnap, 7:00

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

Szerintem annak, hogy hol helyezkedik el a kötélablak nincs jelentősége. Vagy mire gondolsz miért lenne?
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 »

Az imbolygó mozgást végző motor-excenterre gondoltam.
(vagy valamit nagyon benéztem...)
Az ide-oda mozgást nem forgásirányváltás csinálja, így alaphelyzetben 2 lehetőség adódik attól függően, hogy hol áll az excenter. A motor mindig egyirányba megy, de nem tudom eldönteni, hogy pont most húzni vagy eltolni fogja a vezetőt, ha nincs félfordulatos jelem valahonnan. (3 vagy 9 óránál áll) Ja, meg letekeredik a kábel, nem tudjuk, hogy (szemből) jobbra vagy balra van-e a maradék, az üres hely irányába kellene először mozdulni a vezetőnek.
Avatar
martinus115
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2010. december 12. vasárnap, 7:00

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

Mindig egy irányba forog a motor tehát, ha leáll újraindul akkor is folytatja a mozgását az éppen haladó irányba.
Avatar
martinus115
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2010. december 12. vasárnap, 7:00

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

Jól hangzik a Robert tippje, már csak a megvalósításhoz kellene help.

Akkor egy Hall senzorral lenne megoldva mintavételezés, ami négyszögjelet ad le.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Hát, akkor lehet olvasgatni:
Bascom: INT fejezet
Bascom: Timer részek...
http://avr.tavir.hu/modules.php?name=Co ... age&pid=18

És ha Bascom, akkor -> gyerünk át abba a fórumba :)
Avatar
martinus115
DrótVégénSzéndarab
Hozzászólások: 33
Csatlakozott: 2010. december 12. vasárnap, 7:00

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

C-hez arduinohoz van némi közöm, de bascomhoz semmi, ezért azt nem szeretném elkezdeni elölről :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Arduino alatt _rengeteg_ kompromisszumod lesz, és az erőforrásból kifuthatsz.
Egyetlen lehetőséged Arduino alatt:
- TIMER-t megtanulod hasznélni. Így lesz

- egy hardware számlálód 0...65535
- egy időzítőd mondjuk 0,5 sec-re
Az időzítő leketyeg, akkor kiolvasod a HW számlálót.

Ez arduinón túlmutató feladat, mert a TIMER-eket regiszterszinten és C nyelven kell már megfognod.
Na ez az, ami 1-2 hónap (megérteni és alkalmazni). Copy-Paste alapon 1-2 perc, de nem érted meg mitől megy....

Bevezető, elrémisztésnek:
http://www.mythic-beasts.com/~markt/ATmega-timers.html

http://www.engblaze.com/microcontroller ... prescaling

http://www.gammon.com.au/forum/?id=11504

És ezek az egyszerűbb, olvasható, magyarázatos oldalak!
Avatar
zoli_varga
DrótVégénSzéndarab
Hozzászólások: 20
Csatlakozott: 2009. november 9. hétfő, 7:00

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

Üdv!

Most még emésztgetem az arduino timer prescale "hackeket" de ha jól értelmezem akkor a D11 hez tartozó TCCR2B nincs hatással a milis() és delay() fv.-re.
TCCR2B = TCCR2B & 0b11111000 | 0x02 ; átállítja 3900 Hz re a PWM jelet?
A ~0.5 khz kevés áramszabályzáshoz. Még a ~4kHz is de az már valami. Vagy esetleg ~31Khz? HMMM..... Mindenféleképpen HW PWM kell.
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 milis/micros a Timer0-t használja....
Avatar
zoli_varga
DrótVégénSzéndarab
Hozzászólások: 20
Csatlakozott: 2009. november 9. hétfő, 7:00

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

Egy kicsit a terv kigondolatlannak tűnik.

A drót az 1,5 mm 15mm 1,5mm2 vagy mi láb, méter?

De egy biztos hogy egy közelítő képlettel ki kell számolnod mekkora lesz a dob átmérője a menet végén. Mivel nem asztalosok vagyunk hanem műszaki emberek ezért a mm-t veszem alapul. 15mm drótkötélnél:

Szóval a dob 300 mm, az első sorra fel tudsz tekerni
[(dob+kötélátmérő+0,5mm hiba)*pi] kötelet ez legyen K. Most megtudod hogy mondjuk a S=3*dob hosszúságú dobon jelen esetben (900mm) mennyi kötél fér el. L= K*S/[(kötélátmérő+0,5mm hiba)*2] . Ez az első sor. Mivel a következő sor az egymás mellé illesztett menetek érintőjére ül így a K' értéke K'=[(dob+kötélátmérő+{(n-1)*2*gyök3(kötélátmérő/2)}+0,5mm hiba)*pi]. L'=K'*S alapján mindig nőni fog a feltekert kötél mennyisége és a súlya, a dob teljes vastagsága........
Mivel nem vagyok mérnök én ebből a sorozatot már nem akarom és nem is tudom kifejteni, ezekkel a képletekkel viszont már lehet dolgozni. (kicsit sokat)

De egy feszítőgörgőn átvezetve a kötelet és a görgő tengelyén egy rés optót (egérből) meg egy tárcsát felszerelve máris impulzus számlálást tudsz végezni.
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

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

Sziasztok!

A gondom a következő:
A megszakítás során megáll a milisec-számláló.
A progimban egy enkóder jeleinek érkezésének idejét kell mérnem egy kezdőidőponthoz képest. Ebben az esetben gondot jelent ez a leállás, még akkor is, ha csak 1ms időt "veszítek" el. hiszen 1000 jelnél ez már 1 másodperces csúszást eredményez (a jeleknek 116,87582 ms-ként kellene érkezni)
Nem találok infót arról, hogyan tudom pontosan kiszámolni mennyi időt vesz igénybe az alábbi műveletsor. (16MHz-en jár a ATmega 328))

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

void signaltime()
{
  TimeOfSignal = micros();
  if (Mode != CalibrationMode)
   {
    action = 1;
   }
  SignalCounter = SignalCounter++;
}
Úgy gondolom, hogy a TimeOfSignal = (micros() + leallasideje); megfelelő megoldás lehetne ebben az esetben.

Előre is köszönöm a segítséget
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Hát bizony a milis() az INT alapú. És le is áll a számláló, mert INT alatt nem eshet be egy másik INT:(.

Sajnos itt valami emuláció kellene.
Hülye tipp:
- 2 Arduino.
- A 2. arduinon a INT1 lábon mérem az elején és a végén kiadott impulzust :)
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

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

Köszönöm Robert!

Sajna csak egy Arduinom van :-(
Viszont építettem más áramköröket, szerintem valamelyiket meg tudom buherálni, hogy egy szabad lábat tudjon használni. Írok egy progit rá, ami 116875us-ként változtatja a láb állapotát. Ezt fogja "encoder jelként" kapni a másik Arduino és meg is méri szerinte mekkora az időkülönbség. És máris okosabak leszünk :-)
Köszönöm az ötletet!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Tipp2:
- PC hangkártyára küldd a jelet.
- oszcilloszkóp programmal vagy hangrögzítővel mérhetsz időt....
- simán az INT be és az INT ki esetén egy-egy jelváltást kiküldesz.

Nos?
Avatar
BraskoS
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2011. április 12. kedd, 6:00

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

Eszembe jutott a Soundcard Oscilloscope nekem is, de én arra gondoltam, hogy ennek a jelgenerátorával küldenék négyszögjelet az Arduinora a másik Arduino helyett.
De azt hiszem a te ötleted egyszerűbben használható.
Még az is lehet, hogy mindet kipróbálom :-)
Válasz küldése