Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-дек-14 03:33

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 4 сообщения ] 
Автор Сообщение
 Заголовок сообщения: Работа с АЦП K1986BE92QI
СообщениеДобавлено: 2019-май-14 11:32 
Не в сети

Зарегистрирован: 2019-май-08 09:13
Сообщения: 2
Организация: Частник
Доброго времени суток. Не получается считать значение напряжение с АЦП по канал 5,6,7. Выдает только шумы. Проверяю канал внутреннего опорного напряжения, выдает скачущее значение в диапазоне от 1.3 до 2. Может что то с инициализацией не так. Привожу код инициализации порта D и АЦП:
void GPIO_Init()
{
		PORT_InitTypeDef GPIO_InitStructure;
	
	// Enables the RTCHSE clock on all ports
  RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTD, ENABLE);
	
	
	GPIO_InitStructure.PORT_Pin = PORT_Pin_5 | PORT_Pin_6 | PORT_Pin_7;
	GPIO_InitStructure.PORT_PULL_UP = PORT_PULL_UP_OFF;
	GPIO_InitStructure.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
	GPIO_InitStructure.PORT_PD_SHM = PORT_PD_SHM_OFF;
	GPIO_InitStructure.PORT_PD = PORT_PD_DRIVER;
	GPIO_InitStructure.PORT_GFEN = PORT_GFEN_OFF;
	GPIO_InitStructure.PORT_FUNC = PORT_FUNC_PORT;
	GPIO_InitStructure.PORT_SPEED = PORT_SPEED_MAXFAST;
	GPIO_InitStructure.PORT_MODE = PORT_MODE_ANALOG;
	GPIO_InitStructure.PORT_OE = PORT_OE_IN;
  PORT_Init(MDR_PORTD, &GPIO_InitStructure);
}

void ADCInit()
{
	ADC_InitTypeDef ADC;
	ADCx_InitTypeDef ADC1;
	
	RST_CLK_PCLKcmd(RST_CLK_PCLK_ADC, ENABLE);
	RST_CLK_ADCclkSelection(RST_CLK_ADCclkCPU_C1);
	RST_CLK_ADCclkPrescaler(RST_CLK_ADCclkDIV1);
	RST_CLK_ADCclkEnable(ENABLE);
	
	//SysTick->LOAD |= (8000000/1000)-1;
	//SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Pos;
	//SysTick->CTRL |= SysTick_CTRL_COUNTFLAG_Pos;
	//SysTick->CTRL |= ~SysTick_CTRL_ENABLE_Pos;
	
	ADC_StructInit(&ADC);
	ADC.ADC_SynchronousMode = ADC_SyncMode_Independent;
	ADC.ADC_StartDelay = 0;
	ADC.ADC_TempSensor = ADC_TEMP_SENSOR_Disable;
	ADC.ADC_TempSensorAmplifier = ADC_TEMP_SENSOR_AMPLIFIER_Disable;
	ADC.ADC_TempSensorConversion = ADC_TEMP_SENSOR_CONVERSION_Disable;
	ADC.ADC_IntVRefConversion = ADC_VREF_CONVERSION_Enable;
	ADC.ADC_IntVRefTrimming = 0;
	ADC_Init(&ADC);
	
	
	ADCx_StructInit(&ADC1);
	ADC1.ADC_ClockSource = ADC_CLOCK_SOURCE_CPU;
	ADC1.ADC_SamplingMode = ADC_SAMPLING_MODE_CICLIC_CONV;
	ADC1.ADC_ChannelSwitching = ADC_CH_SWITCHING_Enable; //
	ADC1.ADC_ChannelNumber = ADC_CH_ADC5; //ADC_CH_INT_VREF; //ADC_CH_TEMP_SENSOR; // | ADC_CH_ADC6 | ADC_CH_ADC7;
	ADC1.ADC_Channels = 0;
	ADC1.ADC_LevelControl = ADC_LEVEL_CONTROL_Disable;
	ADC1.ADC_LowLevel = 0;
	ADC1.ADC_HighLevel = 0;
	ADC1.ADC_VRefSource = ADC_VREF_SOURCE_INTERNAL;
	ADC1.ADC_IntVRefSource = ADC_INT_VREF_SOURCE_INEXACT;
	ADC1.ADC_Prescaler = ADC_CLK_div_512;
	ADC1.ADC_DelayGo = 7;
	ADC1_Init(&ADC1);
	ADC1_Cmd(ENABLE);
}
Вот еще код основной программы, где осуществляется запуск считывания:
int main(void)
{
	....	
	GPIO_Init();
	
 	My_Uart1_Init();
       My_Uart2_Init();
	
	My_TWI_Init();
	ADCInit();
	

while(1)
	{
	
	ADC1_Start();
	while(ADC1_GetFlagStatus(ADC1_FLAG_END_OF_CONVERSION) == 0);
	RESULT = ADC1_GetResult()& 0x0000FFF;
	U = 3.3*(float)RESULT / opr; // opr = 4096
	}
В чем может быть проблема? Начинающий МК-программист))


Вынести предупреждение
Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП K1986BE92QI
СообщениеДобавлено: 2019-май-14 11:44 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 456
Организация: Milandr
Откуда: ПКК "Миландр"
Навскидку, когда включено ADC_CH_SWITCHING_Enable, то измеряются каналы заданные маской в ADC1.ADC_Channels. Записывать ADC1.ADC_Channels = 0 поэтому некорректно.
Если переключение выключено, то измеряться будет канал заданный в ADC_ChannelNumber.

Еще включено ADC_SAMPLING_MODE_CICLIC_CONV, поэтому достаточно одного запуска, после этого АЦП будет измерять непрерывно переключая каналы. Достаточно проверять бит готовности и вычитывать результат. Постоянный запуск в цикле не нужен.

Пример работы с АЦП из Pack для Keil обычно устанавливается сюда
C:\Keil_v5\ARM\PACK\Keil\MDR1986BExx\1.51\Examples\MDR1986VE9x\MDR32F9Q3_EVAL\ADC\AnalogWatchdog

Еще пример
https://startmilandr.ru/doku.php/prog:a ... e1986ve91t

Несколько примеров работы с АЦП, но под отдельный Pack
https://github.com/StartMilandr/MDR_Pac ... s/ADC_Test


Последний раз редактировалось Vasiliy 2019-май-14 12:00, всего редактировалось 2 раза.

Вынести предупреждение
Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП K1986BE92QI
СообщениеДобавлено: 2019-май-14 11:51 
Не в сети

Зарегистрирован: 2019-май-08 09:13
Сообщения: 2
Организация: Частник
Я уже пробовал подключить один канал и в ADC1.ADC_Channels выставлял Disable. В итоге происходило то же самое.


Вынести предупреждение
Вернуться к началу
 Заголовок сообщения: Re: Работа с АЦП K1986BE92QI
СообщениеДобавлено: 2019-май-14 12:03 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 467
Цитата:
ADC1.ADC_SamplingMode = ADC_SAMPLING_MODE_CICLIC_CONV;
Может заменить на одиночное преобразование??

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вынести предупреждение
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 4 сообщения ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 8 гостей


Быстрые действия:
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB