Nejde mi nastavit prescaler na méně než 256 u ATMEGA 16

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#16 Příspěvek od ZdenekHQ »

Možná se dá enkodér ponížit na pouhý generátor pulsů a počítat je procesorem a čítačem...
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#17 Příspěvek 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í?
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#18 Příspěvek 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.
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#19 Příspěvek od vasek125 »

ZdenekHQ: nemám dostatek přerušitelných pinů pro 2x2 vstupy.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#20 Příspěvek 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?
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#21 Příspěvek 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.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#22 Příspěvek 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í.
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#23 Příspěvek 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?
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#24 Příspěvek 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?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#25 Příspěvek 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:
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#26 Příspěvek 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;
}
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#27 Příspěvek 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.
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#28 Příspěvek 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).
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#29 Příspěvek 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?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#30 Příspěvek 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?
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“