Инициализация АЦП микроконтроллера К1986ВЕ92FI (MDR1211FI)
Рассмотрим, каким образом можно настроить встроенный аналого-цифровой преобразователь (далее АЦП) на микроконтроллере К1986ВЕ92FI(QI) (аналогично для 1986ВЕ92У1К и 1986ВЕ92УК в металлокерамическом корпусе). АЦП микроконтроллера имеет следующие характеристики:
Число каналов - 8;
Разрядность (бит) - 12;
Скорость до (МВыб/с) - 0,5;
Количество АЦП - 2.
Для проверки АЦП нам потребуется Комплект отладочный MILUINO SHIELD ADC ДФТВ.467988.008. Комплект отладочный для оценки работы аналого-цифрового преобразователя на микроконтроллерах, установленных на отладочных средствах с расширением разъемов стандарта Arduino Uno R3, преимущественно предназначен для ознакомления с принципами работы АЦП на микроконтроллере К1986ВЕ92QI АО «ПКК Миландр». В его состав входит цифровой потенциометр 0-68 кОм, подключенный согласно схеме:

Также, плата расширения (шилд) содержит 8 пользовательских светодиодов, выстроенных в виде шкалы, 6 зеленого цвета и 2 красного.
Для того, чтобы полноценно описать работу АЦП изначально надо проинициализировать его на микроконтроллере, так как шилд расширения интерфейса подключается к отладочному комплекту через к каналу 1 PORTD PORT_Pin_2, то будем его и настраивать, ниже приведен код для настройки АЦП:
void Init_ADC(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE); //Включаем тактирование порта D
PORT_InitTypeDef PORTD_InitStruct; //Инициализация структуры настройки порта
PORTD_InitStruct.PORT_SPEED = PORT_SPEED_MAXFAST; // Скорость работы порта максимальная
PORTD_InitStruct.PORT_FUNC = PORT_FUNC_PORT;
PORTD_InitStruct.PORT_MODE = PORT_MODE_ANALOG; // Режим работы аналоговый
PORTD_InitStruct.PORT_OE = PORT_OE_IN; // Направление вход
PORTD_InitStruct.PORT_Pin = PORT_Pin_2;
PORTD_InitStruct.PORT_PULL_UP = PORT_PULL_UP_OFF; // Подтягивающие резисторы отключены
PORTD_InitStruct.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PORT_Init(MDR_PORTD, &PORTD_InitStruct);
RST_CLK_PCLKcmd(RST_CLK_PCLK_ADC, ENABLE); // Включаем тактирование АЦП
ADC_InitTypeDef ADC_InitStruct; // Инициализируем структуру АЦП общую
ADCx_InitTypeDef ADC1_InitStruct; // и АЦП1
/* Параметр отвечает за синхронный/независимый запуск двух АЦП (только для К1986ВЕ92QI и К1901ВЦ1QI )*/
ADC_InitStruct.ADC_SynchronousMode = ADC_SyncMode_Independent;
ADC_InitStruct.ADC_StartDelay = 0; //Позволяет задать задержку между запусками АЦП1 и АЦП2, в данном коде она нулевая
ADC_InitStruct.ADC_TempSensor = ADC_TEMP_SENSOR_Disable; //Запрет работы температурного датчика и источника опорного напряжения (бит TS_EN)
ADC_InitStruct.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Disable; //Запрет выбора источника опорного напряжения для оцифровки
ADC_InitStruct.ADC_IntVRefTrimming = 1; //Задавая значения от 0 до 7, можно в небольших пределах подстроить того же регистра ADC1_CFG
ADC_Init(&ADC_InitStruct); // Функция инциализации АЦП по данным заполненной структуры
ADCx_StructInit(&ADC1_InitStruct);
ADC1_InitStruct.ADC_ClockSource = ADC_CLOCK_SOURCE_CPU; // Выбор источника тактирования, от самого процессора с его частотой
ADC1_InitStruct.ADC_SamplingMode = ADC_SAMPLING_MODE_CICLIC_CONV; // Режим многократного преобразования
ADC1_InitStruct.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable; // Автоматическое переключение каналов запрещено
ADC1_InitStruct.ADC_ChannelNumber = ADC_CH_ADC2; // Выбор номера канала, куда подключен потенциометр
ADC1_InitStruct.ADC_Channels = 0; // Количество используемых каналов, если включен перебор, в нашем случая перебор выключен, поэтому 0
ADC1_InitStruct.ADC_LevelControl = ADC_LEVEL_CONTROL_Enable; // Контроль уровня входного сигнала
ADC1_InitStruct.ADC_LowLevel = 0; // Нижний уровень контроля
ADC1_InitStruct.ADC_HighLevel = ADC_VALUE_MAX; // Верхний уровень контроля
ADC1_InitStruct.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL; // Выбор внутреннего источника опорного напряжения
ADC1_InitStruct.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT; // Вид источника для датчика опорного напряжения
ADC1_InitStruct.ADC_Prescaler = ADC_CLK_div_32768; // Выбор делителя тактовой частоты
ADC1_InitStruct.ADC_DelayGo = 0xF; // Значение задержки перед началом следующего преобразования
ADC1_Init(&ADC1_InitStruct); // Инициализируем структуру АЦП 1
ADC1_SetChannel(ADC_CH_ADC2); // Инициализируем канал
ADC1_Cmd(ENABLE); // Запускаем АЦП
}Таким образом мы настроили функцию инициализации АЦП, вызвав которую можно запустить АЦП микроконтроллера. Однако, для того, чтобы получать результаты преобразования, также необходимо воспользвоваться следующими функциями:
ADC1_Start(); // Запускаем АЦП 1
adc_tmp = MDR_ADC->ADC1_RESULT & 0x0FFF; // Считываем данные с АЦП1, маскирум старший разрядТакже не стоит забывать подключить библиотеку структур, посвященную работе АЦП:
#include "MDR32F9Qx_adc.h" // Keil::Drivers:ADCАЦП микроконтроллера настроено, с подробным проектом можно ознакомится в файле во вложении.
