Широтоимпульсная модуляция (ШИМ) — это широко используемый метод во встроенных системах для управления силовыми и аналоговыми сигналами. Он предполагает изменение рабочего цикла периодического сигнала для кодирования информации или управления средним значением сигнала. В этой статье мы рассмотрим несколько методов реализации ШИМ с примерами кода, предоставляя вам полный обзор того, как ШИМ можно использовать в различных приложениях.
- Программная ШИМ:
Программная ШИМ предполагает ручное переключение контактов через определенные промежутки времени для достижения желаемого рабочего цикла. Вот пример использования Arduino:
const int pwmPin = 9;
int dutyCycle = 128; // Range: 0-255
void setup() {
pinMode(pwmPin, OUTPUT);
}
void loop() {
// High state
digitalWrite(pwmPin, HIGH);
delayMicroseconds(dutyCycle);
// Low state
digitalWrite(pwmPin, LOW);
delayMicroseconds(255 - dutyCycle);
}
- Аппаратный ШИМ.
Многие микроконтроллеры имеют специальные аппаратные модули для генерации ШИМ. Вот пример использования встроенного аппаратного ШИМ Arduino:
const int pwmPin = 9;
int dutyCycle = 128; // Range: 0-255
void setup() {
pinMode(pwmPin, OUTPUT);
analogWrite(pwmPin, dutyCycle);
}
void loop() {
// Update duty cycle
dutyCycle = map(analogRead(A0), 0, 1023, 0, 255);
analogWrite(pwmPin, dutyCycle);
delay(10);
}
- ШИМ с использованием таймера/счетчика:
Некоторые микроконтроллеры предоставляют несколько таймеров/счетчиков, которые могут генерировать сигналы ШИМ. Вот пример использования библиотеки Arduino Timer1:
#include <TimerOne.h>
const int pwmPin = 9;
int dutyCycle = 128; // Range: 0-255
void setup() {
pinMode(pwmPin, OUTPUT);
Timer1.initialize();
Timer1.pwm(pwmPin, dutyCycle);
}
void loop() {
// Update duty cycle
dutyCycle = map(analogRead(A0), 0, 1023, 0, 255);
Timer1.setPwmDuty(pwmPin, dutyCycle);
delay(10);
}
- ШИМ на Raspberry Pi:
Raspberry Pi также поддерживает генерацию ШИМ на своих контактах GPIO. Вот пример использования библиотеки pigpio в Python:
import pigpio
pwm_pin = 18
duty_cycle = 128 # Range: 0-255
pi = pigpio.pi()
pi.set_PWM_range(pwm_pin, 255)
pi.set_PWM_dutycycle(pwm_pin, duty_cycle)
try:
while True:
# Update duty cycle
duty_cycle = int(pi.get_ADC(0) / 4.0)
pi.set_PWM_dutycycle(pwm_pin, duty_cycle)
time.sleep(0.1)
except KeyboardInterrupt:
pi.stop()
Широтоимпульсная модуляция (ШИМ) — это универсальный метод, используемый во встроенных системах для управления силовыми и аналоговыми сигналами. В этой статье мы рассмотрели различные методы реализации ШИМ, включая программную ШИМ, аппаратную ШИМ, ШИМ с использованием таймеров/счетчиков и ШИМ на Raspberry Pi. Понимание этих методов и примеров их кода позволит вам использовать ШИМ в ваших собственных встраиваемых проектах, от управления двигателем до регулировки яркости светодиодов и т. д.
Используя эти методы, вы можете повысить функциональность и производительность своих встроенных систем, сделав их более эффективными и адаптируемыми к широкому спектру приложений.