- •Встраиваемые микроконтроллеры avr-8
- •Санкт-Петербург 2013 Содержание
- •Часть 1. Архитектура мк (л2, л3)
- •Понятия мк для встраиваемых приложений и семейства мк. Семейство avr-8
- •Структура и архитектура мк
- •Тактирование, процессор и арифметико-логическая группа команд
- •Структура и адресация памяти программ. Ветвления, циклы, подпрограммы, и группа команд передачи управления
- •Структура и адресация памяти данных. Группа команд передачи данных
- •Порты ввода/вывода. Типовая схема включения мк. Структура управляющей программы, поллинг.
- •Часть 2. Процесс проектирования устройств на мк (л4, л5)
- •2.1. Этапы процесса проектирования устройств на мк
- •2.2.Техническое задание и разработка алгоритма (блок-схемы)
- •2.3. Языки программирования и синтаксическая проверка проекта
- •2.4. Средства загрузки кодов программ и данных (программаторы)
- •2.5. Средства отладки для выявления логических и схемотехнических ошибок
- •2.6. Подключение индикаторов и клавиатуры
- •Часть 3. Ввод/вывод в мпу
- •3.1. Понятие и характеристики интерфейса
- •3.2. Внутрисистемные интерфейсы в мпу
- •3.3 Параллельный порт avr
- •3.4. Внешняя магистраль памяти данных avr мк
- •3.5. Принцип и средства ввода/вывода по прерываниям.
- •3.6. Принцип прямого доступа к памяти
- •Часть 4. Прерывания (л8)
- •4.1. Механизм прерываний в avr и его программирование
- •4.2. Входы прерываний inTx и pcinTx.
- •Часть 5. Таймеры/счетчики
- •5.1. Задачи формирования и измерения временных интервалов
- •5.2. Принципы программного формирования/измерения временного интервала
- •5.3. Таймер/счетчик с прерыванием по переполнению
- •5.4. Таймер/счетчик с дополнительными узлами захвата и сравнения
- •Часть 6. Задачи и устройства аналогового ввода/вывода (л12, л13)
- •6.1. Задачи аналогового ввода и вывода
- •6.2. Встроенный аналоговый компаратор
- •6.3. Встроенный многоканальный ацп
- •6.4. Встроенный цап
- •Часть 7. Задачи и устройства последовательного интерфейса (л14, л15)
- •7.1. Принципы и преимущества последовательного интерфейса
- •7.2. Функции встроенного контроллера последовательного интерфейса
- •7.3. Протокол и контроллер трехпроводного синхронного пи (spi)
- •7.4. Устройство контроллера i2c и его применение
- •7.5 Цап с последовательным интерфейсом
- •7.6. Устройство контроллера u(s)art и его применение
- •7.7. Сетевые протоколы и их стандартизация
- •7.8. Открытый протокол Modbus
- •История
- •Введение
- •Категории кодов функций
- •Модель данных
- •Стандартные функции протокола Modbus
- •Запись одного значения
- •Запись нескольких значений
- •Контроль ошибок в протоколе Modbus rtu
- •Rtu фрейм
- •Логические ошибки
- •Стандартные коды ошибок
6.2. Встроенный аналоговый компаратор
Аналоговый компаратор (АК) является простейшим устройством аналогового ввода. Он служит для сравнения двух аналоговых сигналов и выдает на выход высокий уровень, если сигнал на неинвертирущем входе больше, чем на инвертирующем и низкий уровень в обратном случае.
Аналоговый компаратор строится на базе операционного усилителя, оптимизированного по быстродействию для работы на участке насыщения (лучшие имеют десятки - единицы наносекунд). Выходной сигнал компаратора привязывается по уровню к логическим сигналам.
Большинство аналоговых компараторов, встроенных в МК имеют два внешних входа и "цифровое" питание, что ограничивает диапазон сравниваемых сигналов (0 < uвх < VCC). Выход компаратора доступен для чтения через регистр ввода/вывода и лишь в некоторых моделях МК выход одновременно выведен наружу для замыкания аналоговых и логических обратных связей.
В МК семейства AVR имеется один компаратор (рис. 6.1). Его входы обозначены AIN0 и AIN1, выход компаратора доступен для чтения через регистр ввода/вывода (ACSR.ACO). Изменение выхода компаратора (фронт, срез или любой переход) выявляется аппаратно и может порождать прерывание (ACI), а также срабатывание узла захвата таймера/счетчика 1 (ICP).
Таким образом, дискретизация по времени с использованием АК может быть выполнена в цикле поллинга (чтение выхода ACSR.ACO), либо автоматически по (выбранному) изменению выхода (прерывание или захват "времени" в виде числа тактов таймера/счетчика).
Быстродействие встроенных компараторов оставляет желать лучшего (300-500 нс), но в последних высокопроизводительных МК встречаются модели с улучшенными значениями (30 нс в ATxmega). Для сравнительно медленных сигналов с зашумлением удобно использовать аппаратный подавитель шума. Его работа основана на отбрасывании слишком частых изменений выхода.
Рис. 6.1. Структура аналогового компаратора (ATmega16)
Во многих задачах необходимо сравнивать изменяющийся во времени сигнал с постоянным уровнем, поэтому один из входов аналогового компаратора может подключаться к внутреннему источнику так называемого "опорного" напряжения (Analog Reference).
Пример с АК: система импульсно-фазового управления (СИФУ) однофазного выпрямителя на 50 Гц. Выявляет переходы напряжения сети через ноль (синхронизация с сетью) и формирует импульсы управления с заданной задержкой по отношению к этим пере ходам. Параметры задания: длительность импульса 10 мкс, время задержки должно изменяться от 0 до 9.9 мс с шагом 0.1 мс и задаваться числом n от 0 до 99 через порт МК.
Для выявления моментов перехода напряжения сети через ноль используем понижающий измерительный трансформатор и встроенный аналоговый компаратор.
В модели Proteus VSM (<sifu-m16.dsn>, рис. 6.2) трансформатор и напряжение сети представлены источником напряжения V1 типа VSIN амплитудой VA = 2 В частотой FREQ = 50 Гц. К неинвертирующему входу AIN0 подключен делитель напряжения питания R1 и R2 по 1 кОм, обеспечивающий уровень VCC/2 = 2.5 В. На инвертирующий вход AIN1 подано напряжение источника VSIN со смещением 2.5 В (см. временную дигармму на рис. 6.2).
Рис. 6.2. Схема и временная диаграмма СИФУ в PROTEUS-VSM
Аналоговый компаратор настроен на формирование прерываний по фронту и срезу (оба перехода через ноль) и в этом прерывании (ISR(ANA_COMP_vect)) перезапускает (обнуляет) таймер/счетчик TCNT1, а также переключает выход РС0 для индикации бита АС0.
Таймер-счетчик 1 настроен на режим таймера с частотой тактирования ftc1 = 1 МГц, переполнение может наступить через 216 / ftc1 = 65536 мкс, но сброс каждые 10 мс гарантируется линейный рост примерно до 10000. Разрешено прерывание по совпадению значений TCNT1 и OCR1A, в этом прерывании на выходе РС1 программно формируется импульс длительностью 10 мкс.
Запись в OCR1A числа от 0 до 9900 с шагом 100 гарантирует прерывание, задержанное по отношению к переходу VSIN через ноль на требуемое по заданию время.
В основном цикле выполняется чтение числа n с порта А, преобразование этого числа в длительность задержки (в микросекундах) и запись результата в регистр сравнения OCR1A.
Формируемые программой сигналы AC0 (PC0) и Imp (PC1) также приведены на временной диграмме.
Текст программы (файл <sifu_m16.c>).
#include <avr/io.h>
#include <avr/interrupt.h>
#define FCLK 8000000L
#define _NOP() do { __asm__ __volatile__ ("nop"); } while (0)
#define DELAY_10us { _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); }
unsigned int ntz = 0;
ISR(TIMER1_COMPA_vect) {
PORTC |= (1<<1);
DELAY_10us;
PORTC &= ~(1<<1);
} // **************************
ISR(ANA_COMP_vect) {
TCNT1 = 0;
if(ACSR & (1<<ACO)) PORTC |= (1<<0); else PORTC &= ~(1<<0);
} // **************************
unsigned int calc_ntz(unsigned char code) {
ntz = code * 100;
if(ntz == 0) ntz=1;
if(ntz > 9900) ntz=9900;
return ntz;
} // **************************
int main() {
ntz = calc_ntz(0);
DDRC = (1<<1)|(1<<0);//0x03;
PORTA = 0xff;
TCCR1B = (1<<CS01);//ftc1 = fclk/8 = 1MHz, Ttc1=1us
TIMSK = (1<<OCIE1A);//
OCR1A = ntz;//
ACSR = (1<<ACIE);//Разрешить АК, прерыв по фр и ср
sei();
while (1) {
ntz = calc_ntz(PINA & 0x7f)
OCR1A = ntz;
}
} // *******************************
Период тактирования таймера/счетчика задан шагом изменения задержки – он может быть равен или кратно меньше Ттс_макс = 0.1 мс = 100 мкс. При частоте тактирования МК fclk = 8 МГц требуемый коэффициент деления Красч = Ттс_макс * fclk = 800, такого значения в предделителе нет, при выборе К = 8 кратность составит 800 / 8 = 100, то есть ntz = n*100. Выбор данной частоты тактирования позволяет при необходимости задавать время задержки с дискретностью в 100 раз меньшей (1 мкс).
