Zákmity kontaktu po stoprvní :-/ – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Zákmity kontaktu po stoprvní :-/ – Mikrokontroléry – Fórum – Programujte.comZákmity kontaktu po stoprvní :-/ – Mikrokontroléry – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
morganzd0
Newbie
18. 11. 2010   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 94.112.228.–
Reklama
Reklama
liborb
~ Redaktor
+18
Guru
19. 11. 2010   #2
-
0
-

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 :)

Nahlásit jako SPAM
IP: 78.80.52.–
AB
~ Anonymní uživatel
40 příspěvků
19. 11. 2010   #3
-
0
-

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.

Nahlásit jako SPAM
IP: 217.115.249.–
morganzd0
Newbie
19. 11. 2010   #4
-
0
-

To liborb : Zkoušel jsem leccos. Pči nižších hodnotách prodlevy se inkrementovalo 2x, při vyšších bylo zpoždění nepřijatelné.

Nahlásit jako SPAM
IP: 91.213.10.–
morganzd0
Newbie
19. 11. 2010   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 91.213.10.–
vega33
~ Anonymní uživatel
18 příspěvků
19. 11. 2010   #6
-
0
-

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.

Nahlásit jako SPAM
IP: 195.168.55.–
morganzd0
Newbie
19. 11. 2010   #7
-
0
-

To vega33 : To samozřejmě dělám GIFR &= ~(1 << INTF0). Dokonce i v přerušení (dále tam už jen nastavím flag), i v následém zpracování flagu.

Nahlásit jako SPAM
IP: 94.112.228.–
AB
~ Anonymní uživatel
40 příspěvků
19. 11. 2010   #8
-
0
-

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);
}
}

Nahlásit jako SPAM
IP: 217.115.249.–
morganzd0
Newbie
20. 11. 2010   #9
-
0
-

To AB : Zkusím, díky.

Nahlásit jako SPAM
IP: 94.112.228.–
AB
~ Anonymní uživatel
40 příspěvků
20. 11. 2010   #10
-
0
-

Teď vidím, že ten poslední delay by měl být delší aby během něho proběhly potřebné dvě přerušení.
Začal bych třeba se 100 ms.
Nepříjemné je to, že čím hustší budou přerušení, tím delší bude tento delay.

Nahlásit jako SPAM
IP: 217.115.249.–
KIIV+42
God of flame
20. 11. 2010   #11
-
0
-

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

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý