Arduino Timer/Counter

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Arduino Timer/Counter

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

Sajnos úgy beállítani a három timert, hogy azok teljesen egyforma frekvencián menjenek, az nagyon nehéz. A 8 bites és a 16 bites nagyon más.
Az előbbi kódnál még az is a problémám, hogy ha a TCNT regiszterek állítása átkerül a loop-ba, akkor már a fázisok össze vissza tolódnak, ahogy éppen a program beböki az aktuális fázisszöget. Ahhoz, hogy jó legyen, ahhoz a TCNT regisztert mindig 0 fázisszögnél kellene átírni. De ha a program éppen olyankor írja át a regisztert, amikor nem 0 fázisszögnél áll, akkor összeadódnak, és szétcsúszik az együtt futás. Hiába azonos a frekvencia, az elcsúszó fázisszög miatt egy massza van a szkópon.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino Timer/Counter

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

Ilyenkor kel másik HW. után nézni!

Pl.: az arduino Mega, vigan el látná a feladatot:
• Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
– Four 16-bit Timer/Counter with Separate Prescaler, Compare- and Capture Mode
– Real Time Counter with Separate Oscillator
– Four 8-bit PWM Channels
– Six/Twelve PWM Channels with Programmable Resolution from 2 to 16 Bits

4 * 16-bit timer! Az első vezérelhetné interuptban a másik 3 indítását.
:idea:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino Timer/Counter

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

Timerek beállít és a start timerrel - közel egyidőben indítható.
(közel: néhány tized usec az utasításvégrehajtás)
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Arduino Timer/Counter

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

Igen, a Mega jó lenne. Kár, hogy megaméretű.
Kis vargabetűvel megoldottam a problémát.

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

void setup()
{
  TCCR1A = 0;
  TCCR1B = 0;
  OCR1A = 512;
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  TCCR1A = _BV(WGM10) | _BV(COM1A0);
  TCCR1B = _BV(WGM13) | _BV(CS10);
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A =  _BV(COM2A1) | _BV(COM2B1) | _BV(WGM10) | _BV(WGM11);
  TCCR2B = _BV(CS21);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  TCCR0A =  _BV(COM0A1) | _BV(WGM00) | _BV(WGM01) | _BV(COM0B1);
  TCCR0B = _BV(CS01);
}

void loop()
{
  OCR2A = (45);
  OCR2B = (45 + 126);
  OCR0A = (100);
  OCR0B = (100 + 126);
}
A korrekt jelalakhoz szükségem lesz arra, hogy XOR kapuval összekapuzzam a 0, és a 2-es timerek kimeneteit, mivel a kimenetén lévő PWM jelből így tudom csak kiszedni a megfelelő jelet. De még mindig kisebb vagyok egy Nanoval, és egy 14 lábú IC-vel, mint a Mega.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino Timer/Counter

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

Új IC: ATMega328PB : belül 2 timer kapuzva van :)
Válasz küldése