Jsem v koncích a prosím o radu.
Na externím přerušení čekám na sepnutí kontaktu a potřebuji odrušit zákmity, ale zároveň potřebuji aby byla rozlišovací schopnost mezi jednotlivými sepnutími cca 25ms (tedy frekvence spínání je až 40Hz pokud dobře počítám).
Zkoušel jsem už leccos co jsem našel na netu, ale nikdy to nedělá to co potřebuji. Buď jsou zákmity, a nebo zpoždění a tím pádem se nestíhá odčítat kontakt. Dělám to na atmega32/16MHz a nejraději bych to ošetřil SW.
Mohl by mě někdo nasměrovat na nějaké použitelné řešení, nejlépe v C?
Předem děkuji.
Edit: omlouvám se, zjistil jsem že už jsem zde vlákno na toto téma založil (http://programujte.com/?akce=diskuze&kam=vlakno&tema=15487-preruseni-zakmity), nicméně řešení stále nemám.
Fórum › Mikrokontroléry
Zákmity kontaktu po stoprvní :-/
Jednou jsem byl nucen podobný problém řešit a výsledek byl takový, že po příchodu přerušení (sepnutí kontaktu) se provedlo zakázání přerušení a po době dané nastavením filtru se přerušení opět povolilo. V tvém případě je doba filtru nějaký 15ms. Povolení přerušení se dělalo v obsluze časovače. Třeba ti to pomůže :)
Jestli čas mezi sepnutími je 25ms a kontakt zakmitává 50 ms tak bude nadějnější zabývat se kvadraturou kruhu, než tímto problémem.
Chce to buď kvalitní kontakt (prý existují takové, které zakmitávají pod 10ms), nebo použít jiné čidlo, fotodiodu, Hall.
To AB : Jak dlouho kontakt zakmitává jsem neměřil, zkusím si ověřit. NNěkde jsem ale četl že hodnoty se obvykle pohybují v řádu jednotek ms.
Nicméně když vezmu v potaz že i obyčejné Sigma cyklopočítače zvládají rychlost přes 200km/hod (montováno na motocykl)... Používám právě takový kontakt.
Kedze pouzivas prerusenie pri cakani na stlacenie kontaktu, zakmit ti moze sposobit nastavenie bitu INTF0 v GIFR registry a po skonceni rutiny prerusenia tento bit aktivuje znovu prerusenie - toto by mohlo sposobovat vyvolanie rutiny 2x. Pred ukoncenim prerusovacej rutiny skus tento bit deaktivovat - vid datasheet.
V zadání je mnoho neznámých, ale pokud
-jde o něco jako spínač na kole pro měření doby otáčky
-doba sepnutí je proti periodě krátká
-nemusí se měřit každá perioda
-nevadí zpoždění v ISR
zkusil bych něco takového:
volatile uint16_t interval;
ISR(INT0_vect)
{
uint16_t count;
static uint16_t count_old;
count = TCNT1;
interval = count - count_old;
count_old = count;
_delay_ms(25); //překlenutí zákmitů
GIFR = (1<<INTF0); //nuluj flag
}
int main()
{
uint16_t period;
TCCR1B = 3; //start timer1, prescale = 64
MCUCR = 3; //přerušení vzestupnou hranou
GICR = (1<<INT0); //povol přerušení
for(;;)
{
cli();
period = interval;
printf("%u", period);
// jiné činnosti
sei();
_delay_us(10);
}
}
bude lepsi kouknout na osciloskopu a jednodussi to bude pomoci jedny 74123 ... monostabilni KO..
kdyz udelas cca 3ms impuls tak by se kazdym zakmitem (resp nabeznou nebo sestupnou hranou) prodlouzil cas, po kterej se drzi impuls
mimo jine sou tam mko dva takze se s tim da pohrat
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Preruseni - zakmity — založil morganzd
Přiřazení kontaktu ke zprávám — založil OkiKoki
Změna pozice vlaječky a kontaktů — založil janhannes
Nezobrazujou se mi obrazky u kontaktu a detaily — založil xjacka
Přidání obrázku do existující databáze kontaktů — založil Banan
Moderátoři diskuze