Stránka 1 z 1

Riadenie DC motorčeka a PSD regulátor (AVR)

Napsal: 04 dub 2014, 12:59
od dodik
Ahojte, mám jeden problém, chcel by som ovládať polohu ramena, ktoré je pripevnené na DC motorček s prevodovkou. Rameno by malo vykonávať pohyb v rozsahu 2∏ (rýchlosť je asi 1ot/min).
Snímanie náklonu robím akcelerometrom. Avšak nedokáže dostatočne rýchlo spracovať informácie pri pohybe ramena.
Chcem sa spýtať či na to idem dobre, alebo mám tú metódu s akcelerometrom zahodiť a vymyslieť niečo iné? Ďakujem

Napsal: 04 dub 2014, 15:02
od nick-1992
Na tohle by byl vhodnější krokový motor

Napsal: 04 dub 2014, 19:06
od dodik
Nemám k dispozícii krokovy motor s dostatočným výkonom.

Napsal: 05 dub 2014, 09:59
od Ivan_Ryger
na snímanie polohy si tam radšej dajte optický enkóder, indukčný snímač alebo niečo podobné. Je to oveľa vhodnejšie.

Ivan

Napsal: 28 dub 2014, 23:31
od dodik
Sorry že tak neskoro. Objednal som enkóder z číny a konečne došiel. Má dve fázy, a 400imp/ot. Podľa datasheetu je možné získať 1600imp/ot. Zatiaľ to mám zapojené tak že jedna fáza je na INT2 a druhá je na klasický vstup.
V programe to vyzerá takto

Kód: Vybrat vše

ISR(INT2_vect)
{
	_delay_ms(1);
	if (!(PINB & (1 << PB1)))
	{
		count++;
	}
	else count--;
}
Takto dokážem získať len 400imp/ot.
Neviem ako na 1600. Podľa obrázka dole ma napadá len to že by som vzorkoval každú 1ms, cez nejaký časovač, a v ňom by som najprv zisťoval či ide o rotáciu do ľava alebo do prava. Potom jednotlivé stavy kanálov.

Obrázek

Napsal: 29 dub 2014, 17:32
od popopepe
Musíš snímat (ideálně přes dvě různá přerušení) každou vzestupnou i sestupnou hranu z obou kanálů, tudíž 4 x víc než normálně.

Napsal: 29 dub 2014, 19:09
od dodik
.... už som si niečo k tomu preštudoval, v prílohe je pdfko ako na snímače, je tam v podstate ten môj návrh a aj ten tvoj použitím dvoch ext. prerušení :wink: Idem sa s tým potrápiť :idea:

Napsal: 01 kvě 2014, 21:57
od dodik
Tak sa mi to podarilo, mal som s tým zo začiatku problémy, lebo som mal na každej fáze (A, B) 100n kondenzátor pripojený na zem.
A, B mám na INT0, INT2 s pripojenými pull-up.
Vyvolanie prerušenia mám pri zmene logickej úrovne, a v prerušení je podmienka kde sa rozhodne log1 alebo log0.
Nastavenie prerušení. Premenná count počíta kroky z IRC.

Kód: Vybrat vše

	EICRA |= (1 << ISC00) | (1 << ISC20);
	EIMSK |= (1 << INT0) | (1 << INT2);

Kód: Vybrat vše

ISR(INT2_vect)
{

	if ((PINB & (1 << PB2)) != 0) // sestupna hrana B kanalu
	{
		if ((PIND & (1 << PD2)) == 0)
		count++;
		else
		count--;
	}
	else // vzestupna hrana na B
	{
		if ((PIND & (1 << PD2)) == 0)
		count--;
		else
		count++;
	}

}

Kód: Vybrat vše

ISR(INT0_vect)
{

	if ((PIND & (1 << PD2)) != 0) // sestupna hrana A kanalu
	{
		if ((PINB & (1 << PB2)) == 0)
		count--;
		else
		count++;
	}
	else // vzestupna hrana na A
	{
		if ((PINB & (1 << PB2)) == 0)
		count++;
		else
		count--;
	}

}
Teraz sa idem pustiť do kódu PSD regulácie.