Авторизация


...

Кто на сайте?

Сейчас 32 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 28387
-Материалы : 210

Пользователь сайта продает...

  106ЛБ1

Пользователь сайта покупает...

Программная реализация BAM (Binary Angle Modulation).

Автор: wind Просмотров: 6231

 

PWM VS BAM

Когда требуется один-два  канала ШИМ, то задача зачастую решается аппаратными средствами МК. Если же требуется более двух каналов, то для экономии ресурсов МК вполне подходит алгоритм BAM

 

alt

рис.1  Осциллограмма ВАМ

При  ШИМ модуляции  изменяется процент заполнения (скважность) одного периода от 0% до 100%  и таким образом регулируется

средний уровень напряжения (см. рис 2).

alt

рис.2

BAM  в буквальном переводе значит Двоичная Угловая Модуляция.

При ВАМ модуляции размер каждого сектора (или угла) задаётся положением бита, каждый следующий сектор в два раза больше предыдущего. После достижении старшего бита возвращаемся к первому. (см.рис.3)

alt

 

 

На рис.4 представлена временная диаграмма ВАМ. Полный период разбит на восемь отрезков времени определённой длины, нарастающих (или убывающих) в геометрической прогрессии  (кратно двум), аналогично секторам в круге. Длительность отрезка зависит от положения бита в байте и соответствует размеру этого байта.

Отрезки разделяются прерываниями, в которых сдвигается бит и производятся переключения выходов.

Скважность кодируется двоичным числом, каждый бит которого соответствует своему отрезку по старшинству. Например, для выдачи скважности 25% надо включить выход в период 6-го бита  (=.64),

Соответственно включив на 3-й бит (=.8) получим скважность ~3% (см.рис.5 и 4)

Период (100%) равен сумме всех отрезков (1+2+4+8+16+32+64+128) = 255+1= всего 256 частей.

Одна часть равна младшему биту и самому короткому отрезку и зависит от установки предделителя таймера.

Например, чтобы получить скважность ~28%  надо выдать бит со значением 01001000 (в десятичной .72), при этом выход включен в 3-й и 6-й бит со значением задержки .8+.64 (рис.5)

Кодируя двоичным значением байт можно получить 256 градаций с шагом ~0,39%

К примеру, для управления RGB светодиодом это более 16 миллионов цветов

Прерывание

Основная работа происходит в прерывании. Один полный период состоит из восьми прерываний.

Выберем таймер TMR2, который переполняется при значении  находящемся в регистре PR2

Будем менять значение в PR2 применяя умножение на 2, т.е. просто сдвигая бит влево (rlf    PR2,F)

Таким образом следующее прерывание будет дольше предыдущего в два раза.

Как дошли до самого старшего бита (PR=.128) сбрасываем всё и  начинаем новый цикл. (рис.3, слева)

1) PR2 =  00000001   задержка прерывания .1

2) PR2 =  00000010   задержка прерывания .2

………

………

7) PR2 =  01000000   задержка прерывания .64

8) PR2 =  10000000   задержка прерывания .128

Теперь надо в нужные отрезки времени включать и отключать выходы.

Для этого в каждом прерывании копируем заранее приготовленный байт в порт.

То есть, для каждой задержки прерывания (для каждого отрезка) у нас заранее приготовлен свой байт.

Например, чтобы выдать  комбинацию отрезков длительностью 2+8+64+128 (b”11001010”)  в  PORTA,0  эти байты будут выглядеть:

b '00000000’     для  .1      (1-е прерывание, установка .1)

b '00000001’     для  .2      (2-е прерывание, установка .1х2=.2)

b '00000000’     для  .4        (.4)

b '00000001’    для  .8         (.8)

b '00000000’    для  .16    ( .16 )

b '00000000’    для  .32    ( .32 )

b '00000001’    для  .64    ( .64 )

b '00000001’    для  .128   ( .128, последнее прерывание в этом цикле)

После выдачи последнего байта с длительностью .128 возвращаемся к первому байту, и так по кругу.

При этом мы управляем сразу всеми защёлками порта, а также можем увеличивать количество выходов, заранее подготавливая  нужное количество байт и по очереди копирую их в другие Порты в этом же прерывании.  Для примера, вид выдачи в несколько Портов будет выглядеть:

movlw       b'00000000’ ; заранее подготовленный для PORTA байт
movwf       PORTA       ; вписываем в порт
movlw       b'00000000’ ; заранее подготовленный для PORTB байт 
movwf       PORTB
; и т.д…                ( первое прерывание, длит .1 )
-------------------------------------------------------------------------------------------
movlw       b'00000001’ ; заранее подготовленный для PORTA байт
movwf       PORTA       ; вписываем в порт
movlw       b'00011001’ ; заранее подготовленный для PORTB байт 
movwf       PORTB
; и т.д…                ( следующее прерывание, длит .2 )
-------------------------------------------------------------------------------------------

Таким образом в течении одного полного периода мы включая или отключая выходы Портов в определённые отрезки времени получаем определённый процент заполнения того или иного выхода.

Если ШИМ требует постоянного «внимания» со стороны процессора, то ВАМ оставляет гораздо больше свободного времени.

При ВАМ модуляции, в прерывании, кроме стандартного сохранения контекста (W, STATUS)  требуется лишь скопировать готовые значения в Порт, сбросить флаг прерывания и установить задержку до следующего прерывания – минимум времени. Между прерываниями ВАМ в основном не использует  ресурсы МК или использует косвенно.

Транспонирование матрицы.

Для прерывания заранее подготавливаем «конечные» байты.

Для наглядности «выстроим» исходные регистры вертикально один над другим, содержимое представляем в двоичной системе счисления. (см.рис.7 справа)

Получается матрица. Теперь в уме  «поворачиваем» всю матрицу влево на 90 градусов. Снизу получаем готовый ряд самых старших битов.  В нужном порядке раскладываем эти биты по регистру, который в прерывании будет копироваться в Порт. Разложив 7-е биты, «опускаем» повёрнутую матрицу на один ряд вниз, теперь снизу ряд 6-х битов. Распределяем его в следующий регистр. Таким образом ряд за рядом «опуская» матрицу и раскладывая биты пройдём все восемь рядов, с ряда седьмых по ряд нулевых битов и подготовим регистры для восьми прерываний

Для примера сделаем матрицу для управления тремя RGB светодиодами на МК PIC16F628A

 

alt

рис.6

На рисунке указаны задействованные порты и привязанные к ним названия регистров.

Изменение значения в исходном регистре (0-255) изменяет яркость соответствующего цвета.

Задействуем по два конечных регистра на прерывание, т.к.  исходных регистров девять, конечных  бит также девять, в данном случае распределим шесть бит в первый регистр и три во второй.   Для примера, внесём произвольные значения в эти девять регистров.

 

 

alt

рис.7

 

На этом рисунке показано, как перемещаются биты. Смещение делаем через левый сдвиг. На рисунке в самой правой части указан порядок обработки регистров. Последовательность важна, т.к. от неё зависит в каком порядке выстроятся биты в конечном регистре и в дальнейшем будут копироваться в Порт.

Сдвигаем 7-й бит регистра Blue_H  в конечный регистр в 0-й бит, переходим к регистру Green_H, сдвигаем 7-й бит в тот же регистр,  и так далее, пока не пройдём шесть регистров, шесть потому как в PORTB задействованы лишь первые шесть выходов RB0-RB5, оставшиеся три регистра будем смещать в следующий конечный регистр, предназначенный для PORTA

При необходимости, можно добавлять «бесконечное» количество выходов, добавляя исходные и конечные регистры. Для данной программы мы ограничены лишь количеством физических выходов.

Переместив все седьмые биты исходных регистров мы подготовили для первого прерывания два конечных регистра, в которых биты расставлены соответственно номерам выходов PORTB и PORTA и  которые в прерывании будут скопированы в эти Порты.

Далее снова «проходим» по матрице, сдвигая биты в третий и четвёртый конечные регистры. При сдвиге 7-го бита, 6-й становиться на его место и готов для следующего прохода.

Всего надо пройти по матрице восемь раз, по количеству кодирующих бит яркости (0-255=8bit)

В итоге подготовим 16 регистров, по 2 регистра на прерывание. (рис.8)

 

alt

рис.8

 

Кратко повторим алгоритм в прерывании, теперь для управления тремя RGB светодиодами:

1. Стандартное сохранение W, STATUS, (FSR)

2. Сбрасываем флаг прерывания

3. Берём значение из регистра с адресом 00DF (самый правый на рис.8)

4. Вносим в PORTB

5. Опускаемся к следующему регистру 00DE

6. Берём значение из него

7. Вносим в PORTA

8. Проверяем регистр PR2=.128? если да, то сбрасываем на .0

8. Устанавливаем в регистре PR2 значение .1 (на следующем круге .2, далее .4 .8 .16 и  т.д.  до .128)

9. Стандартное восстановление W, STATUS, (FSR)

10. Выходим из прерывания

На следующем круге (прерывании) уже берём значения из регистров 00DD и 00DC. Потом 00DB и 00DA  …00D9 и 00D8 и т.д. до 16-го регистра

 

Также кратко алгоритм транспонирования:

1.По очереди сдвигаем все старшие биты исходных регистров в один конечный регистр, чтобы они выстроились в последовательности выдачи в Порт. Если не умещаемся в один регистр или надо выдать в разные Порты, то задействуем два или более конечных регистров. После прохода проверяем восьмой круг, дошли – выходим, если не дошли то идём на новый круг.

2. На следующем круге аналогично сдвигаем биты, только уже в очередные конечные регистры.

Таким образом проходим все восемь рядов бит.

Теперь уточним важные детали…

1.  Первый момент.

После окончания программы транспонирования исходные регистры будут пустыми, потому перед следующим транспонированием в них необходимо вновь скопировать исходные значения уровня. Для этого исходные регистры лучше не трогать, а в начале ПП транспонирования сделать копии исходников и работать уже с копиями.

2. Второй момент.

Важный отрицательный момент алгоритма BAM, как системы работающей с двоичными значениями. При переходе со значения .127 на .128  и обратно возникают артефакты в виде заметных мерцаний. Возникает это по причине образования целых смежных областей,  равных по времени единице: 

alt

рис. 9

Подобные артефакты, но в меньшей степени возникают также при переходах  63 > 64, 31 > 32 и т.д.

Если, скажем, для управления двигателем этот недостаток практически не имеет значения, то для светодиодов при плавном изменении яркости на глаз мерцания заметны….

Устраняется этот недостаток сменой направления смещения управляющего бита, в каждый следующий полный период меняем направление смещения: влево – вправо – влево – вправо…

Т.е. при первом периоде мы увеличиваем длительность (ставим предустановку таймера) 1>2>4>8….>64>128 а следующий период меняем направление на убывание 128>64>32….4>2>1   Тем самым устраняется смежная область равная целой единице.

 

Очевидные нюансы…

  1. Если, скажем, требуется оставить свободным какой-то вывод Порта, значит надо перескочить через него, следовательно  применяем несколько дополнительных сдвигов (rlf или rrf), чтобы бит стал на своё место. При этом надо проследить за свободными выходами, что с ними будет при записи в Порт в свободные выводы лог.0?
  2. Учитывая, что регистр FSR задействуется в прерывании, при входе в него сохраняем и содержимое FSR
  3. Самый минимальный период задержки таймера (PR= .1)  зависит от коэффициента предделителя и последелителя, в данном случае выбран предделитель 1:16, выходной делитель 1:2 итого 1:32.?Следует минимизировать время нахождения в прерывании, чтобы в коротком периоде флаг прерывания не успевал подняться вновь ещё в прерывании. Ничего глобального не произойдёт, но короткий период станет растягиваться и нарушиться время задержки.
  4. 256  градаций  ограничены одноразрядностью применяемого таймера, при необходимости можно задействовать двухразрядный таймер и увеличить число градаций, причём как  увеличивать, так и уменьшать разрядность можно, обрабатывая в одном периоде большее или меньшее количество бит .

P.S. на этом рассмотрение алгоритма BAM закончено, в прилагаемом файле есть проект для MPLAB с исходником программы написанной на Ассемблере, реализованной и проверенной в железе.

В основной программе добавлена подпрограмма (ПП), для плавного нарастания и убывания - «переливания» всеми цветами трёх RGB каналов, как я сказал выше, всего 16 777 216 цветов, эта ПП прокомментирована знаками /*/. Если требуется, то все комментарии с такими знаками /*/  можно удалить.

На будущее…

В дальнейшем планирую сделать другую программу, уже не ограниченную физическими выводами МК, а позволяющую действительно добавлять «бесконечное» количество выходов, которое в этом случае будет ограничено лишь скоростью работы МК.

г.Белореченск
Краснодарский край
 

Скачать

Ссылка для скачивания доступна только авторизованным пользователям сайта !

Обсуждаем и задаем вопросы на форуме

Пример работы BAM можно посмотреть на видео

 

 

 

Случайные статьи....

Prev Next

Любителям часов и счета.

27-06-2011 Александр Милевский

Любителям часов и счета.

Хочу поделиться несколько методами, которые удобно использовать при разработке различных устройств, отсчитывающих точные временные интервалы и производящие их счет и счет различных событий. Основная информация взята с сайтов piclict.com и piclict.ru. 1. Метод позволяющий получить точные временные интервалы. Простая и быстрая система...

Flash память программ МК PIC18XXXX

13-05-2011 Super User

Все микроконтроллеры семейства  PIC18XXXX  имеют встроенную  энергонезависимую Flash память программ, доступную для чтения, записи и стирания. В отличии от  EEPROM памяти данных, память программ побайтно можно только считать. Запись можно производить только блочно, по 8 байт т.е. записывать нужно не...

Графический индикатор МЭЛТ 128х64. Вывод на индикацию 9 разрядов часто…

28-11-2012 Александр Милевский

Графический индикатор МЭЛТ 128х64. Вывод на индикацию 9 разрядов частотомера с гашением незначащих нулей.

  Была просьба пояснить, как вывести на графическом индикаторе в определенном месте (разряде) изменяющиеся числа на ассемблере.  Предлагаю рассмотреть мою программу для 9 разрядного частотомера с гашением  незначащих нулей. Программа учебная или  заготовка. Компилироваться не будет. Для запуска надо обратить внимания...

Бегущая строка.

16-12-2011 Sergey Roslik

Бегущая строка.

Предлагаю схему светодиодной бегущей строки на PIC18F2520. В программе, на данный момент организован только принцип вывода данных на табло. Вывод данных разбит на 3 этапа. Первый – считывание данных, которые необходимо вывести, второй – перекодировка данных и третий – вывод...


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru