» Poradna » Programy

Rotační enkodér v jazyku C

 |   |  Microsoft Windows 7 Firefox 16.0

Ahojte. PLS mám malý problém. Snažím se zjistit jakým směrem se otáčí rotační enkodér a podle toho snižovat nebo zvyšovat hodnotu "enc". Ale stále se mi nedaří. Můžete mi pomoci?? Můj kód je takový. A program dělá to, že při otočení vlevo, nebo vpravo se pouze hodnota odečítá. Použil jsem ATMEGU16.Nedaří se mi napsat podmínku pro přerušení od INT. Moje vypadá nějak takto:[code]ISR(INT1_vect){ //doplnit podminku enkoderu (enc++/enc--) if (PIND & _BV(PD2)) // Increase enc enc++; else // Decrease enc enc--;}[/code]Rotační enkodér je připojen na port D3 a D2.

Odpovědi na otázku

 |   |  Microsoft Windows XP Mozilla 1.9.2.24

Otacanie zavisi od hodnot PIND a _BV(PD2)Ak obidve hodnoty niesu nulove, tak sa zvysuje, inak sa znizuje

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

No to jo. Ale jak potom upravit tu podmínku, abych mohl na jednu stranu snižovat a na druhou zvyšovat. Už jsem přemýšlel i s druhým přerušením, ale to podle mě nebude to pravé ořechové.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Přerušení se vyvolá na hranu jednoho impulzu z enkodéru, a podle toho jakou hodnotu má v tomto časovém okamžiku druhý výstup encodéru, tak se ptáčí na jednu nebo druhou stranu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows Vista IE 7.0

Ked ti to nieje jasne, tak preskumaj rutinu ISR(INT1_vect).V nej najdes odpoved ako sa naplnaju hodnoty PIND a _BV(PD2).Tipoval by som, ze PIND je strobovaci signal nastavovany uzivatelom podla toho na aky smer chce tocit a hodnota _BV(PD2) predstavuje signaly od jednotlivych vstupov. Moj tip ovsem nemusi byt spravny.Na taketo veci bolo dobre kedysi PMI80 alebo PMD85, alebo Teslacky kufrik s I8080A a akcnymi clenmi. V sucastnosti snad nejaka vyvojova doska s jednocipovym procesorom.Riesis sice program, ale vies aspon ako funguju logicke obvody ?Napriklad taky 2-vstupovy NAND.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

No vyzkoušel jsem toho už hodně. teď nezbývá, než jít si opět pořádně prostudovat DATASHEET. Párkrát se zadařilo, že jsem něco přehlídl.PS: NAND vím jak funguje. Nejsem úplný hlupák.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Promiň, ale...myslíš ten rotační enkodér, snímač otáček s relativní polohou? (Jsou i enkodéry s absolutní polohou). Mslíš to, co má dva výstupy, oblédlíky vůči sobě posunuté? Prípadně třetí výstup-jeden pulz na otáčku, který značí počátek, nula stupňů polohy hřídele? Tak si uvědom jak TEN ENKODÉR funguje...při jedné z hran jednoho z těch dvou výstupů se ptát na stav druhého výstupu, podle jeho stavu se pak enkodér otáčí na jednu nebo druhou stranu...přerušení ten Atmel určitě bere při jedné nebo obou hranách na vstupím portu...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

oblédlíky->obdélníky

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Jo a sice NAND víš jak funguje...směr toho enkodéru by se dal s hradlama krásně vyrobit, a program bude fungovat STEJNĚ

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

No rotační enkodér mám 2 výstupní, kde výstupní pulzy jsou proti sobě posunuté.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Jo to je přesně on. Tak si uvědom jak to funguje, podívej se na jeho průběhy. Prostě a jednoduše, přerušení je vyvolané změnou (hranou) stavu na vstupu MCU, nevím jak to Atmel, jestli bere obě hrany nebo jen jednu. Ty vezmeš v pozat jen jednu hranu, třeba sestupnou jednoho výstupu enkodéru, a podle toho v jakém stavu bude jeho druhý výstup (v přerušení se doptáš v podmínce na jeho stav), tak se enkodér otáčí na jednu nebo druhou stranu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 IE 7.0
 |   |  Microsoft Windows 7 Firefox 16.0

Já jsem myslel spíš na průmyslové snímače otáček, ale funkce je naprosto stejná. Není potřeba nic složitě řešit. Jedno přerušení o dhrany jednoho výstupu a ptát se v něm na stav druhého.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Mínusák ať prosím sdělí co je špatně.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 IE 7.0

Právě u průmyslových snímačů otáček je to poněkud složitější. Při zastavení pohonu nebo zařízení může dojít k t.zv. kmitání na hraně ať již vlivem vlastností pohonu a připojeného zařízení nebo jen vlivem vnějších vlivů - třeba otřesy.A to není jednoduchá záležitost. Lze to řešit jak za pomocí HW tak SW.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

To je pravda, to už bude "prosté" ošetření zákmitů, to se dá vyřešit taky celkem jednoduše (asi jak pro koho). Ovšem pro enkodéry jsou přímo karty pro PLC, přece jen z toho encodéru leze (může) jít docela velká frekvence a samotné PLC (jeho prosté vstupy) by to nestačilo zpracovat. Ty karty vše dělají na HW úrovni, počítají pulzy...V případě tazatele jsem to bral jako školní úlohu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Soráč, ale školní úloha to není. Jenom se zkouším naučit něco nového, ale bohužel bez úspěchu. Tady je něco, co by se podle mě mělo tvářit jako že by to mohlo fungovat, ale pouze to přičítá. TZN. ta druhá podmínka není splněná. Co vy na to?ISR(INT1_vect){ //pokud dojde k preruseni, probehna kontrola pinu PD5 k urceni smeru //a podle toho pricteni nebo odecteni if (!(PIND & _BV(PD5))) { enc++; } else if (PIND & _BV(PD5)) { enc--; } //timercounter = 0;}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Tak tady je ještě jeden neúspěšný pokus, podle mě poněkud propracovanější než ten minulý. ALE OPĚT NEFUNGUJE. Přerušení projde, ale už nedojde k rozpoznání otočení a následné zvětšení nebo snížení proměnné "enc". Zde pouze odečítá.ISR(INT1_vect){ //pokud dojde k preruseni, probehna kontrola pinu PD5 k urceni smeru //a podle toho pricteni nebo odecteni if (PIND & (1 << PD5)) { if (PIND & (1 << PD3)) { enc--; } else { enc++; } // change to falling detection MCUCR |= ((0 << ISC00) | (1 << ISC01)); } else { if (PIND & (1 << PD3)) { enc++; } else { enc--; } // change to rising detection MCUCR |= ((1 << ISC00) | (1 << ISC11)); } //timercounter = 0;}

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Tak já už fakt nevím. Přepsal jsem celý program, ale asi dělám jednu a tu samoou chybu. Tady je můj nový kód, a stále dochází k tomu, že se při otáčení enkodéru se číslo pouze zmenšuje nezávisle na otáčení (doleva / doprava). Jestli někdo budete mít chvilku, koukněte mi na to. Budu rád za jakoukoli radu.[code]#include <stdlib.h>#include <avr/io.h>#include <avr/pgmspace.h>#include <avr/interrupt.h>#include "lcd.h"#include "rotary.h"long int position=0; void pause (unsigned int a) { unsigned int i; for (i=a;i>0;i--) ;}char text[16];void write_position(void){ unsigned char i; long int temp; temp=position; itoa(temp,text,10); lcd_gotoxy(0,0); lcd_puts(text);}ISR (INT0_vect){ if (((PIND&0x01)==0x00)&&(position<9999)) position=position+1; //inc if (((PIND&0x01)==0x01)&&(position>-9999))position=position-1; //dec }int main(void){ DDRD=0xfa; //PD0,PD2 jako vstup, ostatní jako vystupPORTD=0x05; pause(3000); //pauzalcd_init(LCD_DISP_ON); //Init LCD MCUCR=(1<<ISC01)|(1<<ISC00); //Set INT0 on rising signal on PD2 GICR=(1<<INT0); write_position(); //Write position sei(); //povoleni přerušeníwhile(1) write_position();return 1;}[/code]

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 IE 7.0

NějaK málo informací. Jaké používáte vývojové prostředí?(v čem to píšete a odlaďujete)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 16.0

Ahojte. Tak po konzultaci mého problému ještě na jednom foru (SvetElektro), jsem dospěl k závěru, že program je funkční, ale můj enkodér je kaput. I tak děkuji za pomoc. A hned jak seženu nový enkodér, dám vědět jestli tomu tak opravdu je. PS: vývojové prostředí AVR Studio 4, Atmega16, Krystal 16MHz.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Enkodér




Určitě si přečtěte

Jak horko bude ve vašem městě, až vám bude 80 let? Podívejte se, jak se projeví klimatické změny!

Jak horko bude ve vašem městě, až vám bude 80 let? Podívejte se, jak se projeví klimatické změny!

** Srpen byl třetí nejteplejší za posledních více než sto let ** Bude to ale daleko horší, jak ukazuje aplikace NYT ** V Praze vzroste počet horkých dní na čtyřnásobek

Karel Kilián | 21

ELONOVINKY: Druhá strana popularity – servisy Tesly jsou přeplněné a nestíhají

ELONOVINKY: Druhá strana popularity – servisy Tesly jsou přeplněné a nestíhají

** Automobilka Tesla neustále zvyšuje prodeje svých vozů ** S kvapně rostoucím počtem nových majitelů Tesel ale stoupá i počet zákazníků servisů ** Servisy Tesly nestíhají, firma proto řeší další akutní problém

Petr Melechin, Karel Dlabač | 72

Přichází revoluce v oblasti deodorantů!

Přichází revoluce v oblasti deodorantů!

** Britští vědci odhalili uzlový bod procesů, kterými vzniká nejpronikavější složka lidského tělesného pachu ** Nové generaci deodorantů by mohl dodat na síle cílený zásah do života malé skupinky kožních bakterií ** Podle některých vědců by to ale znamenalo zpřetrhat pouta mezi člověkem a mikrobem

Jaroslav Petr | 33

V doupěti hackerů na brněnské FIT: Ukázali nám útoky na Bluetooth i vlastní chytré krabičky

V doupěti hackerů na brněnské FIT: Ukázali nám útoky na Bluetooth i vlastní chytré krabičky

** Internet je plný malwaru, to už dnes ví každý ** Víte ale, že lze útočit třeba i na Bluetooth? ** Navštívil jsem hackery z brněnského FITu

Jakub Čížek | 1


Jízdní řády Bileto
Aktuální číslo časopisu Computer

Megatest: 13 grafických karet

Srovnání 7 dokovacích stanic s USB-C

Jak na perfektní noční fotografie

Kvalitní zdroje informací pro sebevzdělávání