Пятница, 19.04.2024, 16:13
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Обмен опытом » Arduino для школьников

7. Широтно-импульсная модуляция (ШИМ).

Широтно-импульсная модуляция (ШИМ).

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

Идея ШИМ проста до безобразия. Пусть передача производится с частотой h = 1/T. Будем считать, что импульс, равный периоду Т, задает максимальное значение (100% некой величины, нечто целое). Примем также, что отсутствие импульса (т.е. его длина равна нулю) - это минимальное значение (0%). Далее остается предположить, что все варианты длины импульса от 0 до T задают доли или проценты от целого значения. Таким образом передаваемое значение кодируется шириной передаваемого импульса. Это очень удобно для передачи аналоговых сигналов. Проще всего продемонстрировать работу ШИМ на примере все того же светодиода.

В предыдущих статьях была написана программа, в которой мы либо зажигали либо гасили светодиод. Т.е. последний горели или с максимальной яркостью, или не горел вовсе. Использование ШИМ позволяет нам управлять яркостью светодиода. Вот код простой программы, которая заставляет гореть светодиод на выводе D10 нашей Arduino UNO с яркостью 50% от максимума.

int led = 10;

void setup() {            
  pinMode(led, OUTPUT);    
  analogWrite(led, 128);
}

void loop() {
}

В этом примере была использована функция analogWrite(). В качестве аргументов она принимает два значения: первое - это номер вывода, на котором будет формироваться сигнал, а второй - это собственно значение сигнала. Тут надо отметить, что значение задается не в процентах, а в целочисленных "попугаях" от 0 до 255. Почему так? Для того, чтобы понять ответ на этот вопрос надо вернуться к "машинной азбуке". Функция принимает на вход значение в один байт (или 8 бит). При помощи одного байта можно закодировать любое целое число в диапазоне от 0 до 255... :)

Надо так же отметить, что эта функция будет работать далеко не на всех выходах Arduino. Связано это с конструктивными особенностями микроконтроллера. К этому вопросу мы вернемся позднее. Пока же, чтоб понимать какие выводы мы можем использовать для вывода ШИМ достаточно обратиться к схематическому описанию назначения контактов (распиновке) нашей платы Arduino. Выводы с пометкой PWM или ~ могут использоваться для вывода ШИМ. В книге Днищенко В.А. "Дистанционное управление моделями" очень хорошо описано применение ШИМ для пропорционального управления моделями. Я не буду тут пересказывать всю книгу, а остановлюсь лишь на примере управления сервоприводом. За многие годы стандарт сигнала управления для выше означенных аналоговых устройств успел устояться. Так любая сервомашинка будет работать с сигналом ШИМ с частотой 50Гц и шириной импульса от 1000 до 2000 микросекунд. Для некоторой среднестатистической сервы это будет означать следующее:

Угол поворота сервы равен -60 градусов

Угол поворота сервы равен 0 градусов (центральное положение)

Угол поворота сервы равен 60 градусов.

Для формирования ШИМ с такими характеристиками в стандартную Arduino IDE включена библиотека Servo. Надо сказать, что в отличие от analogWrite, эта библиотека может управлять сервоприводом на любом выводе Arduino. Вот пример кода из этой библиотеки:

#include <Servo.h> //цепляем библиотеку Servo к нашей программе
 
Servo myservo;  // Создаем переменную myservo объектного типа
                // сам тип как раз и описан в библиотеке Servo
 
int pos = 0;    // переменная для хранения угла отклонения сервопривода
 
void setup()
{
  myservo.attach(9);  // говорим программе, что наш сервопривод прицеплен к выводу 9 Arduino
}
 
void loop()
{
  for(pos = 0; pos <= 180; pos += 1) // Заставляем поворачиваться сервопривод от 0 до 180 градусов с шагом в 1 градус.
  {                                
    myservo.write(pos);              // собственно устанавливаем угол отклонения сервопривода
    delay(15);                       // ждем 15 милисекунд
  }
  for(pos = 180; pos>=0; pos-=1)     // Заставляем поворачиваться сервопривод в обратную сторону.
  {                                
    myservo.write(pos);           
    delay(15);                   
  }
}

 

Библиотека предполагает, что качалка сервопривода поворачивается на 180 градусов и средним положением является угол в 90 градусов. Для удобства восприятия я перевел все комментарии на русский язык.

При подключении сервопривода к Arduino надо быть внимательным и подключать его точно в соответствии с маркировкой: черный - GND(земля), красный - +5В, белый - управляющий сигнал с цифрового вывода. Если перепутать белый и черный провода, то сервопривод просто не будет работать. А вот если перепутать черный и красный, то сервопривод скорее всего сгорит. Чтобы избежать подобных ошибок удобно воспользоваться таким или аналогичным ему шилдом(платой расширения). Как видно, выводы Arduino здесь объединены с питание в стандартную тройку. Перепутать сигнал с землей тут еще можно, а вот +5В и что-то еще - уже гораздо сложнее.

 

Напоследок еще хочу обратить внимание на то, что использование analogWrite в купе со сдвоенным драйвером коллекторных двигателей позволит Вам создавать движущихся роботов.

Категория: Arduino для школьников | Добавил: Mactep (29.09.2014)
Просмотров: 4784 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск