Problema extraño del control de velocidad del servo

3

Estoy tratando de controlar un servomotor utilizando PIC 12F675. Tuve éxito manejando el servo así como logrando el control de velocidad para el servo. Gracias por la ayuda de Stack Exchange

Ahora, mi control de velocidad es bastante inestable. Intenté ajustar mi código aquí y allá, pero hasta ahora no he tenido éxito.

Mi principal objetivo es que el servo gire de 0 a 90 y retroceda según los datos del conmutador. Logré este objetivo. Cuando enciendo un potenciómetro, la velocidad a la que gira el servo debería cambiar. Logré esto también. Sin embargo, el servo no está girando 90 grados en todo momento.

Gira 90 ish -120 grados a altas velocidades y gira solo 30-45 grados a bajas velocidades (o algo extraño está ocurriendo). Quiero que mi servo gire 90 grados, pero solo mi velocidad debería variar.

¿Puede alguien señalarme el error en mi código?

GO_DONE=1; // start ADC
while(GO_DONE); // wait for ADC to complete
V_in=(ADRESH<<8)|ADRESL; //copy ADC values into a variable V_in
quotient=V_in/200; // I am dividing this because I will have integers between 1 to 5
// I am using this quotient value to magnify/diminish my time delays for speed

if(quotient<=1) 
{
    quotient=1; //fool proofing
}

if(GPIO&(1<<3)) //checking whether toggle switch is high. If yes, go forward else reverse
{
    while(counter>1000) //this counter is for the delay cycles.
    {
        counter=counter-(20*quotient);
        GPIO|=(1<<2);
        cnt_1=counter;
        while(cnt_1>0)
        {
            __delay_us(1);
            cnt_1--;
        }
        GPIO&=~(1<<2); //low signal
        __delay_ms(18);
    }
    cnt=1000;//reset of counter for reverse direction
}
elseif(!(GPIO&(1<<3))) // check if switch is low
{
    while(cnt<1500)
    {
        cnt=cnt+(20*quotient);
        GPIO|=(1<<2);
        cnt_2=cnt;
        while(cnt_2>0)
        {
            __delay_us(1);
            cnt_2--;
        }
        GPIO&=~(1<<2);
        __delay_ms(18);
    }
    counter=1500;//reset of counter for forward direction
}
    
pregunta Sai

1 respuesta

2

Debería establecer counter antes del bucle al comienzo de los bloques condicionales.

Además, puede usar el mismo contador para ambos bucles externos.

Los bucles internos se pueden reemplazar por __delay_us (counter) .

Aparte de eso, parece que debería aumentar la PWM muy bien.

Su PIC admite PWM en dos puertos, lo que automatiza lo que está haciendo en el software. Inténtelo, porque su función programada de retardo será muy difícil de programar una vez que intente hacer otra cosa también.

    
respondido por el posipiet

Lea otras preguntas en las etiquetas