Llegamos a la 6ª entrega con los siguiente temas ya hablados:
- Introducción parte 1
- E/S Digitales parte 2
- Entradas analógicas parte 3
- PWM parte 4
- Interrupciones externas parte 5
Hoy nos toca hablar de un tema interesante que son los TC (Timer/Counter) que se utilizan para realizar la generación de onda de los PWM, como vimos en el POST-Rust-PWM, pero en este caso los vamos a programar nosotros para generar esta onda de forma muy personalizada para el uso del servomotor que deseemos.
Tenemos 3 Timer/Counter (TC) nos van a permitir contar tiempo, que veremos en otro POST, y generar una onda PWM.
Tendremos el ejemplo servomotor.rs que nos permitirá realizar los movimientos de un servomotor, adaptando esta generación de onsa segun el servo que utilicemos.
Utilizaremos el TC1 que como se puede ver en la tabla anterior, es un contador de 16 bits lo que nos va a permite contar 2^16=65.536, que es el de mayor precisión ya que los otros dos son de 8 bits (2*8=256),así que lo primero sera definir el pin de salida a utilizar y el TCx.
// Ideales para la Onda de un motor paso a paso ya que son de 16 bits
//pins.d9.into_output();
pins.d10.into_output();
let tc1 = dp.TC1; //TC0 (d6, d5) TC1 (d9, d10) TC2 (d11, d3)
Según la frecuencia que necesitemos, deberemos calcular el Prescalar a utilizar (1-Directo,8,64,256,1024) según la tabla adjunta, así como la frecuencia y Ticks según el contador.
Tenemos que tener claro que un segundo es igual a 1/1Hz.
Para conocer el número de ticks que necesitaremos usaremos la formula Ticks = Tμs / Tiempoμs así para tener una frecuencia de 50Hz (0,2segundos) vemos que nos cuadraría usar un prescaler de 64 y tendríamos
(0,02segundos * 1000000) / 4 = 5000 Ticks (el 4 es el tiempo que corresponde al prescaler 64)
Una vez que ya conocemos los Ticks que necesarios programaremos el registro ICR1 ya que vamos a utilizar el TC1, después definiremos los registros wgm1 para que nos generen un PWM rápido con los Tick que se marcaron en ICR1(1110) y el OC1x con el pin y el prescaler utilizado en la formula.
// Definimos los ticks necesarios en icr1
tc1.icr1.write(|w| w.bits(4999));
// En WGM1 se define Fast PWM y OC1B (corresponde al pin 10) con el prescaler a 64 que es lo que se calculo.
tc1.tccr1a.write(|w| w.wgm1().bits(0b10).com1b().match_clear());
tc1.tccr1b.write(|w| w.wgm1().bits(0b11).cs1().prescale_64());
Y con esto finalizamos esta entrada o POST, para finalizar con la proxima en la que trataremos de los contadores de tiempo con un ejemplo de uso del Sonar HC-SR04.