STM32 Проблемы с ADC (АЦП)

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Zender12
Родился
Сообщения: 6
Зарегистрирован: Чт дек 08, 2011 18:06:52

STM32 Проблемы с ADC (АЦП)

Сообщение Zender12 »

Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа для STM32F4DISCOVERY использующая АЦП для измерений, был подключён потенциометр на 10kOm средней точкой к выводу PA1
СпойлерИзображение
.

Код: Выделить всё

#include <stm32f4xx.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_adc.h>
int ReadADC1()
{
   ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
   ADC_SoftwareStartConv(ADC1);
   while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
   return ADC_GetConversionValue(ADC1);
}
void main(void)
{
   // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
   GPIO_InitTypeDef GPIO_STR;
   ADC_InitTypeDef ADC_STR;
   ADC_CommonInitTypeDef ADC_CSTR;
   GPIO_STR.GPIO_Mode=GPIO_Mode_AN;
   GPIO_STR.GPIO_Pin=GPIO_Pin_1;

   GPIO_Init(GPIOA,&GPIO_STR);

   ADC_DeInit();
   ADC_CSTR.ADC_Mode=ADC_Mode_Independent;
   ADC_CSTR.ADC_Prescaler=ADC_Prescaler_Div2;

   ADC_CommonInit(&ADC_CSTR);

   ADC_STR.ADC_ContinuousConvMode=DISABLE;
   ADC_STR.ADC_DataAlign=ADC_DataAlign_Right;
   ADC_STR.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None;
   //ADC_STR.ADC_NbrOfConversion=ADC_N
   ADC_STR.ADC_Resolution=ADC_Resolution_12b;
   ADC_STR.ADC_ScanConvMode=DISABLE;

   ADC_Init(ADC1,&ADC_STR);

   ADC_Cmd(ADC1,ENABLE);

   int adc_temp=0,sum=0;

   while(1)
   {
      for (time = 0; time <= 1000; time++)
      {
         delay(300);
         adc_temp=ReadADC1();
         sum+=adc_temp;
      }
      sum/=1000;
   }
}
. Сначала всё замечательно работало но спустя какое-то время без каких-либо изменений в коде и схеме перестала работать. Как выяснилось позже происходит зацикливание на одной из строк кода

Код: Выделить всё

 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
. В одно включение программа работает без сбоев, ведутся нормальные замеры, в следующий же раз происходит зацикливание, даже без изменения кода. Даже при удалении участка кода где происходит зацикливание (что насколько я понимаю в корне не верно) приходят неверные данные. Прошу подскажите всё-ли верно в инициализации и использовании АЦП и что может приводить к таким проблемам?
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 Проблемы с ADC (АЦП)

Сообщение oleg110592 »

если так:
ADC_STR.ADC_NbrOfConversion=1;
p.s. 5В для ацп, имхо многовато
Реклама
Zender12
Родился
Сообщения: 6
Зарегистрирован: Чт дек 08, 2011 18:06:52

Re: STM32 Проблемы с ADC (АЦП)

Сообщение Zender12 »

Пробывал, безрезультатно. Картинка для наглядности, потенциометр подключён к +3.3В.(в датащите сказано что вход толерантен к +5В)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 Проблемы с ADC (АЦП)

Сообщение HHIMERA »

Zender12 писал(а):в датащите сказано что вход толерантен к +5В

Угу...
FT = 5 V tolerant except when in analog mode or oscillator mode (for PC14, PC15, PH0 and PH1).
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «ARM»