Изучение методов реализации ШИМ: примеры кода и приложения

Широтоимпульсная модуляция (ШИМ) — это широко используемый метод во встроенных системах для управления силовыми и аналоговыми сигналами. Он предполагает изменение рабочего цикла периодического сигнала для кодирования информации или управления средним значением сигнала. В этой статье мы рассмотрим несколько методов реализации ШИМ с примерами кода, предоставляя вам полный обзор того, как ШИМ можно использовать в различных приложениях.

  1. Программная ШИМ:
    Программная ШИМ предполагает ручное переключение контактов через определенные промежутки времени для достижения желаемого рабочего цикла. Вот пример использования 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);
}
  1. Аппаратный ШИМ.
    Многие микроконтроллеры имеют специальные аппаратные модули для генерации ШИМ. Вот пример использования встроенного аппаратного ШИМ 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);
}
  1. ШИМ с использованием таймера/счетчика:
    Некоторые микроконтроллеры предоставляют несколько таймеров/счетчиков, которые могут генерировать сигналы ШИМ. Вот пример использования библиотеки 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);
}
  1. ШИМ на 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. Понимание этих методов и примеров их кода позволит вам использовать ШИМ в ваших собственных встраиваемых проектах, от управления двигателем до регулировки яркости светодиодов и т. д.

Используя эти методы, вы можете повысить функциональность и производительность своих встроенных систем, сделав их более эффективными и адаптируемыми к широкому спектру приложений.