Полагаю если Вы читаете это то Вы имеете понятие что такое ШИМ и с чем его едят.
Хотел бы поделится своими наработками по программном ШИМе, знаю что этот вариант далеко не наилучший но всё же:
int counter = 0;
boolean state = false;
#define pwm_resolution 64 // 6 битный ШИМ
#define pwm_pin 13
void setup() {
pinMode(pwm_pin, OUTPUT);
}
void loop() {
software_pwm(pwm_pin, analogRead(A0) / 16); // для роботы функции её нужно
// постоянно вызывать иначе не будет работать таймер
}
void software_pwm(byte pin, byte pwm_level){
digitalWrite(pin, state);
state = LOW;
counter++;
if(counter > pwm_resolution){ // переполнение, нужно обнулить
counter = 0;
}
if(counter <= pwm_level){
state = !state;
}
if(pwm_level == 0){ // для устранения не полного коефициента заполнения
state = LOW;
}
if(pwm_level == pwm_resolution){ // аналогично
state = HIGH;
}
}
Чтобы код работал нужно чтобы таймер, у меня это переменная counter, постоянно "тикал" и при достижении какого-то значения сбрасывался в 0, знаю есть аппаратные таймеры которые дают больше возможностей но тем не менее для понятия реализации ШИМ на программном уровне этого кода считаю будет достаточно.
Как видите у меня таймер считает до 64, что соответствует 6-ти битам, можно конечно взять к примеру и 128 и 256 но тогда мигание уже будет заметно на глаз, особенно при 8-ми битах.
Видео программной симуляции:
Видео программной симуляции:
Комментариев нет:
Отправить комментарий