вторник, 9 февраля 2016 г.

Исследуем ШИМ.

Всем читателям блога привет. Сегодня затронем один очень интересный вопрос: применение ШИМ в ардуино. Но сначала давайте постараемся разобраться что это такое, и даже более увидеть, как широтно-импульсная модуляция будет практически реализована в нашем проекте, и более того мы даже сможем увидеть, что представляет ШИМ на экране осциллографа.

Широтно-импульсно модулированный сигнал очень часто применяется в электронике для передачи информации, регулировки мощности или формирования постоянного напряжения произвольного уровня. ШИМ-сигнал (PWM) представляет собой последовательность импульсов, частота которых неизменна, а модулируется длительность импульсов.
где T – длительность периода, с;
t – время действия импульса (длительность), с;
D – коэффициент заполнения.
То есть, не смотря на то, что скважность и коэффициент заполнения могут использоваться в одинаковом контексте, физический смысл их отличается. Эти величины безразмерны. Коэффициент заполнения обычно отображают в процентах (%).

Скважность это отношение периода следования импульсов к их длительности. На рисунке – чем больше мгновенное значение управляющего сигнала, тем меньше скважность импульсов ШИМ-сигнала. Этот способ модуляции широко применяется в технике ввиду того, что позволяет произвольное среднедействующее значение средствами цифровых устройств. Этот способ применим в тех случаях, когда необходимо, например, плавно регулировать яркость свечения лампы, температуры нагревателя, скорость вращения мотора постоянного тока и так далее.

Arduino имеет встроенную функцию для формирования ШИМ-сигнала – analogWrite(pin,value). У этой функции два параметра: pin – номер вывода, на котором формируется сигнал; value – относительное значение скважности импульсов.
Value может принимать значения от 0 до 255. Причем максимальная скважность получается при 0 (а среднедействующее значение минимально), а минимальная при 255 (среднедействующее максимально).
Функция analogWrite может работать только с выводами 3, 5, 6, 9, 10, 11(на плате Arduino Uno). Соответственно, только такие значения может принимать переменная pin.
Если использовать эту функцию для управления другим выводом (например 2, 4, 7, 12, 13), то при значения скважности от 0 до 127 на выводе будет низкий уровень напряжения, а при 128-255 – высокий.
Теперь давайте рассмотрим скетч (заставим плавно зажигать светодиод, и так же плавно его гасить в бесконечном цикле):

int LED=9;

void setup()
{
pinMode (LED, OUTPUT);
}
void loop()
{
for (int i=0; i<256; i=i+1)
{
analogWrite (LED, i);
delay (10);
}
for (int i=255; i>=0; i=i-1)
{
analogWrite (LED, i);
delay (10);
}
}

пояснения к скетчу
int LED=9; (задействуем 9 вывод, который может формировать ШИМ, можно было использовать так же 3, 5, 6, 10 и 11 выводы)

for (int i=0; i<256; i=i+1) цикл в ходе которой переменной i будут присваиваться значения от 0 до 255 (то есть попросту с каждым циклом переменная будет увеличена на 1). Так же обратите внимание что часто вместо i=i+1 пишут i=i++

analogWrite (LED, i);
delay (10); здесь как раз и происходит формирования ШИМ сигнала с разным уровнем скважиности, благодаря чему и будет на светодиод подаваться плавно нарастающее напряжение (хотя на самом деле не напряжение а время прохождения импульса) в результате чего светодиод будет плавно увеличивать яркость.
Во втором цикле все происходит с точностью до наборот: то есть происходит плавное уменьшение переменной i от 255 до 0 с последующей записью ШИМ на 9 пин.



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

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