Odeslat nové téma Odpovědět na téma  [ Příspěvků: 32 ]  Přejít na stránku Předchozí  1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: stř 20.02.2019 14:52 
Mazák
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
 Profil Soukromé album  
 
 
PříspěvekNapsal: stř 20.02.2019 18:36 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: stř 20.02.2019 18:41 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

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 :oops:
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
 Profil  
 
PříspěvekNapsal: stř 20.02.2019 20:48 
Mazák
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
 Profil Soukromé album  
 
PříspěvekNapsal: stř 20.02.2019 22:24 
Mazák
Mazák
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: stř 20.02.2019 23:32 
Mazák
Mazák
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: čtv 21.02.2019 7:54 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

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á :-D
Jo, mám to i s pulseIn ale to se mi nelíbí :-)

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
PříspěvekNapsal: čtv 21.02.2019 9:34 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
jyrry píše:
... to se mi nelíbí :-)
To beru :D , 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
 Profil  
 
PříspěvekNapsal: sob 23.02.2019 7:09 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: sob 23.02.2019 20:14 
Mazák
Mazák
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: ned 24.02.2019 4:49 
Mazák
Mazák

Registrován: 7.5.2015
Příspěvky: 7414
Bydliště: ČR
Obrázky: 8
Nějaký ten sketch, k inspiraci pro měření RC impulzů
PulseMeter - přípravek s výstupem 13 + 2 LED, AT89C2051
http://www.bezstarosti.cz/jungle/puls/puls.htm
http://www.bezstarosti.cz/jungle/puls/puls.asm
Reading PWM Signals From An RC Receiver With Arduino
http://www.camelsoftware.com/2015/12/25/reading-pwm-signals-from-an-rc-receiver-with-arduino/
How to Get an Arduino Micros() Function With 0.5us Precision
https://www.instructables.com/id/How-to-get-an-Arduino-micros-function-with-05us-pr/

- měření otáček 0 až 166 Hz (9900 ot./min.), Arduino Nano 328P,
mimo další pozn.: " ... příkaz Pulse spolehlivě funguje do 1kHz ..."
http://www1.fs.cvut.cz/stretech/2017/sbornik_2017/pdf/46.pdf
Jaksi jsem tam neviděl (možná přehlédl) rozbor - ošetření možných zákmitů magnetického jazýčku.


Nahoru
 Profil Soukromé album  
 
PříspěvekNapsal: ned 24.02.2019 9:55 
Mazák
Mazák
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: ned 24.02.2019 13:56 
Mazák
Mazák

Registrován: 7.5.2015
Příspěvky: 7414
Bydliště: ČR
Obrázky: 8
@ellet Vyjádření "Pulse" použil autor Ondřej Nevosad v kap. 6. Závěr. V 4.1 Měření otáček a 4.2 Měření napětí
už používá vyjádření-označení "pulseIn" jak v TEXTU tak v SKETCHs příkazech v souladu s
https://www.arduino.cc/en/Reference.PulseIn
https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/
- Věta: "Metoda měření délky periody byla vybrána kvůli jednoduché programové realizaci
příkazem Pulse (pozn.: pulseIn(pin value), které spolehlivě funguje do 1kHz."
tedy platí pro jeho výrobek, aniž by rozváděl proč. Nebo uvedl zmínku o možných úpravách-změnách.
==edit02 Arduino PulseIn versus PulseInLong podrobný popis, včetně zdrojových kódů EN
https://www.best-microcontroller-projects.com/arduino-pulsein.html


Nahoru
 Profil Soukromé album  
 
PříspěvekNapsal: ned 24.02.2019 14:56 
Mazák
Mazák
Uživatelský avatar

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
 Profil  
 
PříspěvekNapsal: ned 24.02.2019 16:18 
Mazák
Mazák

Registrován: 7.5.2015
Příspěvky: 7414
Bydliště: ČR
Obrázky: 8
Když vkládal SKETCH - obrázek, chtěl jej dát na konec 4.1 Místo je na začátku 4.2 To se stane i v lepších rodinách
- Šlo o prezentaci na workshopu. Přihlášení a výběr prací byl ponechán na uvážení vedení středních škol.
Neb jde o reprezentaci školy, mělo to jít přes připomínky spolu-studentů a vedení. Taky jim to uteklo. njn
https://aktualne.cvut.cz/tiskove-zpravy/20170606-prezentace-odbornych-projektu-stredoskolaku-to-je-strtech-2017-na-cvut-v


Nahoru
 Profil Soukromé album  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 32 ]  Přejít na stránku Předchozí  1, 2, 3  Další

 


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

Hledat:
Přejít na:  

 

  Powered by phpBB® Forum Software © phpBB Group  Český překlad – phpBB.cz 

 

NAVRCHOLU.cz