МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра БТС
ИНДИВИДУАЛЬНОЕ
ДОМАШНЕЕ ЗАДАНИЕ №3
по дисциплине «Микропроцессорные системы»
Тема: Широтно-импульсная модуляция
Студент гр. 7501 |
|
Исаков А.О. |
Преподаватель |
|
Анисимов А.А. |
Санкт-Петербург
2020
Цель работы: написать на языках С и Assembler программу, с помощью которой изменяется яркость свечения светодиода благодаря Fast PWM.
Используемые инструменты: отладочная плата ATtiny2313, интегрированная среда разработки AVR Atmel Studio 7.
Основные теоретические положения
Устройство отладочной платы ATtiny2313
ATtiny2313 низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой.
AVR ядро объединяет богатую систему команд и 32 рабочих регистра общего назначения. Все 32 регистра непосредственно связаны с арифметико-логическим устройством (АЛУ), что позволяет получить доступ к двум независимым регистрам при выполнении одной команды.
Рисунок 1 – Устройство отладочной платы ATtiny2313
Широтно-импульсная модуляция
Широтно-импульсная модуляция (ШИМ, Pulse-width modulation, PWM) – приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам с двумя фиксированными уровнями – ноль или единица, так чтобы их значения за некоторый промежуток времени в среднем были равны. Формально этот процесс можно записать в следующем виде:
где x(t) – желаемый входной сигнал в пределе от t1 до t2, ∆Ti – продолжительность i -го ШИМ-импульса с амплитудой A.
∆Ti подбирается таким образом, чтобы суммарные площади (энергии) обеих величин были приблизительно равны за достаточно продолжительный промежуток времени.
В аналоговом варианте преобразование синусоидального сигнала в ШИМ-последовательность и обратно схематически выглядит следующим образом: на один из входов компаратора подается исследуемый аналоговый сигнал Uвх, на другой – сигнал опорной частоты Fоп, имеющий треугольную форму (рис. 2). При совпадении уровней двух сигналов на входах компаратора его выход переключается, формируя в результате последовательность, состоящую из прямоугольных импульсов с несущей частотой Fоп, в длительности которых закодирован уровень исходного аналогового сигнала (т. е. его амплитуда). Если далее требуется получить исходный аналоговый сигнал, эту последовательность необходимо пропустить через фильтр нижних частот, чтобы отфильтровать опорную частоту и получить исходную синусоиду. В приведённом примере в качестве фильтра нижних частот используется обычная интегрирующая RC-цепочка (для получения более точных результатов преобразования необходимо использовать фильтр более высокого порядка, желательно на операционных усилителях).
Рисунок 2 – Принцип работы ШИМ-преобразователя
При использовании ШИМ мы передаём на выход сигнал, состоящий из высоких и низких логических уровней, то есть нулей и единиц. Затем эта последовательность пропускается через интегрирующую цепочку. В результате интегрирования на выходе будет величина напряжения, равная площади под импульсами.
Меняя скважность сигнала (т. е. отношение длительности периода к длительности импульса) ШИМ-последовательности, можно плавно менять эту площадь, а значит и напряжение на выходе (рис. 3).
Рисунок 3 – Принцип ШИМ-преобразования
Режим Fast PWM
В этом режиме таймер микроконтроллера считает от нуля до 255, после достижения переполнения счетный регистр сбрасывается в ноль, и счет начинается снова (рис. 4). Когда значение в счетчике достигает значения, записанного заранее в регистр сравнения, то соответствующий ему вывод ОСхn сбрасывается в ноль. При обнулении счетчика этот вывод устанавливается в единицу.
В общем случае частота fшим на выходе ОСхn микроконтроллера в режиме быстрой модуляции составляет:
где Ftcx – тактовая частота таймера, полученная путем деления тактовой частоты нашего МК на коэффициент деления N, задаваемый с помощью соответствующих разрядов регистра управления TCCRnB.
Рисунок 4 – Формирование ШИМ-сигнала в режиме быстрой модуляции
ОБРАБОТКА РЕЗУЛЬТАТОВ МОДЕЛИРОВАНИЯ
Код программы на языке Assembler:
.CSEG // начало сегмента кода
.ORG 0x0000 // начало таблицы прерываний
// инициализация стека
LDI R16, LOW(RAMEND) // запись в регистр R16 адрес конца оперативной памяти
OUT SPL, R16 // запись в SPL значения из R16
// инициализация PMW на таймере 0
// установим 3ый пин порта В на выход
LDI R16, 0b00001000 // т.к. это выход первого канала PMW таймера 0
OUT DDRB, R16
// Настройка режима FAST PWM бит 0 и 1
LDI R16, 0b010100011
OUT TCCR1A, R16
// запуск таймера, тактирование от цп без предделителя
LDI R16, 0b00000001 // Запись 1 в 0 бит регистра TTCR1B
OUT TCCR1B, R16
// устанавливаем значение PWM
LDI R16, 240
OUT OCR1B, R16
// основной цикл программы
loop:
RCALL delay // вызов подпрограммы задержки
// устанавливаем значение PWM
LDI R16, 90
OUT OCR1B, R16
RCALL delay // вызов подпрограммы задержки
// устанавливаем значение PWM
LDI R16, 180
OUT OCR1B, R16
RCALL delay // вызов подпрограммы задержки
// устанавливаем значение PWM
LDI R16, 220
OUT OCR1B, R16
RCALL delay // вызов подпрограммы задержки
// устанавливаем значение PWM
LDI R16, 250
OUT OCR1B, R16
RJMP loop
// подпрограмма задержки
delay:
LDI R18, 250
LDI R19, 250
L1: DEC R19 // DEC - вычитание единицы из указанного операнда
BRNE L1 // BRNE - перейти, если не равно
DEC R18
BRNE L1
RETI
Код программы на языке C:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
TCCR1A |= (1<<COM1A1);
TCCR1A &= ~(1<<COM1A0);
TCCR1A |= (1<<WGM10);
TCCR1A &= ~(1<<WGM11);
TCCR1B |= (1<<WGM12);
TCCR1B &= ~(1<<WGM13);
TCCR1B |= (1<<CS11);
TCCR1B &= ~(1<<CS10);
TCCR1B &= ~(1<<CS12);
DDRB = 0b00011000;
PORTB = 0b11100111;
while (1)
{
if (OCR1A < 255)
{
OCR1A++;
_delay_ms (30);
}
else
{
OCR1A = 1;
}
}
}
Рисунок 5 – Основная схема без включения симуляции
Рисунок 6 – Показания осциллографа при малой скважности
Рисунок 7 –Показания осциллографа при большой скважности
Рисунок 8 – Показания осциллографа при средней скважности
ВЫВОД
В ходе лабораторной работы удалось написать работающий код в Atmel Studio для микроконтроллера AtTiny2313 на языках C и Assembler, а также схему, из микроконтроллера, осциллографа, RC-цепочки и медленно зажигающегося светодиода, построенную в Proteus.
С помощью широтно-импульсной модуляции, встроенной в микроконтроллер, мы изменяли яркость свечения светодиода. При большой скважности яркость маленькая, при маленькой скважности светодиод горел ярко. Также удалось реализовать плавное изменение скважности для наглядности ее влияния на яркость светодиода.