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

Лекция 3. PWM. UART

.pdf
Скачиваний:
15
Добавлен:
23.03.2016
Размер:
2.88 Mб
Скачать

Широтно-импульсная модуляция (ШИМ/PWM)

Примерение ШИМ

Кодирование информации в некоторых протоколах передачи данных (напр. 1Wire)

Изменяя скважность можно управлять током (применяется напр. в драйверах светодиодов)

Пропуская через интегратор можно создавать аналоговые сигналы имея в распоряжении только цифровой выход и два уровня сигналов (высокий и низкий)

Таймеры в режиме PWM

Таймеры в старших моделях AVR (Мегах) могут самостоятельно (без прерываний) генерировать ШИМ на специальных линиях OC0A, OC0B, и т.д. т.е. OCNx где N – номер используемого таймера

В Mega328p есть 6 независимых PWM каналов, по 2 на каждый таймер

Fast PWM

Таймер считает от 0 до MAX, по совпаденю с OCRnX + по переполнению происходит обновление линии OCnX

Phase Correct PWM

Таймер считает от 0 до MAX, а затем обратно, по достижении значения OCRnX происходит обновление состояния линии OCnX

Генерирование ШИМ в режиме Fast PWM

#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/delay.h>

int main(void) { SP = RAMEND;

DDRD = (1<<DDD6); // OC0A = PD6, 6-я нога на seeduino DDRB = (1<<DDB5);

/* Таймер тикает от 0 до 255 и переключает ногу 0C0A по совпадении * с регистром сравнения */

//Fast PWM, clear OC0A on compare, set OC0A at bottom TCCR0A = (1<<COM0A1)|(0<<COM0A0)|(1<<WGM01)|(1<<WGM00); TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); TCNT0 = 0;

OCR0A = 127; /* скважность = 0.5 (50%) */ while (1) {

__asm__ volatile ("nop");

}

return 0;

}

Генерация синусоиды ШИМ-ом

ti
Упражнение: написать программу расчёта массива скважностей для синуса
ti +1

Расчёт таблицы скважностей

Потребуем, чтобы среднее значение точного синуса совпадало со средним значением нашего

приближения ШИМ-ом

ti+1

sin (t )dt =(ti+1tiDutyi

ti

Чтобы не возникало отрицательных значений скважности Duty, можно "сдвинуть" синусоиду вверх, обеспечив область значений в интервале [0:1]

0.5(1+sin(t ))dt=(ti+1tiDutyi

Интерфейс UART

Universal Asyncronius Reciever-Transmitter – универсальный асинхронный приёмникпередатчик

Асинхронный означает, что UARTу не нужен тактовый импульс, в отличие от, скажем, SPI

Тем не менее, требуется, чтобы передаваемые и принимаемые биты следовали на предопределённой скорости

Логически (но не физически) совместим с RS232 ("COM-порт")