Статья №13
В этой статье мы рассмотрим формирование сигналов ШИМ – широко импульсной модуляции. Что же такое ШИМ и зачем она нужна ?
Шим - это один из способов формирования аналогового сигнала из дискретного с помощью электронных логических переключателей типа да –нет (1 -0), которые называются в народе вентилями.
С точки зрения электроники ШИМ - это прямоугольные сигналы, полученные в результате подачи сигналов треугольной формы на один вывод компаратора (устройство сравнения) и уровня постоянного напряжения на другой (см. Рис.1а). Изменяя уровень напряжения, мы получаем сигналы с различным коэффициентом заполнения. Коэффициент заполнения – это отношение длительности высокого (лог.1) и низкого (лог.0) уровней выходного сигнала ( см. Рис.1в).
При интегрировании этих сигналов (например, с помощью RC - фильтра) значение уровня напряжения напрямую будет зависеть от коэффициента заполнения (см. Рис.1в), что позволяет управлять различными устройствами, например: электродвигателями, и осветительными приборами постоянного тока.
Невольно напрашивается вопрос: «Почему же нельзя осуществить эту регулировку, например, с помощью обыкновенного переменного резистора?»
Дело в том, что во –первых, в этом случае нас ожидают большие энергетические затраты. Попробуйте порегулировать напряжение 220 В на лампочке с помощью реостата и вы почувствуете, как он будет греться. А если необходимо регулировать электронагреватели или другие электроприборы большой мощности?
Во – вторых, часто случается, что прибор подлежащий регулировке, находится от вас на приличном расстоянии или расположен в недоступном месте.
Следует отметить, что сигнал ШИМ далеко не всегда следует интегрировать (сглаживать). Это касается регуляторов мощности для электроприборов, работающих на переменном напряжении, или когда ШИМ используют для кодирования каких – либо сигналов (данные измерений, команды управления и др.).
В микроконтроллерах AVR для получения ШИМ – сигнала используется какой – либо таймер – счётчик и регистр, выполняющий функцию сравнения. Визуально данную функцию можно представить, как тот постоянный уровень напряжения, поданный на ножку компаратора в примере, приведённом выше (см. Рис.1а).
В Bascom регистр сравнения называется Compare. ATtiny2313 имеет Сompare0х (х = А или В) для Timer0 и Compare1x (x = A или B) для Timer1. Пороговыми значениями счётчика являются: верхнее – ТОР и нижнее – ВОТТОМ (минимум 0).
Cигнал ШИМ может быть сформирован с разрешением 8,9 или 10 бит. В режиме 8 бит состояние счётчика изменяется от 0 до 0хFF, в режиме 9 бит – от 0 до 1FF, в режиме 10 бит – от 0 до 3FF.
Пороговые значения счёта ТОР записываются в регистр Сompare, а ВОТТОМ в регистр счёта Timer0|1. Например:
Compare0A = 130
Timer0=10
Счётчик считает от ВОТТОМ до максимума.
Когда счётчик достигает значения ТОР при прямом счёте (вверх) на выводе OC1x Timer1 или OC0x Timer0 устанавливается высокий уровень. Когда же счётчик достигает своего максимального значения, он сбрасывается до ВОТТОМ и выводе ОС1х (ОС0х) устанавливается низкий уровень, и начинается новый отсчёт вверх. При достижении ТОР, на выводе ОС1х (ОС0х) вновь устанавливается высокий уровень. В результате на выводе ОС1х (ОС0х) формируется ШИМ – сигнал (см. Рис.1с).
Следует отметить, что сигнал ШИМ можно инвертировать, т.е. при прямом счёте (вверх) и совпадении значения счёта со значением, записанным в Compare (TOP), на выводе ОС1х (ОС0х) будет низкий уровень, а при обнулении счётчика – высокий.
Это зависит от того, как сконфигурирован регистр управления таймером - счётчиком TCCR0A – Timer0 или TCCR1A –TCCR1A. Подробно на описании регистров микроконтроллера я останавливаться не буду, ибо – смотрите и изучайте Datasheet.
В качестве примера применения ШИМ в Bascom приведена схема устройства регулирования скорости вращения электродвигателя (см.Рис.2), которое содержит микроконтроллер ATtiny2313, к выходу ОС0А которого подключён в качестве буфера ключ на транзисторах VT1 и VT2. Данный ключ нагружен через сглаживающий RC фильтр на электродвигатель.
Микроконтроллер соединен по RC-232 с терминалом персонального компьютера, с клавиатуры которого можно задать три индекса скорости вращения электродвигателя (максимальная - V=1, средняя – V=2, минимальная - V= 3). Прерывание работы микроконтроллера по приёму для задания индекса скорости происходит при нажатии любой клавиши. При появлении надписи в терминале “Enter V (1 – max, 2- mid, 3 – min) :” и вводе одного из вышеуказанных значений, изменяется состояние ТОР, которое записано в регистре сравнения Сompare0A . Что приводит соответственно к изменению коэффициента заполнения (отношения длительностей высокого и низкого уровней) генерируемых ШИМ -импульсов на выводе ОС0А (РВ2) и, следовательно, величины напряжения на электродвигателе.
Следует отметить, что Bascom не поддерживает программно Timer0, как генератор ШИМ, поэтому пришлось применить некоторые добавочки, которые в купе с поддерживаемой программой таймера, работающего в режиме сброса по совпадению (СТС), дают нам возможность применить Timer0 для создания генератора ШИМ – сигналов.
Программа микроконтроллера состоит из основного цикла, в котором происходит, отслеживание состояния бита TOV регистра флагов TIFR таймера –cчётчика 0. Данный флаг устанавливается при достижении счётчиком значения ТОР. Он сбрасывается записью единицы. Затем происходит переключение вывода ОС0А в состояние лог.1.
При обработке прерывания по переполнении счётчика (подпрограмма Pulse) происходит переключение вывода ОС0А в состояние лог.0. Таким образом, на выводе ОС0А формируется ШИМ – сигнал.
В подпрограмме RxD происходит обработка прерывания по приёму. Здесь происходит задание с терминала Bascom значений ТОР, а следовательно и скорости вращения электродвигателя.
Текст программы “PWM” с подробными комментариями приведён ниже:
$regfile = "attiny2313a.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pind.0 = Input 'RxD
Config Portd.1 = Output 'TxD
Config Portb.2 = Output 'выход ШИМ
Config Timer0 = Timer , Compare A = Toggle , Clear Timer = 1 , Prescale = 256 'коэффициент распределения частоты таймера
Dim V As Byte 'объявление переменных
Dim Vz As Byte
Dim I As Byte
Dim Z As Byte
Z = 0 'конфигурирование таймера для режима PWM
Tccr0a = Z
Set Com0a1
Set Com0a0
Set Wgm01
Set Wgm00
Set Wgm02
Stop Timer0 'останов таймера
Timer0 = 0 'сброс таймера
On Urxc Button 'определение подпрограмм прерывания
On Timer0 Pulse
Enable Interrupts 'разрешение прерываний
Enable Timer0 'при переполнении счётчика
Enable Urxc 'по приёму сигнала
Tifr=2 ’сброс флага
Do 'основной цикл
If Tifr = 0 Then 'Флаг установлен?(достигли ТОР?)
Toggle Portb.2 'переключение ОС0А
Tifr = 2
End If
Loop
Button: 'установка скорости вращения электродвигателя
Input "Enter 1-min,2-mid,3-max:" , V 'введение индекса скорости
Restore Speed 'считывание верхнего предела (ТОР)
For I = 1 To 3
Read Vz
If V = I Then 'cравнение введённого и индексов блока данных
Compare0a = Vz 'при их равенстве - запись ТОР (блока данных) в регистр сравнения
Timer0 = 0 'сброс таймера
Start Timer0 'пуск таймера
Exit For
End If
Next I
Return
Pulse: 'обработка прерывания по переполнению счётчика
Stop Timer0
Reset Portb.2 ’сброс ОС0А
Start Timer0
Return
End 'end program
Speed:
Data 250 , 125 , 10
При использовании таймера – счётчика 1 микроконтроллера ATtiny2313, как формирователя ШИМ – сигнала отметим, что Вascom поддерживает Timer1 в этом качестве. Например, данный таймер конфигурироваться для работы в режиме формирователя ШИМ – сигнала:
Config Timer1=Pwm, Pwm=8, Prescale=1,compare A=Toggle, Clear Timer=0
- PWM (Pulse Width Modulation) – режим ШИМ ;
- PWM=8 – режим 8 – ми битного разрешения;
- Prescale – коэффициент предделения частоты счётчика;
- Сompare A=Toggle|SET|Clear|Disconnet – переключить, установить, очистить, вывод ОС1х при совпадении значений счётчика и Сompare;
- Clear Timer1=0|1 – не очищать, очистить таймер, когда произойдёт прерывание по совпадению.
Устройство для программы по использованию Timer1 при формировании ШИМ мы возьмём то же, что и в предыдущем примере (см. Рис.2) , только сигналы будем снимать с вывода ОС1А (РВ3).
Сама программа “PWM1” cостоит из основного цикла, в котором отслеживается количество импульсов таймера – счётчика 1. При достижении им значения 255 обнуляется контакт ОС1А. Хорошо, что здесь не надо заботиться о прерываниях по совпадению.
Подпрограмма обработки прерывания по приёму полностью подобна такой же подпрограмме предыдущего примера. Текст программы “PWM1” приведён ниже:
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pind.0 = Input 'RxD
Config Pind.1 = Output 'TxD
Config Pinb.3 = Output 'OC1A
Config Timer1 = Pwm , Prescale = 1 , Compare A = Toggle , Clear Timer = 0
Stop Timer1
Dim V As Byte 'объявление переменных
Dim Vz As Byte
Dim I As Byte
Dim Counters As Word
Dim Z As Word
On Urxc Button 'определение подпрограммы
Enable Interrupts 'разрешение прерываний
Enable Urxc 'прерывание по приему
Do
Stop Timer1
Counters = Timer1
If Counters => 255 Then 'отслеживание режима режима PWM=8
Toggle Portb.3 'переключение ОС1А
Timer1 = 0
End If
Start Timer1
Loop
Button: 'установка скорости вращения электродвигателя
Input "Enter 1-min,2-mid,3-max:" , V 'ввод индекса значения скорости (индекс ТОР)
Restore Speed 'считывание верхнего предела ШИМ (ТОР) из блока данных
For I = 1 To 3
Read Vz
If V = I Then 'сравнение введённого индекса скорости с имеющимися.
Compare1a = Vz 'запись значения ТОР в регистр сравнения
Timer1 = 0
Start Timer1 'запуск таймера
Exit For 'выход из цикла
End If
Next I
Return
End 'end program
Speed:
Data 250 , 125 , 50 'блок данных скоростей электродвигателя (значения ТОР ШИМ)
Далее я расскажу о генерировании звука в Bascom. Схема для извлечения звука представлена на Рис.3. Динамик Гр. подключён к выводу РВ3 микроконтроллера ATtiny2313 через эммитерный повторитель на транзисторе VT1.
Получение звуков определенной частоты и длительности можно осуществить с помощью команды «Sound» (голос):
Sound PORT.pin, частота, длительность звучания.
- частота – числовое выражение в пределах 37-32767, частота звука в циклах /сек или в Гц;
- длительность – числовое выражение в пределах 0-65535, число отсчётов таймера-счётчика 1 (Timer1), определяющее продолжительность звучания.
Пример:
Sound PORTB.3, 600,500
создаёт звук примерно 600 Гц.
В Bascom позволяет получать двухтональные многочастотные сигналы DTMF (Dual Tone Multi – Frequency), которые используются в телефонии для передачи набираемых на клавиатуре телефона символов. Это такая система кодирования, когда складываются два сигнала с разной частотой и результат пересылается приёмнику, применяется в аналоговых линиях связи, поскольку обладает высокой помехоустойчивостью.
Пример генерирования в Bascom DTMF:
Dtmfout десятичное число 0-15, длительность сигнала в миллисекундах.
Команда Dtmout для генерирования прерываний использует Timer1, поэтому этот таймер нельзя использовать в программе для других прерываний. Сигнал снимается с вывода ОС1А (РВ3).
Пример, когда отсылаются все шестнадцать DTMF кодов, приведён ниже в программе “DTMF”:
$regfile = "attiny2313a.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pinb.3 = Output ’выход сигнала DTMF
Dim Counters As Byte
Enable Interrupts
Do ’цикл по извлечению DTMF сигналов
For Counters = 0 To 15
Dtmfout Counters , 500 ’I – й DTMF cигнал
Waitms 250 ’задержка 250 мс
Next Counters
Wait 1
Loop
End 'end program
На основе данной программы можно создать устройство «тревожная кнопка», которое представлено на Рис.4.
Данное устройство основано на микроконтроллере ATtiny2313, который находится в обычном состоянии в спящем режиме (Sleep). При нажатии кнопки «тревога» происходит прерывание INT0, контроллер пробуждается и открывает транзистор с изолированным затвором, который подключён параллельно резистору R7 и напряжение на телефонной линии падает с 60 до 30 В. Сигналы DTMF , в которых закодирован телефонный номер, с помощью другого идентичного транзистора VT1.1 модулируют телефонную линию, передавая несколько раз закодированный телефонный номер. Затем с помощью динамика, подключённого через резистор 1 КОм к выводу РD5, контроллер выдаёт тональный сигнал, и включает светодиод, который подключён к PD6. Текст программы “Telef” приведён ниже:
$regfile = "attiny2313a.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
$sim
Config Int0 = Falling 'прерывание по спаду импульса
Config Portb.3 = Output ' DTMF- сигнал
Config Portd.6 = Output 'светодиод
Config Pind.2 = Input 'тревога
Config Portd.5 = Output 'динамик
Config Portd.1 = Output ' RxD
On Int0 Button 'определение подпрограммы прерывания
Dim I As Byte 'объявление переменных
Dim I1 As Byte
Dim Z As Byte
Enable Interrupts ' разрешение прерываний
Enable Int0
Do 'основная программа
Print "sleep" 'передача в терминал
Powerdown 'вкл. спящего режима
Loop
Button: 'подпрограмма обработки прерываний
Set Portd.6 'вкл. светодиод
For I1 = 0 To 10 'цикл передачи номера
For I = 0 To 5 '!!!! это количество цифр номера
Set Portd.6
Z = Lookup(i , M1) 'извлечение цифры телефонного номера из блока ‘данных
Print "Achtung!!!" 'передача в терминал по RS-232
Dtmfout Z , 500 'передача цифры тел. номера тоном DTMF
Waitms 250 'задержка 250 мс
Z = 0
Reset Portd.6 'выкл. светодиода
Next I
Sound Portd.5 , 1200 , 10000 'вкл.звука
Wait 1
Next I1
Return
End 'end program
M1: 'блок данных
Data 3 , 3 , 3 , 2 , 5 , 7
И наконец надо отметить, что получать прямоугольные сигналы с различными коэффициентами заполнения можно не только с помощью таймеров но и команд задержек – Wait сек и Waitms мс. На Рис.5 представлена схема регулятора мощности, которая благодаря применению в качестве управляющего элемента нагрузки спаренных полевых транзисторов сборки DA1 позволяет регулировать мощность от одного до 10 Вт (в отличии от тиристорного управления), т.к. транзисторы открываются при небольших напряжениях, то есть практически в начале полупериода сетевого напряжения.
Схема работает следующим образом. Сетевое напряжение 220 В поступает на диодный мост VD3 – VD6, где оно выпрямляется. То есть все полупериоды напряжения становятся положительными. С помощью оптопары DA3 резисторов R1, R6 и конденсатора С3 происходит формирование синхроимпульсов, синхронизирующих работу микроконтроллера с началом каждого полупериода. Синхроимпульсы вызывают прерывание по INT0, во время обработки которого через оптопару DA2 контроллер включает и выключает нагрузку с помощью спаренных транзисторов сборки DA1. Величины времени включения и отключения нагрузки зависят от величины использования мощности . Последняя задаётся с терминала Bascom в процентах (%) при запросе “Enter P=10, 20, 30,…,50,…, 80, 90 %:”. Cледует отметить, что задание величины использования мощности необходимо осуществлять при выключенном тумблере, чтобы прекратить поступление синхроимпульсов, вызывающих прерывание INT0. Начальное значение мощности (если её не задавать) составляет 10 %.
Программа для регулятора мощности “RP” достаточно проста. Она состоит из основного цикла, в котором отключается светодиод HL1, и двух подпрограмм обработки прерываний: внешних прерываний по INT0 и прерываний по приёму Urxc. Текст программы с подробными комментариями приведен ниже:
$regfile = "attiny2313a.dat" 'настройки
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Int0 = Falling 'прерывание по спаду импульса
Config Pind.0 = Input 'RxD
Config Portd.1 = Output 'TxD
Config Pind.2 = Input 'INT0
Config Portd.6 = Output 'нагрузка
Config Portb.0 = Output 'светодиод
Dim T As Byte 'объявление переменных
Dim T1 As Byte
Dim T2 As Byte
T1 = 1 'начальное время вкл. и выкл. нагрузки
T2 = 10 - T1
On Int0 Button 'определение подпрограмм прерываний
On Urxc Rxd
Enable Interrupts 'разрешение прерываний
Enable Int0 'внешнее прерывание
Enable Urxc 'прерывание по приёму
Do 'основной цикл
Reset Portb.0 'выкл. светодиода
Loop
Rxd: 'подпрограмма обработки прерывания по приёму
Input "Enter P=10,20,...,50,...,80,90%:" , T 'ввод велич. исп. мощности на ‘нагрузке с терминала
T1 = T / 10 'время вкл. нагрузки
T2 = 10 - T1 'время выкл. нагрузки
Return
Button: 'подпрограмма обработки внешнего прерывания
Set Portb.0 'вкл. светодиода
Set Portd.6 ' вкл. нагрузки
Waitms T1 ' время включ. нагрузки
Reset Portd.6 'выкл. нагрузки
Waitms T2 'время выкл. нагрузки
Return
End 'end program
Как обычно, все программы находятся в папке приложение 1 данной статьи.