Tema: Re: Padekit pagaut bug'a (Arduino)
Autorius: Levas
Data: 2015-06-05 19:07:02
nu jei dar pvz. tacho impulsai labai labai labai greiti, tai juos 
paduodi i harwarini counteri ir softe tik tikrini overflow (ar gal 
overflow interupta darai). Tada softas tik is viso dirba reverso metu.


On 2015.06.05 19:02, Levas wrote:
> 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