Autor |
Zpráva |
guchar
|
Napsal: stř 20.02.2019 14:52 |
|
Mazák
|
|
Registrován: 7.5.2015 Příspěvky: 7414 Bydliště: ČR Obrázky: 8
|
@jyrry V počátku čtení jsem toho hodně přeskočil. Se zpožděním se zač. "rozkoukávám". A mini-Orientovat. V záhlaví máš psáno " // AVR Timer CTC Interrupts Calculator // v. 8 " Plyne z toho že používáš: (Changelog) // v. 8 - ATtiny84 ? " ATtiny84 ATtiny24, ATtiny44. Timer0 - 8-bit Timer1 - 16-bit" ! Stránka neskáče sama přímo na OKÉNKO "About" . Na volbu (OKÉNKO) "About" nutno kliknout ! http://www.arduinoslovakia.eu/application/timer-calculator#tab_about
|
|
Nahoru |
|
|
|
|
|
jyrry
|
Napsal: stř 20.02.2019 18:36 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20822 Bydliště: Rakovník, CZ Obrázky: 0
|
guchar píše: ... Používám destičku "Arduino nano" nebo "Arduino Pro mini" s ATmega328P.
_________________ jyrry.webnode.cz
|
|
Nahoru |
|
|
jyrry
|
Napsal: stř 20.02.2019 18:41 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20822 Bydliště: Rakovník, CZ Obrázky: 0
|
ellet píše: ... Ta se ale nesmí potkat a nevidím tam žádný ošetření... No, to mě taky napadlo, že se to nějak potkává a ošetřit to (snad zatím) neumím Otáčení krokáče tak nějak funguje, zlobí spíš tohle: Kód: #define input 2 // vstup PWM #define output 4 // vystup PWM #define led 13 // pin LED const int hystereze = 30; const int neutral_uS = 1500; const int min_uS = 900; const int max_uS = 2080; int out_uS = 1500; int cislo; long int new_uS;
void setupTimer1() { noInterrupts(); // Clear registers TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TIMSK1 = 0; // Clear the interrupt mask // Hz (16000000/((OCR1A + 1) * 256)) OCR1A = 1249; // CTC TCCR1B |= (1 << WGM12); // Prescaler 256 TCCR1B |= (1 << CS12); // Output Compare Match A Interrupt Enable TIMSK1 |= (1 << OCIE1A); interrupts(); }
void setup() { pinMode(led, OUTPUT); // LED pinMode(input, INPUT_PULLUP); // input PWM pinMode(output, OUTPUT); // output servo setupTimer1(); attachInterrupt(0, puls_start, RISING); delay(500); Serial.begin(115200); }
void loop() { if (cislo > hystereze) { digitalWrite(led, HIGH); cislo = cislo / 40; if(new_uS < neutral_uS) { if(out_uS > min_uS) out_uS = out_uS - cislo; } if(new_uS > neutral_uS) { if(out_uS < max_uS) out_uS = out_uS + cislo ; } } else digitalWrite(led, LOW); }
void puls_start() { new_uS = micros(); attachInterrupt(0, puls_end, FALLING); }
void puls_end() { new_uS = micros() - new_uS; new_uS = min(new_uS, max_uS); new_uS = max(new_uS, min_uS); cislo = abs(new_uS - neutral_uS); tisk(); attachInterrupt(0, puls_start, RISING); }
ISR(TIMER1_COMPA_vect) { digitalWrite(output, HIGH); delayMicroseconds(out_uS); digitalWrite(output, LOW); }
void tisk() { Serial.println(cislo); }
Je to hýbání servem "jako hydraulickým válcem"; pořešil jsem to tak že načte impulz a hned po něm vygeneruje impulz pro servo, není tedy třeba ten výstup časovat timerem: Kód: #define input 2 // vstup PWM #define output 4 // vystup PWM #define led 13 // pin LED const int hystereze = 30; const int neutral_uS = 1500; const int min_uS = 900; const int max_uS = 2080; int out_uS = 1500; int cislo; long int new_uS;
void setup() { pinMode(led, OUTPUT); // LED pinMode(input, INPUT_PULLUP); // input PWM pinMode(output, OUTPUT); // output servo attachInterrupt(0, puls_start, RISING); delay(500); // Serial.begin(115200); }
void loop() { delay(10); }
void puls_start() { new_uS = micros(); attachInterrupt(0, puls_end, FALLING); }
void puls_end() { new_uS = micros() - new_uS; new_uS = min(new_uS, max_uS); new_uS = max(new_uS, min_uS); cislo = abs(new_uS - neutral_uS); vypocet(); puls(); // tisk(); attachInterrupt(0, puls_start, RISING); }
void vypocet() { if (cislo > hystereze) { digitalWrite(led, HIGH); cislo = cislo / 40; if(new_uS < neutral_uS) { if(out_uS > min_uS) out_uS = out_uS - cislo; } if(new_uS > neutral_uS) { if(out_uS < max_uS) out_uS = out_uS + cislo ; } } else { cislo = 0; digitalWrite(led, LOW); } }
void puls() { digitalWrite(output, HIGH); delayMicroseconds(out_uS); digitalWrite(output, LOW); }
void tisk() { Serial.println(cislo); }
_________________ jyrry.webnode.cz
|
|
Nahoru |
|
|
guchar
|
Napsal: stř 20.02.2019 20:48 |
|
Mazák
|
|
Registrován: 7.5.2015 Příspěvky: 7414 Bydliště: ČR Obrázky: 8
|
@jyrry Dík. Timer1 je u ATmega328P ten 16-bit (ty dva další Timers (0 a 2) jsou 8-bitové. Potom ale podle " Microcontrollers -- ATmega328P Arduino Uno, Arduino Pro Mini. ATmega48A, ATmega48PA, ATmega88A, ATmega88PA, ATmega168A, ATmega168PA, ATmega328 " - Tomuhle zatím nějak plně nerozumím. I když asi možná náhrada za ATmega328 je (picoPower) ATmega328P (A common alternative to the ATmega328 is the "picoPower" ATmega328P.) https://en.wikipedia.org/wiki/ATmega328 ) Každopádně bych měl cukání sáhnout po "Changelog: v. 3 - More ATmega328P microcontrollers + sorting" - Nestačilo by k otáčení věže rozlišeni délky impulzu s krokem 10 ms <150, 200> ?
|
|
Nahoru |
|
|
ellet
|
Napsal: stř 20.02.2019 22:24 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
jyrry píše: ..Otáčení krokáče tak nějak funguje, zlobí spíš tohle... Asi proto, že vlivem přerušení může dojít ke změně proměnných při výpočtu v loop(). Ale to druhý by snad mělo chodit. Ještě ty proměnný volatile a vyhodil bych i delay(10) jen pro lepší pocit (na funkci se to asi neprojeví). Taky bych uvažoval o načtení středový polohy v setup() místo tvrdé konstanty ale to už je zase o něčem jiným.
|
|
Nahoru |
|
|
ellet
|
Napsal: stř 20.02.2019 23:32 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
No, tak jsi mě donutil , to testnout. Řekl bych, že sketch_2 je použitelný ale asi bych to řešil úplně bez přerušení. Jestli to má být ale trochu i cvičení, tak proč ne.
|
|
Nahoru |
|
|
jyrry
|
Napsal: čtv 21.02.2019 7:54 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20822 Bydliště: Rakovník, CZ Obrázky: 0
|
ellet píše: ... Řekl bych, že sketch_2 je použitelný ... Slává Jo, mám to i s pulseIn ale to se mi nelíbí
_________________ jyrry.webnode.cz
|
|
Nahoru |
|
|
ellet
|
Napsal: čtv 21.02.2019 9:34 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
jyrry píše: ... to se mi nelíbí To beru , já určitě souhlasím s přerušením při čtení pulzu, bude přesnější, jen někdy to není úplně potřeba (není jen pulseIn). Ale hlavně - ať to jde dál podle představ!
|
|
Nahoru |
|
|
jyrry
|
Napsal: sob 23.02.2019 7:09 |
|
Moderátor serveru
|
|
|
Registrován: 28.2.2005 Příspěvky: 20822 Bydliště: Rakovník, CZ Obrázky: 0
|
ellet píše: ... (není jen pulseIn). ... Můžeš třeba jen naznačit? Měl jsem něco na věcech s PICy, možná to najdu... něco jako opakované čtení pinu a reakce na impulz...
_________________ jyrry.webnode.cz
|
|
Nahoru |
|
|
ellet
|
Napsal: sob 23.02.2019 20:14 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
Myslím to dřiv tak, že pokud ti funkce nevyhovuje, asi nebudeš první. Je proto dost reálný předpoklad, že něco v těch balících knihoven na netu, najdeš. Hodnota vrácená pulseIn se dá dál upravit (na př. přepočtem za cenu zpoždění, nebo zahodit nějaký nejnižší bit za cenu "hrubšího" rozlišení - bitshift ). Já osobně 1000 poloh na přejezd serva nikdy nepotřebuju (a chtěl bych vidět modeláře jak si říká - teď výškovku na 1652uS ). V řadě případů, při požadavku vlevo-stop-vpravo je, přesnost (a stabilita) hodnoty vrácené touto funkcí vlastně nadbytečná. Vlastní "tvorba", proč ne, taky používám někdy k zachycení hodnoty pinu assembler. Třeba realizace převodníku pwm na ppm vyjde celá v assembleru až školácky jednoduchá (ATtiny13, 4k. pro simulátor). Cesta k měření délky pulsu s maximální přesností je jen přes přerušení, s obsluhou jen toho co je nutný, to je jasný
|
|
Nahoru |
|
|
guchar
|
Napsal: ned 24.02.2019 4:49 |
|
Mazák
|
|
Registrován: 7.5.2015 Příspěvky: 7414 Bydliště: ČR Obrázky: 8
|
|
Nahoru |
|
|
ellet
|
Napsal: ned 24.02.2019 9:55 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
"Příkaz Pulse", jak píše autor prezentace, ve Wiringu neznám, funkce pulseIn by měla pracovat od 10uS (viz stránky Arduino). Je možné, že má vlastní konstrukci Pulse na kterou se omezení vztahuje (třeba i z důvodu ošetření zákmitů).
|
|
Nahoru |
|
|
guchar
|
Napsal: ned 24.02.2019 13:56 |
|
Mazák
|
|
Registrován: 7.5.2015 Příspěvky: 7414 Bydliště: ČR Obrázky: 8
|
|
Nahoru |
|
|
ellet
|
Napsal: ned 24.02.2019 14:56 |
|
Mazák
|
|
|
Registrován: 12.2.2016 Příspěvky: 1975 Bydliště: Vysočina, ČR
|
guchar píše: ... 4.2 Měření napětí už používá vyjádření-označení "pulseIn" ... Autor má trochu nepořádek v nadpisech. Ten nadpis (4.2 Měření napětí), patří až pod sekvenci s pulseIn. Ne, že by nešlo ze střídy a špičkového napětí měřených pulsů nějaké napětí spočítat (efektivní nebo střední hodnotu toho signálu) ale tím se v této práci nezabývá. Dál bych to ani nerozebíral, je to práce studenta technického směru. Jen jsem považoval za důležité upozornit na originální dokumentaci pro studium vestavěných funkcí jazyka Wiring.
|
|
Nahoru |
|
|
guchar
|
Napsal: ned 24.02.2019 16:18 |
|
Mazák
|
|
Registrován: 7.5.2015 Příspěvky: 7414 Bydliště: ČR Obrázky: 8
|
|
Nahoru |
|
|
Kdo je online |
Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 7 návštevníků |
|
Nemůžete zakládat nová témata v tomto fóru Nemůžete odpovídat v tomto fóru Nemůžete upravovat své příspěvky v tomto fóru Nemůžete mazat své příspěvky v tomto fóru Nemůžete přikládat soubory v tomto fóru
|
|
|