«Сайт о микроконтроллерах AVR .RU», версия для печати. Исходный документ: https://avr.ru/beginer/bascom/article13

Статья №13


      В  этой  статье  мы  рассмотрим   формирование  сигналов  ШИМ – широко  импульсной   модуляции. Что же такое  ШИМ  и  зачем  она  нужна ? 
     Шим  - это  один  из  способов  формирования  аналогового  сигнала  из  дискретного  с  помощью  электронных  логических  переключателей  типа  да –нет  (1 -0), которые  называются  в  народе  вентилями.                                   
     С  точки  зрения  электроники  ШИМ  - это  прямоугольные  сигналы, полученные  в  результате  подачи  сигналов  треугольной  формы  на  один  вывод  компаратора  (устройство  сравнения) и  уровня  постоянного  напряжения  на  другой  (см. Рис.1а).  Изменяя  уровень  напряжения,  мы  получаем  сигналы  с  различным  коэффициентом  заполнения. Коэффициент  заполнения – это  отношение  длительности  высокого  (лог.1)  и  низкого  (лог.0)  уровней  выходного  сигнала  ( см. Рис.1в).  
 
(http://avr.ru/int/Files/Picture/Bascom/Article13/Pic.12_1.PNG)
Рис.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  фильтр  на  электродвигатель. 
 
 Рис.2 - Схема регулирования скорости электродвигателя
 
     Микроконтроллер   соединен  по  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. 
 
 Рис.3 - Схема генерации звука
 
     Получение  звуков  определенной  частоты  и  длительности  можно  осуществить  с  помощью  команды  «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.
 
Рис.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 Вт  (в  отличии  от  тиристорного  управления), т.к.  транзисторы  открываются  при  небольших  напряжениях, то есть  практически  в  начале  полупериода  сетевого  напряжения.
 
 Рис.5 - Схема регулятора мощности
 
     Схема  работает  следующим  образом. Сетевое  напряжение  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 (http://avr.ru/int/Files/Dounload/Bascom/Article13/Attachment_13_1.zip)  данной  статьи.
                   
                                                                          
       

Все права защищены © AVR.RU, 2021.