Cómo crear una modulación de ancho de pulso (PWM) en un módulo Verilog para ejecutar un motor / servo
Una modulación de ancho de pulso es una manera de controlar la rotación o la posición de un motor eléctrico o servo.
Utilizando Verilog HDL, voy a mostrar lo fácil que es utilizar contadores con el fin de crear un PWM.
Cosas que necesitará
- Xilinx ISE
- FPGA
- Servo motor
Entonces, ¿cómo funciona un pwm?
Tener una señal rectangular periódica, cambiamos el ciclo de trabajo (modular) a ser más pequeño o más grande y por lo tanto controlar nuestro dispositivo.
¿Por qué usar un PWM?
Es una cámara digital simple de la técnica de conversión analógica que no requiere un ADC.
Ok, por lo que permite pensar lo entradas, salidas, registros y contadores que se necesita y lo que el diseño que queremos crear.
Quiero usar los ocho interruptores en el tablero Spartan FPGA para controlar cómo mis motor / servo se mueve o qué tan rápido o lento que quiero que se mueva.
Entradas: reloj, 8 interruptores
Salidas: PWM
Registros: PWM
Contadores: contador de 16 bits (a explicar por qué los 16 bits más adelante)Saber cuál es la velocidad de reloj de la FPGA y qué período que le gustaría utilizar.
Tengo un tablero Spartan FPGA con un reloj de 50 MHz. Me gustaría actualizar la señal de cada 1 milisegundo (t). Aplicamos el siguiente cálculo para encontrar el período de forma de onda (p)
p = t * reloj FPGA
En mi caso:
p = .001 segundos * 50MHz = 50,000
Conociendo mi p es importante con el fin de calcular mi retardo de paso (SD):
sd = p / 256 = 195
¿Por qué utilizo 256? Me va a utilizar 8 interruptores para controlar mi servo / motor, por lo que 2 ^ 8 = 256.
Finalmente queremos utilizar nuestro contador como nuestro ciclo de trabajo. Para calcular el número de bits consta nuestro contador usamos:
log2 (sd) = cantidad de bits es nuestro contador
Mientras que el contador es menor que sd (retardo de paso) multiplicado por el valor interruptores (que puede variar de 0 a 255), este es nuestro ciclo de trabajo.
Consejos advertencias
- Al crear el contador de registro que no pueda hacerlo inicializado a cero de lo contrario el programa no funcionará.