Nejde mi nastavit prescaler na méně než 256 u ATMEGA 16
Moderátor: Moderátoři
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?
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
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.
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[?]
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;
}
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.
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?