Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП МПУ-13.doc
Скачиваний:
13
Добавлен:
01.04.2025
Размер:
6 Мб
Скачать
☆

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 мкс).