Manualni rizeni PWM

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

Manualni rizeni PWM

#1 Příspěvek od endthe »

Napsal sem si funci na rizeni dvojice servomotoru HS 422
pouzity xtal = 14745600Hz
zapis je nasledujici:

Kód: Vybrat vše

int manual(void)
{
int natoceni1;
int natoceni2;
int prepocetH=90;
int prepocetL=90;
char info1[20];
char info2[20];
OCR3A=1500;
OCR3B=1500;
	clear_disp();
			sprintf(info1, "Servo 1:  %d°",prepocetH);
			sprintf(info2, "Servo 2:  %d°",prepocetL);

			put_string_xy(0, 0, info1);
			cursor_disp_ctrl(0x04);
			put_string_xy(0, 1, info2);

key = 0;
	while (key == 0);
	
	// display button name
	while(1) { 	
			   
		if (key != 0) {
			switch (key) {
				case 0x11 : {prepocetH+=1;}; break;		// 1
				case 0x12 : {prepocetH+=10;}; break;		// 2
				case 0x14 : {prepocetH+=100;}; break;		// 3
				case 0x21 : {prepocetH-=1;}; break;		// 4
				case 0x22 : {prepocetH-=10;}; break;		// 5
				case 0x24 : {prepocetH-=100;}; break;		// 6
				case 0x41 : {prepocetL+=1;}; break;		// 7
				case 0x42 : {prepocetL+=10;}; break;		// 8
				case 0x44 : {prepocetL+=100;}; break;		// 9
				case 0x82 : {prepocetL-=10;}; break;		// 0
				case 0x81 : {prepocetL-=1;}; break;		// *
				case 0x84 : {prepocetL-=100;}; break;		// #
				case 0x18 :return(1);break; 						// ESC
				
						}

			//pipani
			key = 0;
			beep(200, 10);

			if(prepocetH>=180) prepocetH=180;
			if(prepocetL>=180) prepocetL=180;
			if(prepocetH<=0) prepocetH=0;
			if(prepocetL<=0) prepocetL=0;

			//prepocet uhlu na ciselnou hodnotu OCR3A
			natoceni1=1000+(prepocetH*5,5);
			natoceni2=1000+(prepocetL*5,5);
			//vypis hodnot
			OCR3A=natoceni1;
			OCR3B=natoceni2;
			
			clear_disp();
			sprintf(info1, "Servo 1:  %d°",prepocetH);
			sprintf(info2, "Servo 2:  %d°",prepocetL);

			put_string_xy(0, 0, info1);
			cursor_disp_ctrl(0x04);
			put_string_xy(0, 1, info2);

			PWM();
					}
	}
}

int PWM(void)
{
DDRE = 0x18; //povoleni portu PE3 a PE4 jako vystup PWM (OC3A a OC3B)
//Pouzita preddelicka 8 (prescaler)
ICR3=36864; //nastavenim ICR3=36864 dosahnu f=50Hz f=fxtal/N*TOP  N=8 ICR1=TOP

TCCR3A|=(0<<COM3A0)|(1<<COM3A1)|(0<<COM3B0)|(1<<COM3B1)|(1<<WGM31)|(0<<WGM30); // fazove korigovana PWM (0<<WGM31)|(1<<WGM30)

//######################PWM PRO SERVO 2 ################################



TCCR3B|=(0<<ICNC3)|(0<<ICES3)|(1<<WGM33)|(1<<WGM32)|(0<<CS32)|(1<<CS31)|(0<<CS30);
}
Ale nejak mi nechce jit

Kód: Vybrat vše

//prepocet uhlu na ciselnou hodnotu OCR3A
			natoceni1=1000+(prepocetH*5,5);
			natoceni2=1000+(prepocetL*5,5);
			//vypis hodnot
			OCR3A=natoceni1;
			OCR3B=natoceni2;
a tim padem mi nechtej jit serva respektive chcou se hybat ale snazi se najet nekam kam nemuzou co s tim?
Naposledy upravil(a) endthe dne 01 dub 2009, 18:11, celkem upraveno 1 x.

Uživatelský avatar
Ragnol
Příspěvky: 232
Registrován: 09 lis 2005, 01:00
Kontaktovat uživatele:

#2 Příspěvek od Ragnol »

místo toho zapiš

natoceni1=1000+(prepocetH*5,5);
natoceni2=1000+(prepocetL*5,5);
//vypis hodnot
OCR3A=natoceni1;
OCR3B=natoceni2;

hlavně nejen že jsem ti ušetřil dvě proměnný ale hlavně se v C desetinný čárka píše tečkou a ne čárkou ... proto to blbě počítalo.

OCR3A=1000+(prepocetH*5.5);
OCR3B=1000+(prepocetL*5.5);

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#3 Příspěvek od endthe »

tak sem to opravil ale stejne mi t porad nechce tocit servem poradi nekdo?

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#4 Příspěvek od Andrea »

Odkud spadla ta čísla, 1000, které přičítáš a 5.5, kterým násobíš?

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#5 Příspěvek od endthe »

Andrea píše:Odkud spadla ta čísla, 1000, které přičítáš a 5.5, kterým násobíš?
to je z vypoctu pokud 1500 je 90° , 1000 je 0° a 2000 je 180° potom to vychazi na
OCR3A=1000+(prepocetH*5.555555556);
OCR3B=1000+(prepocetL*5.555555556);

a to sedi je to pocitane pomoci trojclenky :)

mas snad jiny zpusob vypoctu delky pulzu z natoceni serva (podotykam zadavani je pomoci natoceni o 0° do 180° takze je to nutne prepocitat)

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#6 Příspěvek od Andrea »

endthe píše:to je z vypoctu pokud 1500 je 90° , 1000 je 0° a 2000 je 180° potom to vychazi na
OCR3A=1000+(prepocetH*5.555555556);
OCR3B=1000+(prepocetL*5.555555556);

a to sedi je to pocitane pomoci trojclenky :)

mas snad jiny zpusob vypoctu delky pulzu z natoceni serva (podotykam zadavani je pomoci natoceni o 0° do 180° takze je to nutne prepocitat)
Ale jak jsi přišel na to, že 1000 je 0° a 2000 je 180°?

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#7 Příspěvek od endthe »

Andrea píše:
endthe píše:to je z vypoctu pokud 1500 je 90° , 1000 je 0° a 2000 je 180° potom to vychazi na
OCR3A=1000+(prepocetH*5.555555556);
OCR3B=1000+(prepocetL*5.555555556);

a to sedi je to pocitane pomoci trojclenky :)

mas snad jiny zpusob vypoctu delky pulzu z natoceni serva (podotykam zadavani je pomoci natoceni o 0° do 180° takze je to nutne prepocitat)
Ale jak jsi přišel na to, že 1000 je 0° a 2000 je 180°?

no pouzivam serva HS 422
a 1ms je leva krajni poloha oznacena 0°
2ms je prava krajni poloha oznacena 180°

jinak to definovani ma byt ze kdyz dam 1000 tak delka bude 1ms
delal sem to podle tohoto a upravoval na megu128
http://winavr.scienceprog.com/example-a ... g-avr.html

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#8 Příspěvek od Andrea »

endthe píše:no pouzivam serva HS 422
a 1ms je leva krajni poloha oznacena 0°
2ms je prava krajni poloha oznacena 180°

jinak to definovani ma byt ze kdyz dam 1000 tak delka bude 1ms
delal sem to podle tohoto a upravoval na megu128
http://winavr.scienceprog.com/example-a ... g-avr.html
Když je 36864 = 20ms, tak jak může být 1000 = 1ms a 2000 = 2ms, to mi prosím vysvětli (asi někdo neumí přemýšlet a počítat a jen tupě opisuje cizí programy).

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#9 Příspěvek od endthe »

Andrea píše:
endthe píše:no pouzivam serva HS 422
a 1ms je leva krajni poloha oznacena 0°
2ms je prava krajni poloha oznacena 180°

jinak to definovani ma byt ze kdyz dam 1000 tak delka bude 1ms
delal sem to podle tohoto a upravoval na megu128
http://winavr.scienceprog.com/example-a ... g-avr.html
Když je 36864 = 20ms, tak jak může být 1000 = 1ms a 2000 = 2ms, to mi prosím vysvětli (asi někdo neumí přemýšlet a počítat a jen tupě opisuje cizí programy).
pokud se nepletu tak ICR3 je tech 36864 a to je pri tom pouzitem krystalu 50Hz


no dobre pokud to je tak tak to 1000 a 2000 nemuze byt
musi to byt 1843.2 pro 1ms 2764.8 pro 1,5ms a 3686.4 pro 2ms


tudiz ten prepocet by mel vypadat takto pokud sem dobre pocital:

Kód: Vybrat vše

			OCR3A=1843.8+(prepocetH*10.24);
			OCR3B=1843.8+(prepocetL*10.24);

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#10 Příspěvek od endthe »

ale stejne mam pocit ze se ty dve PWM ovlivnuji navzajem da se to nejak poresit?
jinak serva napajim externe
Naposledy upravil(a) endthe dne 01 dub 2009, 18:14, celkem upraveno 1 x.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#11 Příspěvek od Andrea »

Pokud nemáš chybu v programu, tak se ty PWM nemůžou ovlivňovat. Máš dobře blokované napájení, alespoň 470uF u každého serva?
A proč v programu po každém stisku klávesy znovu inicializuješ Timer3 a proč v té inicializaci děláš příkaz ICR1=TOP?

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#12 Příspěvek od endthe »

Andrea píše:Pokud nemáš chybu v programu, tak se ty PWM nemůžou ovlivňovat. Máš dobře blokované napájení, alespoň 470uF u každého serva?
A proč v programu po každém stisku klávesy znovu inicializuješ Timer3 a proč v té inicializaci děláš příkaz ICR1=TOP?
no to ICR3 tam je traba aby PWM melo frekvenci 50Hz pokud sem to dobre pochopil

jinak jak mam teda delat to PWM abych po kazdem stisku zmenil natoceni serva mam nechat poouze zmenu OCR3A a OCR3B a ten Timer3 inicializovat poze v mainu kde odskakuju z menu do teto fce?
serva napajim externe a u kazdeho mam 1000uF

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#13 Příspěvek od Andrea »

endthe píše:no to ICR3 tam je traba aby PWM melo frekvenci 50Hz pokud sem to dobre pochopil

jinak jak mam teda delat to PWM abych po kazdem stisku zmenil natoceni serva mam nechat poouze zmenu OCR3A a OCR3B a ten Timer3 inicializovat poze v mainu kde odskakuju z menu do teto fce?
Jistě, stačí tu inicializaci provést na začátku, pak už jen po stisku klávesy měnit OCR3A a B.

Uživatelský avatar
endthe
Příspěvky: 56
Registrován: 07 bře 2009, 01:00
Bydliště: Brno
Kontaktovat uživatele:

#14 Příspěvek od endthe »

Andrea píše:
endthe píše:no to ICR3 tam je traba aby PWM melo frekvenci 50Hz pokud sem to dobre pochopil

jinak jak mam teda delat to PWM abych po kazdem stisku zmenil natoceni serva mam nechat poouze zmenu OCR3A a OCR3B a ten Timer3 inicializovat poze v mainu kde odskakuju z menu do teto fce?
Jistě, stačí tu inicializaci provést na začátku, pak už jen po stisku klávesy měnit OCR3A a B.
dobre jdu to zkusit. Diky Andrejko
P.S.: jinak jakym zdrojem doporucujes napajet ty serva

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#15 Příspěvek od Andrea »

endthe píše:P.S.: jinak jakym zdrojem doporucujes napajet ty serva
Moc zkušeností s nima nemám, takže na nějaké doporučení si netroufám, ale na 4 tužkovky běhaly a na zdroj 5V/2A taky.

Odpovědět

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