[elektro] rotary encoder, mit csinálok rosszul?

uprogc . uprogc at gmail.com
Mon Jan 2 13:33:41 CET 2017


Volt nehany HW-es prellmentesites probalkozasom is. Nekem sehogy sem akart
rendesen mukodni. Kell nezni az osszes allapotot ahogy korabban itt irtak,
az a megoldas nagyon jo.

Az ocska minosegu enkoderrel ugy is ki fog hagyni lassu forgatas eseten...


Szabi

2017-01-02 14:27 GMT+02:00 Gabor Jordan <jordang.elektro at gmail.com>:

> Hello,
>
> Prell miatt. Az optikaihoz nem kellett, csak ennél a mechanikusnál raktam
> bele próbálni, de nem jó. Az optikainál nem is lehet, mert a 200 impulzus /
> fordulat enkódert megpörgetem, ott nem lehet várakozni. Itt most lehetne,
> ideje lenne rá, nem gond, hogy késleltetés van a megszakításban, ... csak
> éppen így sem jó, úgyhogy felesleges.
>
> Kondit este megpróbálom. Megpróbálok olyan RC tagot keresni, amivel még a
> gyorsabb forgatás is éppen látszik a szkópon.
>
> ÜDV JG
>
>
> 1/2/2017 12:08 PM keltezéssel, elight írta:
>
>> Én azt nem értem
>> minek a delay?
>>
>> Ha 90 fok eltolt fázisú a jel
>> akkor amikor az IT bejön 'A' lábról
>> a 'B' lábon elvileg már régóta stabil
>> szintnek kellene lejönnie..
>>
>> Az meg hogy többször is lefut az IT.
>> akkor nem okoz gondot , ha
>> emlékszel az előző állapotra és
>> úgy értékelsz ki.
>>
>> tehát kell a kettős bittároló:
>> char    enc_bitek;
>> char    enc_bitek_old;
>>
>> És a bitfázisokat mindig le kell ellenőrizni minden IT-ben,
>>    azonnal, hogy ne fogd meg a proc futását..
>>
>> ( de ez egy belőtt könyvtárban már tényleg
>> készen is kapható. )
>>
>> Üdv István
>>
>>
>>
>> 2017-01-02 12:00 keltezéssel, Bali Zoltan írta:
>>
>>> B.U.É.K.  mindenkinek!
>>>
>>> SW-esen filterezni? Tán, ha elég gyors
>>> a uC, megoldható. Esetleg ennek a mintájára:
>>> <https://docs.broadcom.com/docs/AV02-0096EN>
>>> A Digital Noise Filter rész.
>>>
>>> FPGA-n megcsináltam, működött szépen.
>>> Persze uC-n erőforrás igényes, de mondjuk a
>>> prell is zabál az IT-n keresztül.
>>>
>>> Most látom, IT-be Delay-t rakni? :)
>>> Akkor már érdemesebb lenne, a SW digitális
>>> filterre pazarolni.
>>>
>>> Üdv.  Zoli
>>>
>>>
>>> 2017.01.02. 10:55 keltezéssel, Gabor Jordan írta:
>>>
>>>> ÜDV,
>>>>
>>>> Rotary encoder, PIC18F67K90 B3 és B4 lábain csücsül, felhúzva 47k-val
>>>> kívülről.
>>>>
>>>> A lenti megszakítás (XC8) kezelné le, de nem jó. Kb. 10ből 8szor jól
>>>> lép, de 2szer vagy rossz irányba, vagy többet. Az ENC1 lefutóél csinál
>>>> megszakítást és nézem az ENC2 láb hogyan áll. Mindig is így csináltam és
>>>> ment. Optikai enkóderrel most is megy. Így is (lassabban) meg úgy is, ha
>>>> kiveszem a késleltetéseket. Hiba nélkül. Gondolom a mechanikusnál a
>>>> prell-el vagy kontakt-al van gond. Szkópon nem is túl szép a kapcsolás,
>>>> látszik a prell, de lemegy még a késleltetések előtt (legalábbis amit
>>>> látok). Mégsem jó, hiába játszom az időzítésekkel.
>>>>
>>>> Más tipusú enkoderrel jó volt (bourns), de amit most használni akarok,
>>>> nem jó. Van több darab, cseréltem is, de nem jó.
>>>>
>>>> Hogy illik megbízhatóan olvasni ezeket?
>>>>
>>>> 1 szintű megszakítást használok, a megszakítás kezelést elvileg nem
>>>> szakítja meg másik megszakítás (legalábbis az XC9 azt mondja ne
>>>> kapcsolgassam a kódban a GIE-t, ő megteszi).
>>>>
>>>> Köszönöm,
>>>>
>>>> ÜDV JG
>>>>
>>>> *****
>>>>
>>>>
>>>>     if (INTCON3bits.INT3IF==1) // interrupt from rotary encored
>>>>         {
>>>>         INTCON3bits.INT3IF=0;
>>>>         __delay_us(50);
>>>>         if (ENC1_PORT==0)
>>>>             {
>>>>             __delay_us(50);
>>>>             if (ENC1_PORT==0)
>>>>                 {
>>>>                 __delay_us(50);
>>>>                 if (ENC1_PORT==0)
>>>>                     {
>>>>                     if (ENC2_PORT)
>>>>                         {
>>>>                         //LCDPutCmd(01);
>>>>                         //LCDPutStr("vissza");
>>>>                         pwm = pwm - 16;
>>>>                         }
>>>>                     else
>>>>                         {
>>>>                         //LCDPutCmd(01);
>>>>                         //LCDPutStr("oda");
>>>>                         pwm = pwm + 16;
>>>>                         }
>>>>                         update = 0x01;
>>>>                     }
>>>>                 }
>>>>             }
>>>>         }
>>>>
>>>> *******
>>>>
>>>> -----------------------------------------
>>>>          elektro[-flame|-etc]
>>>>
>>>>
>>>>
>>> -----------------------------------------
>>>          elektro[-flame|-etc]
>>>
>>>
>> -----------------------------------------
>>          elektro[-flame|-etc]
>>
>
> -----------------------------------------
>          elektro[-flame|-etc]
>


More information about the Elektro mailing list