Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

практика 3 микро

.pdf
Скачиваний:
0
Добавлен:
25.11.2025
Размер:
1.22 Mб
Скачать

Цель: Реализуйте плавно пульсирующий светодиод с заданным периодом и законом изменения коэффициента заполнения по индивидуальному варианту, используя аппаратный ШИМ-генератор на базе таймера-счетчика T/C1

Теоретическая справка

Широтно-импульсная модуляция (сокр. ШИМ, от англ. PWM – Pulse Width Modulation) – пульсирующий способ задания дискретного сигнала для управления электрическими параметрами внешних цепей за счет переменной скважности сигнала.

Скважность – безразмерная величина импульсных систем,

характеризующая отношение длительности импульса к его периоду.

Определяется формулой Использование ШИМ-генератора на базе аппаратного таймера-счетчика

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

внешний вывод. Всего в микроконтроллере ATmega328P 6 выводов,

обладающих возможностью прямой коммутации от ШИМ-генератора при использовании всех трех аппаратных таймеров-счетчиков: OC0A (PD6), OC0B

(PD5), OC1A (PB1), OC1B (PB2), OC2A (PB3), OC2B (PD3).

В микроконтроллере представлено три вида ШИМ-генераторов:

1)быстрый ШИМ (Fast PWM);

2)ШИМ с коррекцией фазы (PWM, phase correct);

3)ШИМ с коррекцией фазы и частоты (PWM, phase and frequency

correct).

Ход работы

2

Рисунок 1 – Алгоритм работы

Описание алгоритма:

1.Установка частоты микроконтроллера

2.Подключение библиотек <avr/io.h> и <avr/interrupt.h>

3.Инициализация переменных svaga и seredina

4.Инициализация порта PB3 как выход

5.Отключение глобальных прерываний

6.Обнуление регистра TCCR2A и TCCR2B

7.Включаем FAST-PWM на втором таймере в не инвертирующем

режиме

Рисунок 2 – Таблица режимов и нужных флагов

3

Рисунок 3 – Таблица режимов для PWM и нужных флагов

8. Установка предделителя таймера на 64

Рисунок 4 – Таблица предделителя и нужных флагов

9. Обнуление регистра TCCR1A и TCCR1B

10. Установка предделителя первого таймера на 1

Рисунок 5 – Таблица предделителя и нужных флагов

11.Устанавливаем значение сравнения, после которого сработает прерывание

12.Разрешение прерывания по переполнению таймера, то есть выбранного нами времени

13.Включение глобальных прерываний

14.Включение основного бесконечного цикла

15.Отключение основного цикла

16.Вход в обработчик прерывания при переполнении таймера.

4

17.Приравниваем значение переменной svaga значению скважности ШИМ-сигнала

18.Вновь устанавливаем значение сравнения

19.Условие, проверяющее не достигла ли система середины цикла

20.Если да, то ещё одно условие, которое проверяет значение переменной svaga

21.Если значение переменной меньше 255, то оно увеличивается на

единицу

22.Если значение больше 255 или равно ему, то система достигла середины цикла, и переменная seredina приравнивается к единице

23.Возвращаемся к условию из пункта 19, если условие не выполняется, то попадаем в другое условие, которое проверяет значение переменной svaga

24.Если значение переменной больше 0, то переменная уменьшается на единицу

25.Если значение меньше или равно 0, то система прошла цикл,

переменная seredina приравнивается к 0

Рисунок 6 – Пример работы на уменьшение скважности ШИМ-

сигнала

5

Рисунок 7 – Пример работы на увеличение скважности ШИМ-

сигнала

Для проверки работы на диоде, прикладываю QR-код для доступа в Яндекс диск с видео работы

Рисунок 8 – QR-код

Расчёт значения TCNT1 для прерывания таймера. По заданию весь цикл происходит за 1 секунду, соответственно за половину цикла (0.5 секунды)

должно произойти 255 прерываний, потому что именно такое максимальное значение скважности ШИМ-сигнала. Соответственно сначала необходимо рассчитать, как часто происходит прерывания

0.5

255 = 0.00196 с

6

Теперь необходимо рассчитать значение TCNT1, используя

предделитель 1:

65536 − 0.00196 16000000 = 34176

1

#define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> int svaga = 0;

int seredina = 0;

int main(void){

DDRB |= (1 << PB3); cli();

TCCR2A = 0;

TCCR2B = 0;

TCCR2A = (1 << COM2A1) | (1 << WGM21) | (1 << WGM20); TCCR2B = (1 << CS22);

TCCR1A = 0;

TCCR1B = 0;

TCCR1B = (1 << CS10); TCNT1 = 34176;

TIMSK1 |= (1 << TOIE1); sei();

while (1) {

}

}

ISR(TIMER1_OVF_vect){ OCR2A = svaga;

TCNT1 = 34176;

if (seredina == 0) {

if (svaga < 255) { svaga++;

} else { seredina = 1;

}

} else {

if (svaga > 0) { svaga--; } else {

seredina = 0;

}

}

}

Вывод: В ходе выполнения работы была разработана программа для микроконтроллера AVR, обеспечивающая плавное включение и выключение диода с помощью ШИМ-сигнала

7