Автор: admin, 26 февраля, 2025
Плата расширения цифрового потенциометра
Краткое описание

Инициализация АЦП микроконтроллера К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

АЦП микроконтроллера настроено, с подробным проектом можно ознакомится в файле во вложении.

 

Дополнительные файлы