Воскресенье, 19.05.2024, 21:30
Всего понемногу...
Меню сайта
Категории
AVR [6]
Питание [4]
Генераторы [0]
ESR [6]
Детекторы [0]
Справочник [13]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Ваши данные:
 
Главная » Статьи » Радиотехника » AVR

Конфигурируем ШИМ в Bascom

Конфигурируем ШИМ в Bascom

Достаточно часто появляется необходимость использовать управление какого-либо устройства (будь то лампочка накаливания, двигатель, ТЭН или простой светодиод) посредством ШИМ.

Наверно объяснять что это такое и в чем прелесть управления ШИМом не нужно, информации в интернете накопилось уже достаточно много, да и врядли мне получиться разжевать эту тему лучше. Поэтому сразу перейдем к делу, а именно запустим ШИМ на Attiny2313 средствами Bascom-AVR.

ШИМ в микроконтроллерах AVR работает на таймерах-счетчиках, в МК Tiny2313 таких таймеров всего 2: 8-битный Timer0, считающий до 255, и 16-битный Timer1, способный считать до 65535. Каждый таймер управляет двумя ШИМ-каналами. Таким образом всего аппаратно можно реализовать целых 4 канала ШИМ.

Информацию о количестве каналов ШИМ и разрядность каждого канала можно глянуть на страницах даташита на микроконтроллер.

Так, на борту Attiny2313 имеются два 8-битных канала ШИМ, работающих от Timer0, и еще два канала под управлением таймера Timer1 имеют программируемую разрядность от 8 до 10 бит. В даташите эти ноги подписываются следующим образом:

Для того, чтобы сконфигурировать таймер Timer1 на генерацию ШИМ, в Bascom достаточно записать следующую строку:

Config Timer1 = Pwm, Pwm = 8, Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64

Pwm = 8 выбирается разрядность ШИМ. Для Timer1, как писалось выше, может быть также Pwm = 9 или Pwm = 10.

Compare A/B Pwm = Clear Up/Clear Down здесь конфигурируем активное состояние для каждого канала ШИМ (А и В)

Prescale = 64 - уже знакомая строка конфигурации таймера, отвечающая за предварительное деление частоты переполнения таймера, в данном случае делитель будет задавать частоту ШИМ. Можем менять на свое усмотрение Prescale= 1|8|64|256|1024

Скважность генерируемого сигнала определяется значением, которые мы записываем в регистры сравнения OCR1A и OCR1B (каналов ШИМ же у нас два на одном таймере, вот по одному регистру на канал А и В). Со значениями, которые лежат в этих регистрах, постоянно сравнивается значение счетного регистра (туда оно копируется с таймера), при их совпадении происходит переключение ноги мк в активное состояние, а счетный регистр продолжает считать до своего максимального значения. Досчитав до максимума, таймер начинает считать в обратном направлении, и дойдя до момента, когда значения счетного регистра и регистра сравнения снова совпадут, произойдет обратное переключение на ноге микроконтроллера (см. рисунок ниже)

Для нас регистры сравнения OCR1A и OCR1B всего-навсего переменные, в которые мы можем положить какое-нибудь значение. Например, так:

OCR1A = 100
OCR1B = 150

В Баскоме для удобства предусмотрено и другое название этих регистров: PWM1A и PWM1B, так предыдущие строки будут равнозначны следующим:

PWM1A = 100
PWM1B = 150

Теперь разберемся, как влияет конфигурация активного состояния Clear Up/Clear Down на то, что происходит на выходе ШИМ в зависимости от значения регистра сравнения.

Когда выход сконфигурирован как Compare A Pwm = Clear Down, активным состоянием выхода является высокий уровень и при увеличении значения регистра OCR (PWM) пропорциональное напряжение на этой ноге будет расти. С точностью до наоборот все будет происходить, если выход сконфигурирован как Compare A Pwm = Clear Up. Все это хорошо проиллюстрировано на картинке ниже

Значения, которые могут принимать эти регистры сравнения, зависят от того, какую разрядность канала ШИМ мы выбрали. При PWM = 8 (8-битный ШИМ) возможно значение от 0 до 255; при PWM = 9 от 0 до 511; при PWM = 10 от 0 до 1023. Тут я думаю, все понятно.

Теперь небольшой пример: подключим к микроконтроллеру светодиоды как показано на схеме (питание мк на схеме не указано)

И напишем небольшую программку:

$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer1 = Pwm, Pwm = 9, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8

Do

Incr Pwm1a 'плавно увеличиваем значение регистра сравнения OCR1A
Incr Pwm1b 'плавно увеличиваем значение регистра сравнения OCR1B

Waitms 20 'добавим задержку

Loop

End

После того, как откомпилировали и прошили программу в контроллер, один из светодиодов (D1) будет плавно набирать яркость, а другой (D2) плавно гаснуть

Если сейчас ткнуть осциллографом на выходы ШИМ, то можем увидеть такую вот картину с изменяющейся скважностью импульсов (синий сигнал на ОС1А, красный на ОС1В):

Конфигурация таймера Timer0 для генерации ШИМ практически такая же, за исключением того, что Timer0 - это 8-битный таймер, и поэтому ШИМ, генерируемый этим таймером, будет всегда иметь разрядность 8. Поэтому, конфигурируя этот таймер, разрядность ШИМ не указывается:

Config Timer0 = Pwm, Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64

Теперь аналогичный пример со светодиодами, но теперь ШИМ сгенерируем при помощи Timer0:

$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer0 = Pwm, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8

Do

Incr Pwm0a 'плавно увеличиваем значение регистра OCR0A
Incr Pwm0b 'плавно увеличиваем значение регистра OCR0B

Waitms 20 'добавим задержку

Loop

End

Подключим светодиоды к выходу ШИМ Timer0, как показано на схеме:

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

Подсчет частоты генерации ШИМ

Если требуется узнать частоту генерации ШИМ, то сделать это не сложно. Смотри на формулу ниже:

Частота ШИМ = (частота кварца / предделитель) / (размер счетного регистра × 2)

Для примера подсчитаем несколько значений:

1. Частота кварца = 4000000 Гц, предделитель = 64, разрядность ШИМ 10 бит => размер счетного регистра = 1024

Частота ШИМ = (4000000 / 64) / (1024 × 2) = 122 Гц

2. Частота кварца = 8000000 Гц, предделитель = 8, разрядность ШИМ 9 бит => размер счетного регистра = 512

Частота ШИМ = (8000000 / 8) / (512 × 2) = 976,56 Гц

3. Частота кварца 16000000 Гц, предделитель = 1, разрядность ШИМ 8 бит => размер счетного регистра = 256

Частота ШИМ = (16000000 / 1) / (256 × 2) = 31250 Гц



Источник: http://avrproject.ru/publ/pwm_bascom/1-1-0-37
Категория: AVR | Добавил: adelay (23.04.2013)
Просмотров: 2864 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
ADelay © 2024
Конструктор сайтов - uCoz