Adc con pic para controlar un servomotor rc

#1
hola que tal,estoy tratando de controlar un servomotor con potenciometro, al girar el pot deve girar al mismo tiempo el servomotor rc, lo que no se, es la conversion de adc a us
estoy trabajando en pic c compiler con un pic16f877a, el adc lo estoy trabajando a 10 bits
(1024). esto es lo q tengo en la lectura adc
while(1){
set_adc_channel(0);
delay_us(10);
q=read_adc();
p=q; // esta deberia de ser mi conversion de adc a us
x=20000-p;
portb=0x01;
delay_us(p);
portb=0x00;
delay_us(x);
}
 
#3
Dependerá de tu servo. Hay servos que funcionana desde 0.5mS a -90º, 1ms 0º y 1.5mS a 90º otros van de 1 a 2 ms. Averigua cual es el tuyo y luego la conversión es sencilla.

pones p=(q*1000/1024)+500;

De ese modo si q vale 1024, 1024/1024=1 1*1000= 1000 1000+500=1500uS
Si es 512, 512/1024=0.5 0.5*1000= 500 500+500= 1000uS
para 0 bueno 500 uS

Ten en cuenta que en la declaración de las variables necesitarás declararla como floats si lo haces en pasos intermedios y quieres guardar los decimales.


Eso será para cuando sea el caso de 0.5mS hasta 1.5mS

Saludos!
 
#5
Hola, lo que yo hago es usar el adc a 10bits de resolucion (varia entre 0 y 1023), como el pulso alto del servo varia entre 1000uS y 2000uS, yo hago un delay sumando al resultado del conversor 1000uS. Asi el pulso va a variar entre 1000uS (adc al minimo) y 2023 (adc al maximo).
"Un programa vale mas que mil palabras":)

PHP:
while(1)
	{ 	
	SERVO=1;
	delay_us(1000+v);
			
	SERVO=0; delay_ms(15);
	v=read_adc();          delay_ms(5);
	}
Es muy sencillo y muy inestable, lo que recomiendo es usar interrupciones.
Saludos
 
Arriba