Миландр

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

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 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
Сообщения: 417
Откуда: ПКК "Миландр"
Навскидку, когда включено 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

_________________
Отдел технической поддержки support@milandr.ru


Последний раз редактировалось 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
Сообщения: 438
Цитата:
ADC1.ADC_SamplingMode = ADC_SAMPLING_MODE_CICLIC_CONV;

Может заменить на одиночное преобразование??

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

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


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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


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

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB