Heidenhain TE-355-A => Arduino => EasyCAT => LinuxCNC
Tak tu mám další pokračování. Po drobném zápasu, se mi podařilo rozchodit externí GPIO MCP23S17 a dostal jsem se k analogovým vstupům pro potenciometry FEED a SPEED.
Říkal jsem si, že bych posbíral třeba 100 hodnot a zprůměroval je. Následně bych spočítal maximální odchylku od střední hodnoty a vyhodnocoval, zda už se jedná o chybu hardwaru, nebo o rychlý pohyb ruky. Ale nechci vymýšlet kolo.
Nejdříve to ukazovalo šílený rozptyl a kmitání. Po prostříkání Kontoxem se potenciometr začal chovat umírněněji.
Ovšem při zvětšení hodnoty potenciometru stále kmitají.
Zkusil jsem potenciometry odpojit:
Poté jsem do analogového vstupu připojil GND:
a nakonec 5V:
Řekl bych, že na požadovanou funkci je rozkmit 0.4% v pohodě. Ovšem těmito potenciometry nebudu řídit nějakou počítačovou hru, ale CNC stroj. Bylo by docela nepříjemné, kdyby se z ničeho nic při požadavku na drobné zvýšení FEED stroj nečekaně zrychlil daleko víc a nebo aby z důvodu stárnutí potenciometru stroj začal jezdit trhaně. Jak se v praxi řeší odcházení potenciometrů? Softwarovým filtrem? Softwarovým hlídáním hodnot, které vybočují z řady?Říkal jsem si, že bych posbíral třeba 100 hodnot a zprůměroval je. Následně bych spočítal maximální odchylku od střední hodnoty a vyhodnocoval, zda už se jedná o chybu hardwaru, nebo o rychlý pohyb ruky. Ale nechci vymýšlet kolo.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
Dík za radu.
Zkoušel jsem si s tím lowpass filtrem hrát. Přepsal jsem si ho do Arduina a zkoušel, jak se to bude chovat při různých hodnotách gain. Neustále je to kompromis mezi vyhlazením při záchvěvu a reakcí na požadovanou hodnotu. Upravil jsem si ten lowpass filtr tak, že při zvýšení hodnoty má nižší gain než při snížení rychlosti. Spoustu operátorů používá poťák FEED místo TOTAL STOPu a tak potřebuji aby reakce na snížení rychlosti byla okamžitá.
Takto se to chová při otáčení rukou: A takto seto chová při skokových změnách (šroubovákem zkratuji výstup z encoderu s 5V a GND): Na vyhlazení vln, které jsou vidět až po velkém zvětšení se lowpass filtr nedal použít, tak jsem použil obyčejné zaokrouhlení na 0.5% Modrá barva = před použitím filtru
Červená barva = po použití filtru
Stále to není to, co bych chtěl, ale nevím, jestli to co bych chtěl, je vůbec možné.
Zkoušel jsem si s tím lowpass filtrem hrát. Přepsal jsem si ho do Arduina a zkoušel, jak se to bude chovat při různých hodnotách gain. Neustále je to kompromis mezi vyhlazením při záchvěvu a reakcí na požadovanou hodnotu. Upravil jsem si ten lowpass filtr tak, že při zvýšení hodnoty má nižší gain než při snížení rychlosti. Spoustu operátorů používá poťák FEED místo TOTAL STOPu a tak potřebuji aby reakce na snížení rychlosti byla okamžitá.
Takto se to chová při otáčení rukou: A takto seto chová při skokových změnách (šroubovákem zkratuji výstup z encoderu s 5V a GND): Na vyhlazení vln, které jsou vidět až po velkém zvětšení se lowpass filtr nedal použít, tak jsem použil obyčejné zaokrouhlení na 0.5% Modrá barva = před použitím filtru
Červená barva = po použití filtru
Stále to není to, co bych chtěl, ale nevím, jestli to co bych chtěl, je vůbec možné.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
Kolik čteš těch vstupů? Pořád jeden nebo je střídáš?
Obecný problém s multiplexovaným ADC je, že musíš po přepnutí vstupu počkat na ustálení vstupní hodnoty.
Každý vstup má nějakou kapacitu. A když ji budíš ze zdroje s vysokou impedancí, tak ustálení hodnoty trvá příslušně dlouho.
Pokud se Ti nechce hrabat do knihoven Arduina (nebo v čem to píšeš) a protáhnout čas mezi přepnutím vstupu a jejím změřením, tak zkus udělat nějaké pokusy.
Buď čti stejný vstup několikrát, např. 3x, (bez přepnutí na jiný vstup) a použij až poslední hodnotu.
Případně si to změř: místo potenciometru tam dej odporový dělič. Napřed třeba 100k/100k, pak 1k/1k a nakonec třeba 100R/100R.
A uvidíš, jestli se naměřené průběhy liší nebo ne.
Obecný problém s multiplexovaným ADC je, že musíš po přepnutí vstupu počkat na ustálení vstupní hodnoty.
Každý vstup má nějakou kapacitu. A když ji budíš ze zdroje s vysokou impedancí, tak ustálení hodnoty trvá příslušně dlouho.
Pokud se Ti nechce hrabat do knihoven Arduina (nebo v čem to píšeš) a protáhnout čas mezi přepnutím vstupu a jejím změřením, tak zkus udělat nějaké pokusy.
Buď čti stejný vstup několikrát, např. 3x, (bez přepnutí na jiný vstup) a použij až poslední hodnotu.
Případně si to změř: místo potenciometru tam dej odporový dělič. Napřed třeba 100k/100k, pak 1k/1k a nakonec třeba 100R/100R.
A uvidíš, jestli se naměřené průběhy liší nebo ne.
Co se týče frekvence čtení, tak čtu 20Hz. Proč? Protože jsem nevěděl kolik je potřeba a zkusil nějakou výchozí hodnotu a jelikož jsem začal používat lowpass filtr, tak jsem chtěl nějakou stabilní frekvenci, která nebude závislá na tom, co se právě má v nekonečné smyčce spočítat.
Nikde v kódu nepoužívám funkci delay, ale vždy si vytvořím událost:
"pokud současný čas je vyšší než předchozí čas + perioda, tak ...."
Zatím je to takový bordel kód, jen na ověření hardwaru a zjistil jsem, že v něm čtu analogový vstupy A6, A7, A6, A7 v jedné smyčce. Tak jsem to překopal na čtení jen jednou A7, ale vůbec to nepomohlo: Ovšem co pomohlo, tak jsem okomentoval příkazy, které měly na starosti blikání ledkama na výstupech A0, A1, A2, A3, D5. A najednou stal se zázrak: Dnes už valím spát, zítra budu pokračovat a přemýšlet o závěrech tohoto pokusu.
Nikde v kódu nepoužívám funkci delay, ale vždy si vytvořím událost:
"pokud současný čas je vyšší než předchozí čas + perioda, tak ...."
Zatím je to takový bordel kód, jen na ověření hardwaru a zjistil jsem, že v něm čtu analogový vstupy A6, A7, A6, A7 v jedné smyčce. Tak jsem to překopal na čtení jen jednou A7, ale vůbec to nepomohlo: Ovšem co pomohlo, tak jsem okomentoval příkazy, které měly na starosti blikání ledkama na výstupech A0, A1, A2, A3, D5. A najednou stal se zázrak: Dnes už valím spát, zítra budu pokračovat a přemýšlet o závěrech tohoto pokusu.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
Tak jsem bádal dál a přišel jsem na to, že když měřím z obou vstupů (A6, A7) tak se výsledek trošku zhorší (levá část grafu). Zkoušel jsem dávat pauzy mezi jednotlivými čteními analogových vstupů, nebo je i číst vícekrát, ale nepomohlo to. Ovšem největší binec do toho vrazí ty obyčejné blikající ledky (pravá část grafu). Ovšem bavíme se stále o chybě do 0.5% z rozsahu, takže vliv na funkci rostlináře to mít nebude.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
V příloze přikládám elektroschema. Jedná se pin AVCC. Každopádně už jsem našel jednoho z viníků problému. Je to tepelná pojistka TH2. Na následujícím grafu jsou zobrazeny analogové vstupy A5-zelená (korekce TH2) a potenciometry A6 a A7. Levá část grafu je přemostěná pojistka TH2.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
Pokrok momentálně žádný. Co se týče softwaru, tak mám jen takový testovací na ověření funkčnosti vstupů výstupů. Co se týká hardwaru, tak už jsem zde dával vše co mám v předchozím příspěvku (KiCAD). Zatím je to akorát takové drahé arduino Myslím si, že na to budu mít čas zase až o vánočních svátcích.
LinuxCNC - MESA 7i96
zz912.webnode.cz
zz912.webnode.cz
Max vstipna hodnota na AD vstup je tusim 10k, pozri datasheet. Pri prepnuti na iny vstup musis chvilku pockat a az tak spustit prevod.
K tomu 1uF co mas na vyhladenie napetna na AD vstupy by som skor pridal 100nF.
Pouzivas orevod na 10bit? Tak spodny byt zahid 9bit bude plne postacovat, niekedy aj 256hodnot staci.
Mas na polasku spinane zdroje, tak sa necudujze to beha. Inak vid datasheet AD prevodnik.
K tomu 1uF co mas na vyhladenie napetna na AD vstupy by som skor pridal 100nF.
Pouzivas orevod na 10bit? Tak spodny byt zahid 9bit bude plne postacovat, niekedy aj 256hodnot staci.
Mas na polasku spinane zdroje, tak sa necudujze to beha. Inak vid datasheet AD prevodnik.