пятница, 9 мая 2014 г.

Программный ШИМ на любом выводе на примере ATtiny13A


Полагаю если Вы читаете это то Вы имеете понятие что такое ШИМ и с чем его едят.
Хотел бы поделится своими наработками по программном ШИМе, знаю что этот вариант далеко не наилучший но всё же:


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-ми битах.
Видео программной симуляции:

http://youtu.be/SUMvR6vpI3k

Вот уже в работе:


Комментариев нет:

Отправить комментарий