Modulación ángulos servomotor con voltimetro

Hola. Necesito ayuda con una modulación de ángulos de un servomotor.
El código que estoy haciendo es este.
Código:
#include <16f887.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )  
#BYTE TRISB = 0x86            
#BYTE PORTB = 0x06            

int16 Angulo;
int16 TON;
int16 TOFF;

void main()
{    
set_tris_b(0x00);    
set_tris_a(0x1F); 

   
while (TRUE) {

set_adc_channel(0);
delay_us(20);
Angulo=read_adc();
Angulo=Angulo*180/1023;
TON=1000+(Angulo*1000/180);
TOFF=20000-TON;


output_high(PIN_B0);
delay_us (TON);  
output_low(PIN_B0);
delay_us(TOFF);
 



   }
 }


Al montar el voltímetro en el channel(0) en la simulación del proteus, el motor no marca nada.
¿Podrían ayudarme con algunas sugerencias?

Muchas gracias de antemano.
 
Última edición por un moderador:
Te hace falta configurar el conversor ADC.

Agrega esto dentro del void main.
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_INTERNAL);

Y si únicamente vas a utilizar el canal 0, también puedes establecer el canal dentro del void main, pues no tiene sentido estar estableciendo constantemente el canal dentro del bucle.

Suerte.
 
Muchas gracias por responder , aplique los cambios que me indicaste , y la salida del RB0 me entrega un constante angulo 90 aunque varíe el potencio-metro , aquí esta la simulación y el código, si podrías indicarme cuales son mis errores estaría muy agradecido
 

Adjuntos

  • Motor.rar
    45 KB · Visitas: 10
acabo de revisar el archivo adjunto que subí , el código es igual con los cambios que me indico darkbites , y la simulación esta en proteus 8 , quizás tienes una versión anterior , el nombre de la simulación es motor.pdsprj
 
Muchas gracias por responder. Apliqué los cambios que me indicaste y la salida del RB0 me entrega un constante angulo 90 aunque varíe el potenciómetro
Aquí está la simulación y el código.
Si podrías indicarme cuales son mis errores, estaría muy agradecido.
Lo que pasa es que lo único que debiste poner fuera del bucle es la selección del canal.
Así:
Código:
void main()
{ 
   setup_adc_ports(sAN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_us(20);
   
   
while (TRUE) {   
   Angulo=read_adc();
   Angulo = Angulo * 180/1023;
   TON=1000+(Angulo*1000/180);
   TOFF=20000-TON;
   
   output_high(PIN_B0);
   delay_us (TON);  
   output_low(PIN_B0);
   delay_us(TOFF);
   }
 }
Tampoco son necesarios los set_tris_x(); porque estás usando output_high(); y output_low();
Esas instrucciones configuran los pines seleccionados automáticamente como salidas.
Disculpa, No has puesto la simulación en el archivo adjunto y el código es distinto.
mivg sí adjuntó la simulación, pero es para proteus 8, y el código es el mismo pero modificado.

Saludos.
 
Última edición:
escribí el código con los correcciones nuevas darkbytes , pero , sigue marcándome 90 el servomotor aunque suba o baje el nivel de voltaje , ¿es un problema de la simulacion?



no le había puesto los 4MHZ en processor clock frequency , ya solucione el problema , era un error como novato que soy :LOL: , muchas gracias por tu ayuda darkbytes
 
Última edición:
escribí el código con los correcciones nuevas darkbytes , pero , sigue marcándome 90 el servomotor aunque suba o baje el nivel de voltaje , ¿es un problema de la simulacion?
No lo sé, tampoco tengo un servomotor para realizar pruebas, pero adjunto el proyecto con los cambios que te mencioné.
Compara si este funciona o hace lo mismo que el tuyo.

Edit:
Solucionaste el problema mientras preparaba los archivos.
no le había puesto los 4MHZ en processor clock frequency , ya solucione el problema , era un error como novato que soy :LOL: , muchas gracias por tu ayuda D@rkbytes

Me parece bien. :)

Suerte.
 

Adjuntos

  • Motor.rar
    26.2 KB · Visitas: 7
Última edición:
Atrás
Arriba