Inicio Noticias Pi IoT en Python usando Linux - controladores PWM

Pi IoT en Python usando Linux – controladores PWM

Página 1 de 4

PWM es un modo de salida básico adecuado para controlar servos, motores y más. Linux tiene un controlador, lo que significa que puede usar PWM sin preocuparse por el hardware si sabe cómo hacerlo.

Este contenido proviene de nuestro libro recién publicado:

Raspberry Pi IoT en Python usando controladores de Linux

Por Harry Fairhead y Mike James

Compra en Amazon.

Contenido

Elegir una Pi para IoT

Empezando con Python

Driver: un primer programa

El controlador de fuente GPIO

GPIO usando el control de E / S

Eventos GPIO

El árbol de dispositivos
Extracto: DHT22

Un poco de electrónica

Modulación de ancho de pulso
Extracto: PWM *** ¡¡NUEVO !!

Dispositivos SPI

Conceptos básicos de I2C

El controlador de Linux I2C

Avanzado I2C Avanzado

Controlador de sensor

Bus de 1 cable
Saque 1-Wire y el DS18B20

Vaya más lejos con los conductores

Apéndice I.

Una forma de solucionar el problema de obtener una respuesta rápida de un microcontrolador es eliminar el problema del procesador. En el caso del procesador Pi, hay algunos dispositivos integrados que pueden usar líneas GPIO para implementar protocolos sin que la CPU esté involucrada. En este capítulo veremos más de cerca la modulación de ancho de pulso (PWM), incluida la generación de sonido y la conducción de LED.

Mientras realizan su función más básica, que es la salida, el procesador puede establecer las líneas GPIO en alto o bajo. La velocidad a la que se pueden establecer en alta o baja depende de la velocidad del procesador.

Usando la línea GPIO en su modo Pulse Width Modulation (PWM), es posible generar trenes de pulsos de hasta 4.8 MHz, es decir, pulsos de poco más de 0.08 µs. El motivo del aumento de velocidad, en un factor de al menos 100, es que el GPIO está conectado a un generador de impulsos y, una vez configurado para generar impulsos de un tipo específico, el generador de impulsos simplemente lo hace funcionar sin necesidad de ningún intervención de la línea GPIO o del procesador. De hecho, la salida de pulsos puede continuar una vez finalizado el programa si se olvida de restablecerlo.

Por supuesto, aunque la línea PWM puede generar pulsos tan pequeños como 0,1 µs, solo puede cambiar los pulsos que produce siempre que el procesador pueda cambiarlos. Por ejemplo, PWM no se puede utilizar para producir un solo pulso de 0,1 µs porque no es posible desactivar el generador de PWM en solo 0,1 µs. Dicho esto, el PWM generado por hardware está disponible en el Pi, y hay un buen controlador PWM que lo hace muy fácil de usar.

Algunos datos básicos sobre Pi PWM

Hay algunos hechos que vale la pena aclarar desde el principio, aunque su significado completo solo se aclarará a medida que avancemos.

En primer lugar, ¿qué es PWM? La respuesta simple es que una señal modulada por ancho de pulso tiene pulsos que se repiten a una frecuencia fija, como un pulso cada milisegundo, pero el ancho de pulso se puede cambiar.

Hay dos cosas fundamentales que especificar sobre el tren de pulsos que se genera, su frecuencia de repetición y su ancho.
de cada impulso. Por lo general, la tasa de repetición se establece como un período de repetición simple y la amplitud de cada pulso se especifica como un porcentaje del período de repetición, llamado ciclo de trabajo. Entonces, por ejemplo, una repetición de 1 ms y un ciclo de trabajo del 50% especifica un período de 1 ms, que es alto durante el 50% del tiempo, que es un ancho de pulso de 0,5 ms.

pwm1

Los dos extremos son el ciclo de trabajo del 100%, es decir, la línea siempre es alta y el ciclo de trabajo del 0%, es decir, la línea siempre es baja. El ciclo de trabajo es simplemente la proporción de tiempo que la línea se establece en un valor alto. Tenga en cuenta que es el ciclo de trabajo el que lleva la información en PWM y no la frecuencia. Esto significa que normalmente selecciona una tasa de repetición y se apega a ella, y lo que cambia durante la ejecución del programa es el ciclo de trabajo.

Hay muchas formas de especificar una señal PWM: frecuencia y ciclo de trabajo, tiempo alto y tiempo bajo, etc. Es fácil convertir entre estas diferentes representaciones.

Como puedes imaginar, no hay entradas PWM, solo salidas. Si por alguna razón necesita decodificar o responder a una entrada PWM, necesita programarla usando las líneas de entrada GPIO y las técnicas de medición de pulso presentadas en los capítulos anteriores.

Software PWM

La alternativa al hardware PWM dedicado es implementarlo en software. Puede descubrir fácilmente cómo hacerlo. Todo lo que se necesita es establecer un ciclo de temporización para establecer la línea alta en la tasa de repetición y luego establecerla baja nuevamente de acuerdo con el ciclo de trabajo. El software PWM se puede implementar fácilmente utilizando el controlador de caracteres GPIO:

importar gpiod desde el tiempo import sleep chip = gpiod.Chip («0») line = chip.get_line (4) line.request (consumer = «myprog.py», type = gpiod.LINE_REQ_DIR_OUT, default_vals =[0]) period = 20 duty = 25 ontime = period / 1000 * duty / 100 offtime = period / 1000 – ontime while (True): line.set_value (1) sleep (ontime) line.set_value (0) sleep (offtime)

La idea básica es tomar el período en ms y el ciclo de trabajo como un porcentaje y calcular el tiempo de encendido y apagado.

Una versión más avanzada del mismo programa usa un hilo para implementar la activación / desactivación de la línea PWM. Para entender cómo funciona tienes que estar satisfecho con los hilos:

import gpiod from time import sleep import threading def soft PWM (line, period, duty): ontime = period / 1000 * duty / 100 offtime = period / 1000 – ontime while (True): line.set_value (1) sleep (ontime) line .set_value (0) sleep (offtime) chip = gpiod.Chip («0») line = chip.get_line (4) line.request (consumidor = «myprog.py», type = gpiod.LINE_REQ_DIR_OUT, default_vals =[0]) period = 20 duty = 75 IntThread = threading.Thread (target = softPWM, args = (line, period, duty)) IntThread.start () while (True): print («working», flush = True) sleep (2 )

Esto generará la señal PWM en la línea gpio especificada independientemente del programa principal. Si desea usarlo en producción, debe agregar el manejo de errores y algunas funciones para pausar y detener el hilo.

La precisión de la señal PWM disminuye a medida que aumenta la frecuencia. En un período de 20 ms y un ciclo de trabajo del 25%, la frecuencia y el ciclo de trabajo son típicamente de 48,5 Hz y 25,5%, que es aproximadamente un 2% de precisión, pero a 2 ms los dígitos son 425 Hz y 29%, que es aproximadamente un 10% de precisión. Se vuelve cada vez más inexacto y se vuelve inutilizable a alrededor de 1 kHz. La razón es que el sueño se usa para los tiempos. Esto suspende el hilo y depende del sistema operativo para reiniciarlo. El problema es que cuando el tiempo de suspensión solicitado se acorta, el sistema operativo no puede reiniciar el subproceso lo suficientemente temprano debido a que otros subprocesos se ejecutan mientras el subproceso PWM está suspendido. Puede reemplazar la llamada de suspensión con un ciclo de espera ocupado para que la sincronización sea más precisa, pero esto no permitiría que el sistema operativo ejecute otro hilo mientras espera. Esto funcionaría bien en un Pi 4 multinúcleo, pero no tan bien en un Pi Zero de un solo núcleo.

El software PWM implementado no se puede utilizar para frecuencias más altas. Sin embargo, es lo suficientemente bueno para funcionar a 50Hz, lo que es adecuado para conducir servos, ver más abajo.

Marc Gomez
Vine a por tabaco y ya me quedé aquí. Cuando no estoy en el sótano de Tecnopasion suelo pasear por las calles de Barcelona.
RELATED ARTICLES