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

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

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 01:00

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

#1 Příspěvek 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

Uživatelský avatar
nick-1992
Příspěvky: 114
Registrován: 22 led 2014, 01:00
Bydliště: Rýmařov

#2 Příspěvek od nick-1992 »

Na tohle by byl vhodnější krokový motor

Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 01:00

#3 Příspěvek od dodik »

Nemám k dispozícii krokovy motor s dostatočným výkonom.

Uživatelský avatar
Ivan_Ryger
Příspěvky: 1265
Registrován: 02 bře 2005, 01:00
Bydliště: Bratislava, Petrzalka

#4 Příspěvek 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

Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 01:00

#5 Příspěvek 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

Uživatelský avatar
popopepe
Příspěvky: 548
Registrován: 26 říj 2005, 02:00

#6 Příspěvek 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ě.

Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 01:00

#7 Příspěvek 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:
Přílohy
Enkoder.pdf
enkoder
(131.53 KiB) Staženo 132 x

Uživatelský avatar
dodik
Příspěvky: 198
Registrován: 26 lis 2008, 01:00

#8 Příspěvek 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.

Odpovědět

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