En esta práctica vamos a integrar la práctica del servomotor junto con la del ADC para que mediante un potenciómetro se varíe el voltaje de entrada a Miuva, y esto ocasione que el servomotor se mueva proporcionalmente al giro del potenciómetro.
Definiremos en una función de interrupción por desborde del timer0 el proceso para mandar el pulso deseado al servomotor, recordando que este debe de ser con un periodo de 20ms y el pulso en alto debe de durar entre 1 y 2ms.
Podemos ver las siguientes equivalencias de: Valor_digital -> Voltaje -> Tiempo en microsegundos
valor_digital -> Voltaje -> tiempo_alto
1023 -> 5V -> 1000
La conversión del dato digital a voltaje y a tiempo la podemos realizar de la siguiente forma:
Voltaje = valor_digital * 5.0 / 1023.0
tiempo_alto = voltaje * 1000.0 / 5.0
valor_digital = read_adc(); //Lee el ADC voltaje = 5.0*valor_digital/1024; //Convierte el ADC a voltaje TIEMPO_ALTO = voltaje * 1000.0/5.0; //Convierte el voltaje a un valor entre 0 y 1000
Entonces tendremos los valores en microsegundos para 0 y 1ms, por lo tanto si le sumamos 1000 a cada valor, tendremos el valor en microsegundos para 1 y 2ms que son justo los valores que necesitamos.
TIEMPO_ALTO = TIEMPO_ALTO + 1000; //Convierte a un valor entre 1000 y 2000
Este tiempo en alto se enviará al servomotor en la función de interrupción y posteriormente tendremos que calcular el tiempo que debe de tardar en desbordarse el timer0 para que haya pasado el periodo de 20ms.
Con esto podemos crear el siguiente código: