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