TIMER-ek pontossága
-
- Újonc
- Hozzászólások: 8
- Csatlakozott: 2017. május 26. péntek, 12:02
TIMER-ek pontossága
Elvileg egy Arduino 2 darab TIMER-ét elindítva, azok egymáshoz képest fázishiba nélkül ugyanabban a fázisban, órajelről órajelre futnak az idők végezetéig.
Egy PI metaldetector építése során gerjesztő és mintavevő impulzus előállítására használva azonban fáziszavart tapasztaltam - azaz a két TIMER futásakor kicsit ingadozik úgy 8-10 másodpercenként a fázisuk. Ha ugyanazt a két 100Hz frekvenciájú négyszögjelet digital Write HIGH és digitalWrite LOW utasításokkal, delaymicrosecunds késleltetésekkel állítottam elő egy ciklusban, akkor ez a fáziszaj jelentősen kisebb lett.
void setup() {
noInterrupts();
CLKPR = _BV(CLKPCE);
CLKPR = _BV(CLKPS1); // órajel 4 osztás
interrupts();
pinMode(11, OUTPUT);//1. négyzögjel
pinMode(5, OUTPUT);//2.négyszögjel
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
TCCR1A = _BV(WGM11) | _BV(COM1A1);
TCCR1B = _BV(WGM13) |_BV(CS10) | _BV(WGM12);
ICR1 = 40000;
OCR1A = 2000;//1. négyszögjel hossza
TCNT1 = 0;
TCCR3A = _BV(WGM31) | _BV(COM3A1);
TCCR3B = _BV(WGM33) | _BV(CS10) | _BV(WGM32);
ICR3 = 40000;
OCR3A = 200;//2. négyszögjel hossza
TCNT3 = 37860; //2. négyszögjel időpontja
sei();}
void loop() {
digitalWrite(13,HIGH);// hogy ne legyen üres a loop
delay(500);
digitalWrite(13,LOW);
delay(500);}
Valamit elrontottam?
Vagy bizonytalanság van a TIMER futásában?
Egy PI metaldetector építése során gerjesztő és mintavevő impulzus előállítására használva azonban fáziszavart tapasztaltam - azaz a két TIMER futásakor kicsit ingadozik úgy 8-10 másodpercenként a fázisuk. Ha ugyanazt a két 100Hz frekvenciájú négyszögjelet digital Write HIGH és digitalWrite LOW utasításokkal, delaymicrosecunds késleltetésekkel állítottam elő egy ciklusban, akkor ez a fáziszaj jelentősen kisebb lett.
void setup() {
noInterrupts();
CLKPR = _BV(CLKPCE);
CLKPR = _BV(CLKPS1); // órajel 4 osztás
interrupts();
pinMode(11, OUTPUT);//1. négyzögjel
pinMode(5, OUTPUT);//2.négyszögjel
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
TCCR1A = _BV(WGM11) | _BV(COM1A1);
TCCR1B = _BV(WGM13) |_BV(CS10) | _BV(WGM12);
ICR1 = 40000;
OCR1A = 2000;//1. négyszögjel hossza
TCNT1 = 0;
TCCR3A = _BV(WGM31) | _BV(COM3A1);
TCCR3B = _BV(WGM33) | _BV(CS10) | _BV(WGM32);
ICR3 = 40000;
OCR3A = 200;//2. négyszögjel hossza
TCNT3 = 37860; //2. négyszögjel időpontja
sei();}
void loop() {
digitalWrite(13,HIGH);// hogy ne legyen üres a loop
delay(500);
digitalWrite(13,LOW);
delay(500);}
Valamit elrontottam?
Vagy bizonytalanság van a TIMER futásában?
Re: TIMER-ek pontossága
Én kipróbálnám Arduino nélkül. Látom, hogy AVR GCC hívásokat is használsz, de az Arduino környezet belefordít mindenféle szemetet (millis, serial event, stb). Csinálj egy Atmel Studio projectet, és próbáld azzal!
-
- Újonc
- Hozzászólások: 8
- Csatlakozott: 2017. május 26. péntek, 12:02
Re: TIMER-ek pontossága
Elég nehéz volt számomra az arduino nano-mega világba is betekintést nyernem, nincs nagyon időm-energiám másikba belevágni, jövő héten építkezés is kezdődik itthon...
Ez egy mega project, azért van 4-el osztva az órajel, hogy negyed microsecundum osztással tudjam egymáshoz képest állítani a fázisukat. A digitalwrite HIGH-LOW-Delaymicroseunds módszerrel viszonylag tűrhetően működik a gép, de csak 1 microsecundum osztással tudom tologatni egymáshoz képest a négyszögjeleket.
Ez egy mega project, azért van 4-el osztva az órajel, hogy negyed microsecundum osztással tudjam egymáshoz képest állítani a fázisukat. A digitalwrite HIGH-LOW-Delaymicroseunds módszerrel viszonylag tűrhetően működik a gép, de csak 1 microsecundum osztással tudom tologatni egymáshoz képest a négyszögjeleket.
-
- Újonc
- Hozzászólások: 8
- Csatlakozott: 2017. május 26. péntek, 12:02
Re: TIMER-ek pontossága
És ha kikapcsolnék minden megszakítást és felesleges funkciót? Ennek a mega-nak csak az a feladata hogy az adóimpulzusokat generálja, egy nano van a mérőegységben. Tehát semmilyen egyéb funkcióra nincs szükségem, csak a pontos és szabályozható TIMER futásokra.
-
- Újonc
- Hozzászólások: 8
- Csatlakozott: 2017. május 26. péntek, 12:02
Re: TIMER-ek pontossága
Kiszámoltam, hogy a fáziszaj mértéke akkora, mintha kb 1-1 órajellel kb 10 másodpercenként közelebb-távolabb lépdelne párat a 2 négyszögjel. (Ez nekem a kimeneten már +- 50mv ingást okoz.
Re: TIMER-ek pontossága
Ha ennyire pontos órajelre van szükséged, akkor ne programozd, hanem építs egy megfelelő kvarcoszcillátort, és annak a jelét osszad le az általad kívánt frekvenciára.
Vagy ha ennél is pontosabb kell, tehetsz még bele egy pll szabályozást is, és akkor még fáziseltérés sem lehet.
Vagy ha ennél is pontosabb kell, tehetsz még bele egy pll szabályozást is, és akkor még fáziseltérés sem lehet.
Re: TIMER-ek pontossága
Neki olyan négyszögjelekre van szüksége, ahol a jelek frekvenciája azonos. Az egymáshoz való fázisukat és a kitöltésüket szabályozni kell. Ezt hagyományosan megépíteni elég rázós és sok esetben több fáziszaj kerül a rendszerbe, mint amivel jelenleg küzd.
-
- Újonc
- Hozzászólások: 8
- Csatlakozott: 2017. május 26. péntek, 12:02
Re: TIMER-ek pontossága
Fast pwm = fáziszaj
phase correct pwm = nincs fáziszaj!!!!!
(cipőt a cipőboltból....)
phase correct pwm = nincs fáziszaj!!!!!
(cipőt a cipőboltból....)