• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO



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



 



 

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

По материалам rc-master,  автор Зайчиков Александр

 

В начало обзора

Купить радиодетали для ремонта




Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 377



          

Радио для всех© 2024