[an error occurred while processing this directive]
Объясняю
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 26 октября 2006 г. 22:06
В ответ на: Ответ: Так помоему я не "вехал". Будем грысть дальше. отправлено <font color=gray>link</font> 26 октября 2006 г. 20:30

Для начала - азы ШИМ как таковой. Простейшая ШИМ (широтно-импульсная модуляция) - генератор прямоугольных импульсов с неизменной частотой и регулируемой скважностью, то есть отношением длительности единицы на выходе к длительности всего периода импульсов. Договариваемся измерять скважность в процентах, тогда при вечном нуле на выходе скважность будет 0%, при длительности единицы в четверть периода - 25%, в полпериода - 50% (при этом импульсы будут симметричными, то есть и 0, и 1 будут занимать одинаковое время - 50% от периода), при вечной единице - 100%.

Один канал аналоговой ШИМ делается из генератора пилообразного напряжения (будем называть это напряжение просто пилой) и компаратора, на инвертирующий вход которого подана пила, а на неинвертирующий - управляющее напряжение, например, с движка переменного резистора (потенциометра), концами подключенного к питанию и земле соответственно. Допустим, генератор дает пилу с частотой 500 герц и в диапазоне от +0.001 до +0.999 вольт. Ставим потенциометр в такое положение, когда на его движке будет 0 вольт, и смотрим выход компаратора - там будет вечный 0, то есть скважность ШИМ равна 0%. Теперь выставляем 0.1 вольта - на выходе компаратора появятся импульсы с частотой 500 ГЦ, и длительность единицы будет равна 0.1 от периода - то есть скважность ШИМ равна 10%. Выставляем 0.5 вольта - видим симметричные импульсы, длительность и единицы и нуля по 0.5 периода - скважность равна 50%. Выставляем 1 вольт - на выходе будет вечная единица, то есть скважность равна 100%. В итоге мы имеем одноканальную ШИМ со скважностью, задаваемой потенциометром во всем возможном ее диапазоне - от 0% до 100%. Для того, чтобы получить дополнительные каналы, нужно просто добавить по одному потенциометру и одному компаратору на каждый дополнительный канал, а генератор пилы у нас уже есть.

Теперь попробуем повторить все это в цифре. Генератор пилы сделаем из регистра, увеличивающегося на единицу с заданной частотой. Этот регистр назовем pwm - его значения будут последовательно нарастать от 0 до 255 (0,1,2,3,4,5,....,253,254,255), а после 255 будет опять 0, т.к. 255 - это максимальное число, помещающееся в байтовый регистр. Теперь нужны потенциометры - то есть задатчики скважности для каждого из 8 каналов, назначим таковыми регистры r3..r10. Остались компараторы - их сделаем программно, для начала - вот так (первый канал):


inc pwm ;Добавляем очередную ступеньку к пиле

cp pwm,r3 ;Это вход компаратора - сравнили пилу с уставкой канала
brlo set_one ;Если пила меньше уставки, то ставим выход в единицу
cbi PORTA,0 ;Иначе ставим выход в ноль
rjmp next_pwm ;и переходим к следующему каналу
set_one:
sbi PORTA,0 ;Cтавим выход в единицу и переходим к следующему каналу
next_pwm:
....
....
....

Такой код, сделанный понятно и "в лоб", занимает 5..6 тактов на канал. Его можно существенно ускорить, что я и сделал в том коде, который тебе дал - там получилось чуть больше двух тактов на канал. Ускорение получено за счет устранения условных переходов при решении значения выходного уровня компаратора - я воспользовался тем, что результат сравнения (cmp) - это бит переноса, и после каждого сравнения просто вдвигаю его во временный регистр, и когда все 8 результатов сравнений накоплены, просто вывожу этот регистр в порт, выставляя таким образом все 8 выходов ШИМ одновременно.

Мой код помещен в процедуру прерывания (ISR) от таймера. Каждый раз, когда такое прерывание возникает, обрабатывается очередная из 256 возможных ступенек ШИМ - сначала счетчик (регистровая переменная pwm) увеличивается на единицу, а потом с ней по очереди сравниваются 8 регистровых переменных-уставок, в которые каким-то образом занесены требуемые значения ШИМ для каждого канала - это регистры r3..r10. Прерывание от таймера должно возникать в 256 раз чаще, чем частота ШИМ - для 500-ГЦ ШИМ частота переполнения таймера должна быть выбрана равной 128 КГЦ.

Теперь ты должен сказать, как/чем ты предполагаешь менять скважность в твоих каналах, и можно будет заканчивать

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание