СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №3/2015
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 40 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 3 2015 В РЕМЯ ПРЕОБРАЗОВАНИЯ АЦП АЦП поддерживает возможность раздельного программирования вре- мени преобразования в каждом из каналов. Предусмотрена возмож- ность выбора 8 дискретных значений из диапазона 1,5…239,5 циклов. Для каждого канала время задаётся индивидуально с помощью разря- дов SMPx[2:0] регистров ADC_SMPR1 и ADC_SMPR2. Полное время преобразования T conv вычисляется по формуле: T conv = T smt + + 12,5 циклов, где T smt – это программ- но заданное время выборки. Например, частота ADCCLK задана равной 14 МГц, а время выборки – 1,5 цикла. Тогда T conv = =1,5 + 12,5 = 14 циклов = 1мкс. Д АТЧИК ТЕМПЕРАТУРЫ АЦП Встроенный в кристалл микрокон- троллера датчик температуры позво- ляет измерять температуру самого кри- сталла. Датчик подключён к 16-му вхо- ду АЦП. Рекомендуемое время выборки при опросе датчика составляет 17,1 мкс. Когда датчик не используется, его мож- но отключить. Напряжение на выходе датчика изменяется линейно с темпера- турой. В разных кристаллах эта линия смещается до 45 градусов, что связано с технологией изготовления. Внутрен- ний датчик больше подходит не для измерения абсолютного значения тем- пературы, а для контроля её изменения. Для чтения температуры необходимо выбрать канал 16, задать время выбор- ки не менее 17,1 мкс и установить раз- ряд TSVREFE в регистре ADC_CR2 для включения датчика. После этого можно запустить преобразование АЦП уста- новкой разряда ADON или внешним событием и прочитать результат пре- образования. Вычисляется значение температуры по формуле: Т[ ° C] = (V25 – Vsense) / Avg_ Slope + 25, где V25 – значение измере- ния при 25 градусах, имеющее типовое значение 1,41В, Vsense – текущее изме- ренное значение, а Avg_Slope – коэффи- циент из таблицы на кристалл, имею- щий типовое значение 4,3 мВ/ ° C. О КОННЫЙ КОМПАРАТОР Оконный компаратор может исполь- зоваться для мониторинга выбранно- го регулярного или инжектированно- го канала, или всех регулярных или инжектированных каналов. Помимо мониторинга напряжения, функция оконного компаратора может исполь- зоваться в качестве детектора пересе- чения нуля. Флаг AWD устанавливается, если цифровое значение канального сигна- ла, измеренного с помощью АЦП, боль- ше или меньше заданного уровня. Этот уровень задаётся регистрами ADC_HTR и ADC_LTR. Прерывание может быть разрешено разрядом AWDIE регистра ADC_CR1. Каналы АЦП, контролируе- мые оконным компаратором, задают- ся согласно таблице 2. Разряд AWDSGL задаёт количество контролируемых каналов. Если он равен 0, то контролируются все каналы, а если 1 – то один канал. Номер кана- ла при этом задаётся с помощью раз- рядов AWDCH[4:0]. Разряд AWDEN разрешает конт- роль каналов регулярной группы, а JAWDEN – контроль каналов инжек- тированной группы. П РИМЕРЫ ПРОГРАММ Рассмотрим примеры программ для работы с АЦП. Начнём с простейше- го варианта: измерение уровня сиг- нала на одном канале с программ- ным запуском. Для этого используем вывод порта PORTA.6 микроконтрол- лера. Пример программы приведён в листинге 1. Данный пример демонстрирует про- грамму, в которой необходимо регуляр- но запускать АЦП и ждать окончания преобразования. Теперь рассмотрим пример другой программы, приведённый в листинге 2, Листинг 2 //========================= // Функция инициализации АЦП //========================= void Init_ADC(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта PORTA // Сконфигурировать PORTA.6 как аналоговый вход GPIOA->CRL &= ~GPIO_CRL_MODE6; // Очистить биты MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // Очистить биты CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Включить тактирование АЦП RCC->CFGR &= ~RCC_CFGR_ADCPRE; // Задать значение делителя тактовой частоты ADC1->CR1 = 0; // Обнулить регистр управления ADC1->SQR1 = 0; // Обнулить регистр SQR1 ADC1->CR2 |= ADC_CR2_CAL; // Пуск калибровки while (!(ADC1->CR2 & ADC_CR2_CAL)){}; // Ждать окончания калибровки ADC1->CR2 = ADC_CR2_EXTSEL; // Выбрать источником запуска разряд SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG; // Разрешить внешний запуск регулярного канала ADC1->CR2 |= ADC_CR2_CONT; // Включить режим непрерывного преобразо- вания ADC1->CR2 |= ADC_CR2_ADON; // Включить АЦП ADC1->CR2 |= ADC_CR2_SWSTART; // // Пуск преобразования } //========================= // Главный модуль программы //========================= void main(void) { unsigned int ai; // Инициализация переменных Init_ADC(); // Выполнить инициализацию и пуск АЦП // Другие команды … while(1) // Бесконечный цикл { ai=ADC1->DR; // Считать результат преобразования // Другие команды … } }
RkJQdWJsaXNoZXIy MTQ4NjUy