Stránka 2 z 4

Napsal: 31 kvě 2009, 15:06
od ZdenekHQ
Možná se dá enkodér ponížit na pouhý generátor pulsů a počítat je procesorem a čítačem...

Napsal: 31 kvě 2009, 15:09
od vasek125
Je problém najít vyhovující MCU. V blízském obchodě nic jiného než atmega8/16/32 nemají, zbytek je už SMD, o SMD nemám zájem. Nedalo by se to udělat nějak s tou vzorkovací frekvencí? Zvolit vhodnější typ odečítání?

Napsal: 31 kvě 2009, 15:16
od vasek125
Ještě něco k tomu enkodéru. Má dva výstupy(dráty), kde jeden impuls je posunutý oproti druhému aby se dal zjistit směr otáčení. Dají se tedy detekovat 4 stavy(prvni drat-druhy drat): 0-0, 1-0, 0-1, 1-1. Při takovém odečítání dává enkodér 360 pulsů za otáčku výstupní hřídele elektromotoru.

Napsal: 31 kvě 2009, 15:18
od vasek125
ZdenekHQ: nemám dostatek přerušitelných pinů pro 2x2 vstupy.

Napsal: 31 kvě 2009, 15:39
od Andrea
vasek125 píše:Ještě něco k tomu enkodéru. Má dva výstupy(dráty), kde jeden impuls je posunutý oproti druhému aby se dal zjistit směr otáčení. Dají se tedy detekovat 4 stavy(prvni drat-druhy drat): 0-0, 1-0, 0-1, 1-1. Při takovém odečítání dává enkodér 360 pulsů za otáčku výstupní hřídele elektromotoru.

Detekovat hranu jen na jednom výstupu enkodéru by nestačilo? Do jakých otáček se to bude provozovat?

Napsal: 31 kvě 2009, 15:59
od ZdenekHQ
No jestli to má připojený na zubní vrtačku, tak nevím...

Potřebujem znát otáčky a případně periodu reverzace, čítač pulsů je určitě lepší než snímač... Nepotřebuje přerušení, kromě čtení obsahu např. jednou za tisícinu vteřiny.

Napsal: 31 kvě 2009, 16:35
od vasek125
Bude to do 216 otáček za minutu. Dříve jsem detekoval otáčky tak, že jsem počítal kolik je pulsů za vteřinu, jenže to bylo nedostatečné kvůli řízení otáček, docházelo k překmitům, proto počítám dobu mezi 2 pulsy. Při frekvenci odečítání 57600 to dává ještě dost chyb, tak nevím jestli je nedostatečná frekvence nebo špatný způsob odečítání.

Napsal: 31 kvě 2009, 17:16
od vasek125
Zkoušel jsem detekovat jen hranu prvniho signalu a stejne to hrozne lita. Mozna mam spatnou metodu mereni ve smyslu odecitani stavu impulsu. Neni tam nekde problem?

Napsal: 31 kvě 2009, 18:38
od vasek125
Když zkouším měřit otáčky tím stylem, že počítám pulsy enkodéru za sekundu, tak je to 100% přesný. Proč to takový přesný není(alespoň přibližně), když měřím dobu mezi pulsy?

Napsal: 31 kvě 2009, 18:42
od Andrea
vasek125 píše:Když zkouším měřit otáčky tím stylem, že počítám pulsy enkodéru za sekundu, tak je to 100% přesný. Proč to takový přesný není(alespoň přibližně), když měřím dobu mezi pulsy?

Asi to měříš špatně nebo to špatně přepočítáváš nebo já nevim co, věštit neumím. :roll:

Napsal: 31 kvě 2009, 20:15
od vasek125
Věštit nemusíš. Kód který se stará o měření je v ty obsluze přerušení, u který jsem nakonec stáhnul frekvenci. Viz.

pulsecounterL++;
if (bit_is_set(PIND, 6) && ! speedLcounted1) {
pulseL++;
speedLcounted3 = 0;
speedLcounted1 = 1;
}

if (bit_is_set(PIND, 7) && ! speedLcounted2) {
pulseL++;
speedLcounted4 = 0;
speedLcounted2 = 1;
}

if (bit_is_clear(PIND, 6) && ! speedLcounted3) {
pulseL++;
speedLcounted1 = 0;
speedLcounted3 = 1;
}

if (bit_is_clear(PIND, 7) && ! speedLcounted4) {
pulseL++;
speedLcounted2 = 0;
speedLcounted4 = 1;
}

if (pulseL>=1 || pulsecounterL>=14400) {
//finalSpeedL = (pulseL*(14400000/pulsecounterL))/1000;
finalSpeedL=pulsecounterL; // pro ladeni, zobrazi jen kolik cyklu mezi 2 pulsy
pulsecounterL = 0;
pulseL = 0;
}

Napsal: 31 kvě 2009, 20:35
od Andrea
vasek125 píše:Věštit nemusíš. Kód který se stará o měření je v ty obsluze přerušení, u který jsem nakonec stáhnul frekvenci. Viz.

A máš jistotu, že už se ti žádná přerušení neztrácí?
Tak to zkus změnit na:

Kód: Vybrat vše

pulsecounterL++; 
if (bit_is_set(PIND, 6) && ! speedLcounted1) {
pulseL++;
speedLcounted3 = 0;
speedLcounted1 = 1;
}

if (bit_is_clear(PIND, 6) && ! speedLcounted3) {
speedLcounted1 = 0;
speedLcounted3 = 1;
}

if (pulseL>=1 || pulsecounterL>=14400) {
finalSpeedL=pulsecounterL; // pro ladeni, zobrazi jen kolik cyklu mezi 2 pulsy
pulsecounterL = 0;
pulseL = 0;}

Jestli to bude pořád lítat.

Napsal: 31 kvě 2009, 21:17
od vasek125
Mám skoro jistotu, do obsluhy přerušení jsem zařadil kód, který řídí digitální hodiny. A ty se nerozcházejí, drží čas. A ani tenhle kód, co jsem zkusil moc dobře nefunguje. Pořád to lítá, ne tolik, ale lítá (365-390).

Napsal: 31 kvě 2009, 21:39
od vasek125
Tak už jsem na to asi přišel. Pro přehlednost jsem trochu upravil kód přerušení. A funguje to dobře takto:

pulsecounterL++;

if (bit_is_set(PIND, 6) && bit_is_clear(PIND, 7) && ! pinmixL1) {
//pulseL++;
pinmixL1=1;

pinmixL2=0;
pinmixL3=0;
pinmixL4=0;
}

if (bit_is_set(PIND, 6) && bit_is_set(PIND, 7) && ! pinmixL2) {
//pulseL++;
pinmixL2=1;

pinmixL1=0;
pinmixL3=0;
pinmixL4=0;
}

if (bit_is_clear(PIND, 6) && bit_is_set(PIND, 7) && ! pinmixL3) {
pulseL++;
pinmixL3=1;

pinmixL2=0;
pinmixL1=0;
pinmixL4=0;
}

if (bit_is_clear(PIND, 6) && bit_is_clear(PIND, 7) && ! pinmixL4) {
pulseL++;
pinmixL4=1;

pinmixL2=0;
pinmixL3=0;
pinmixL1=0;
}

if (pulseL>=10) {
finalSpeedL = (pulseL*(57600000/pulsecounterL))/1000;
//finalSpeedL=pulsecounterL; // pro ladeni, zobrazi jen kolik cyklu mezi 2 pulsy
pulsecounterL = 0;
pulseL = 0;
}


nebo takto:

pulsecounterL++;

if (bit_is_set(PIND, 6) && bit_is_clear(PIND, 7) && ! pinmixL1) {
pulseL++;
pinmixL1=1;

pinmixL2=0;
pinmixL3=0;
pinmixL4=0;
}

if (bit_is_set(PIND, 6) && bit_is_set(PIND, 7) && ! pinmixL2) {
pulseL++;
pinmixL2=1;

pinmixL1=0;
pinmixL3=0;
pinmixL4=0;
}

if (bit_is_clear(PIND, 6) && bit_is_set(PIND, 7) && ! pinmixL3) {
//pulseL++;
pinmixL3=1;

pinmixL2=0;
pinmixL1=0;
pinmixL4=0;
}

if (bit_is_clear(PIND, 6) && bit_is_clear(PIND, 7) && ! pinmixL4) {
//pulseL++;
pinmixL4=1;

pinmixL2=0;
pinmixL3=0;
pinmixL1=0;
}

if (pulseL>=10) {
finalSpeedL = (pulseL*(57600000/pulsecounterL))/1000;
//finalSpeedL=pulsecounterL; // pro ladeni, zobrazi jen kolik cyklu mezi 2 pulsy
pulsecounterL = 0;
pulseL = 0;
}

Prostě kdykoliv použiju jen jeden výstup enkodéru. Potom s if (pulseL>=10) dostanu přesnou konstantní hodnotu. To znamená, že puls z druhého v výstupu není posunun přesně o 1/2 oproti prvnímu. Je to tak nebo je v tom něco víc?

Napsal: 31 kvě 2009, 21:41
od Andrea
Tak to zkus na druhou hranu (přendat pulseL++ do druhého ifu) nebo to počítej přes víc period. Nejlepší by bylo sehnat někde osciloskop a podívat se, co z toho enkodéru leze, třeba to má takový jitter. To jsou optické IRC?