Rust-Embebido «Arduino» ServoMotor (Generación de onda) parte 6

Llegamos a la 6ª entrega con los siguiente temas ya hablados:

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Javier.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Hostinger.es que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad