Tema: Re: Padekit pagaut bug'a (Arduino)
Autorius: Levas
Data: 2015-06-05 19:02:41
kaip suorganizuoti tavo impulsu skaiciavimai? Ar naudoji paprasta 
impulsa ar naudoji du signalus, kad matyti krypti.

Tam reikalui stovi ISR, kuris naudoja globalu volatile kintamaji?

Tas pats ISR turi ir tikrinti ar reikia keisti krypti. Nafig daryti 
amzina cikla ir tikrinti ar pasiekta 623 impulsai.

Pagrindiniam loop reikia daryti ka nors protingo arba ... miegoti. :)


On 2015.06.05 18:18, ig wrote:
> Programa pradejau ir paskui vel apkarpiau iki sito minimumo ir vistiek
> tas pats.
> Serial.print atsirado tik paskui - paziurejimui kas vyksta.
> Taip pat elgiasi ir be jo.
>
>
> O ka rekomenduotum vietoje Arduino ? (su salyga kad daugiau nieko nemoku
> ir reiktu persiorientuoti)
>
>
> Kadangi dar reikes atlikineti nemazai veiksmu (counterio impulsu trukmes
> matavimas, vidurkinimas, ziurejimas ar geras uzsiduotas greitis, jei
> negerai - pareguliavimai, etc. Tai masciau apie
> STM32F.....
>
> Nors greiciai kaip ir nera dideli - 1,2 kHz sita impulsu seka jei
> skaiciuot abu frontus.
>
>
>
> On 2015-06-05 17:57, Levas wrote:
>> nu tikriausiai supranti, kad dabar pasireiks visas arduino geris, nes
>> reikes aiskintis, kaip kas kokioje bibliotekoje ka priprogramino ir
>> kokius work arround panaudojo. Ir kokie pertraukimai panaudoti ir
>> kokie ne.
>>
>> :)
>>
>> Is esmes, jei nera matomu klaidu, gali buti ir memory leak ir kintamuju
>> uzglusinimas. Visa tai gana sunku issiburti.
>>
>> O siaip, jei programa tik tai ka parasei daro, reikia ja pasirasyti per
>> naujo be jokiu serial.println ir kito monstrisko reikalo. Nes karta
>> programa parasiau tokia, kur sunaudojo ... data 300% atminties. Ir ji
>> dalinai veike!
>>
>> On 2015.06.05 14:36, ig wrote:
>>> Paprasta programele seka variklio encoderio outputa, skaiciuoja
>>> "zingsniukus" ir kai padaromas pilnas apsisukimas (624 zingsniai),
>>> keiciama sukimosi kryptis. Ir taip "mojuoja" pirmyn atgal.
>>>
>>> Taciau karts nuo karto (mazdaug vienas is desimt ciklu), atsitiktinai
>>> variklis apsisuka maziau nei pilna apsisukima ir pradeda keisti krypti.
>>> pabandziau su serial.println isvedineti "c" reiksme kai keiciasi kryptis
>>> (t.y. if viduje - uzkomentuota eilute).
>>>
>>> Nuostaba tame, kad sutrikimo atveju visada buna c=512 (t.y. grazus
>>> binarinis skaicius, ar nesusije su duomenu tipais, overflowais kokiais
>>> ir pan., nors keiciau c tipa int, unsigned int, jokio skirtumo - visada
>>> 512. (624-512 = 92)
>>> (Pakeitus vienos krypties zingsniu skaiciu i belekoki kita pvz 1001,
>>> klaidos atveju metama visada 768 reiksme. 1001 - 768 = 233)
>>>
>>> Nuostaba numeris du, kad c=512 viduje if(c>623) salygos !!! T.y. kaip i
>>> ta "if" isvis patenkama, jei netenkinama salyga.  O ji netenkinama
>>> tikrai, nes klaidos atveju, butent tiek (~20%) ir nedasisukes iki pilno
>>> apsisukimo pradeda suktis atgal ir tada sukiojasi pirmyn atgal jau nuo
>>> naujos pozicijos. Vienintelis paaiskinimas, kad po salygos ispildymo
>>> staiga ivyksta 64911+512 interruptu, kad "c" owerflowinasi iki
>>> 512(624+64911 = 65535). Nu galima daleisti kad enkoderis kazkoki noisa
>>> ismeta ir sudurniuoja interuptai/skaiciavimas, bet kodel visa laika
>>> vienodai... o ne randomu.
>>>
>>> Zodziu biski konfuze. Gal kas turi minciu ?
>>>
>>>
>>>
>>> volatile unsigned int c = 0;  // counter
>>> volatile boolean dir = 1;     // direction
>>>
>>> int fwdrevPin = 9;
>>>
>>> void setup() {
>>>    attachInterrupt(0, tacho, CHANGE);
>>>    pinMode(fwdrevPin, OUTPUT);
>>> }
>>>
>>> void loop() {
>>>
>>> if (c > 623){
>>>
>>>     // Serial.println(c);
>>>
>>>     dir = !dir;                  // Switch direction
>>>     c = 0;                       // Reset counter
>>>     if (dir==0) {
>>>       analogWrite(fwdrevPin, 140);
>>>    }
>>>     else {
>>>       int t = 128 - torque;
>>>       analogWrite(fwdrevPin, 100);
>>>     }
>>> }
>>>
>>>
>>>
>>> }
>>>
>>> void tacho()
>>> {
>>>    c++;
>>> }
>>
>

-- 
Bye, Levas

--
http://www.vabolis.lt