Sida 1 av 1

Styra servo med pic16f886

Postat: 3 augusti 2011, 10:51:11
av dubbear
Har köpt en borstlös rc motor med tillhörande esc.
Läser mig till att man styr esc'en med en 50-100hz pwm signal som ett varnligt hobyservo.

Nu får jag det till att jag inte kan få så låg pwm frekvens som 100hz när jag kör min uc i 4mhz
någonstans runt 300hz är lägsta värdet.
jag antar att jag kan köra min uc med en lägre frekvens men de stör usart kommunikationen och i2c kommunikationen som fins.
Det kanske är en dålig ide att styra servon med CCP modoulen i pwm läget i min uc?

Har tittat på denna tråden http://elektronikforumet.com/forum/view ... ervo+100hz
Och jag antar att om pwm läget inte lämpar sig är detta vägen att gå?

Re: Styra servo med pic16f886

Postat: 3 augusti 2011, 11:35:25
av ToPNoTCH
Som du själv kommit på är den inbyggda CCPWM modulen oanvändabr för servon.

Använd timers och interrupt i stället.

Det mest pedagogiska är att rita upp vågformen som servot skall få på ett papper.
Markera tiderna när pinnen skall sänkar respektive höjas, så blir det ganska lätt att lista ut hu man skall nyttja timern.
Det är dessutom marginellt svårare att styra fler servon om man har "grund loopen" klar.

Re: Styra servo med pic16f886

Postat: 3 augusti 2011, 12:40:32
av dubbear
Okej det var nog det jag "befarade"
Bara att sätta igång då,

Re: Styra servo med pic16f886

Postat: 3 augusti 2011, 12:45:13
av sodjan
> när jag kör min uc i 4mhz

Ja *det* är ju inte speciellt snabbt !
Du bör nog upp i MHz området i alla fall...

Men annars så är ju servostyrning en ganska vanlig
applikation, det finns säkert massor av exempel "out there".
Och det är ju en ganska simpel timer-applikation. Några frågor
som man ska ta tidigt är t.ex hur många steg (d.v.s upplösning)
som man behöver. Ibland vill man bara styra mellan två fasta lägen,
ibland 10 eller kanske 100 olika lägen. Det styr lösningen en del.

Re: Styra servo med pic16f886

Postat: 3 augusti 2011, 14:52:22
av Icecap
På min hemsida, under "Freebies", finns ett projekt med PIC16C628A som kan styra ett antal servos. Använder en timer och för att ställa servopositionen ska man bara ändra den motsvarande variabel i mitten, interrupten tar hand om resten. Källkod i C finns med.

Re: Styra servo med pic16f886

Postat: 8 augusti 2011, 02:59:16
av dubbear
Ja tittade på lite exempel från "out there" och ditt exempel Icecap,
Men skrev ett eget så ja verkligen fattar hur det funkar
vet inte om det är till nytta för någon men så här blev det

Kod: Markera allt

static void interrupt
isr(void)
{
	T0IF = 0; 	// clear the interrupt flag
	
	if (servo1F) 					//Roder servo Flagga	
		{
		SERVO1 = 1; 				//Roder servo pwm port
		servo1F	=	0;	
		Motor_servoF = 1 ;			//Flagga för ESC 	
		TMR0 = servo1timer;			//Sätter Timer0 till vald tid Default 1.5ms
		return;
		} 
	
	if(Motor_servoF){				//Motor esc  Flagga
		SERVO1 = 0;
		Motor_servo = 1;			//Motor esc  pwm port
		Motor_servoF =0;
		puls20	= 1;				//Fagga för 100hz signalen
		TMR0 = Motor_servotimer ;	//Sätter Timer0 till vald tid Default 1ms
		return;
		}
	
	if (puls20)	
		{
		Motor_servo = 0;
		servo1F =1 ;
		TMR0 = 0b00000000; 			//100 hz
		return;
		
		}
	
	
	}
Tips eller frågor tas emot hjärtligt