Авторизация


...

Кто на сайте?

Сейчас один гость и 5 зарегистрированных пользователей на сайте

  • inmiernikwesto
  • questmanie

Статистика

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

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

  LUKEY-936D

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

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

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

 

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

ПП перекодировки данных .

30-05-2012 Super User

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

Инфракрасный счетчик вошедших/вышедших на основе дальномеров.

23-08-2014 Александр Маюнов

Инфракрасный счетчик вошедших/вышедших на основе дальномеров.

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

Программные таймеры на ассемблере

31-01-2012 Альберт Бикбулатов

Программные таймеры на ассемблере

 Это довольно просто. Если лень читать, просто скачайте прилагаемые примеры и посмотрите, а я пока продолжу. Для чего это надо? Отсчитывать время программно, в теле основной программы - не самый лучший способ. Чтобы отсчитать секунду, программа только и будет делать, что считать...

Алгоритм работы с плавающей запятой. Часть первая

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

Алгоритм работы с плавающей запятой. Часть первая

1.Общие понятия Сразу хочу объяснить, а зачем все это нужно? Прежде всего точность вычислений, а она порой, ой как нужна. Различают две формы представления двоичных чисел: «с фиксированной запятой» и «с плавающей запятой». С фиксированной запятой, надеюсь, эту форму уже многие знают, но...


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

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