Миландр
http://forum.milandr.ru/

Померить напряжение на входе ADC1
http://forum.milandr.ru/viewtopic.php?f=40&t=3532
Страница 1 из 1

Автор:  lexxx [ 2016-авг-19 13:33 ]
Заголовок сообщения:  Померить напряжение на входе ADC1

Здравствуйте! Долго лазил по форуму и не нашел того, чего искал.
Суть: хочу померить напряжение на входе ADC1. Нашел в стандартное библиотеке ADC/AnalogWatchdog/main этот код:

Код:
RST_CLK_DeInit();

  RST_CLK_HSEconfig(RST_CLK_HSE_ON);
  if(RST_CLK_HSEstatus() == ERROR)
     while(1);

  RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSEdiv1, RST_CLK_CPU_PLLmul4);
  RST_CLK_CPU_PLLcmd(ENABLE);

  if(RST_CLK_CPU_PLLstatus() == ERROR)
     while(1);

  RST_CLK_CPUclkPrescaler(RST_CLK_CPUclkDIV1);
  RST_CLK_CPU_PLLuse(ENABLE);
  RST_CLK_CPUclkSelection(RST_CLK_CPUclkCPU_C3);

  /* Enable peripheral clocks --------------------------------------------------*/
  RST_CLK_PCLKcmd((RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_ADC | RST_CLK_PCLK_PORTA),ENABLE);
  RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTB, ENABLE);

  /* Init NVIC */
  SCB->AIRCR = 0x05FA0000 | ((uint32_t)0x500);
  /* Disable all interrupt */
  NVIC->ICPR[0] = 0xFFFFFFFF;
  NVIC->ICER[0] = 0xFFFFFFFF;

  /* Enable ADC interrupt  */
  NVIC->ISER[0] = (1<<ADC_IRQn);

  /* Reset PORTD settings */
  PORT_DeInit(MDR_PORTA);

  /* Configure ADC pin: ADC */
  /* Configure PORTB pin 8 */
  PORT_InitStructure.PORT_Pin   = PORT_Pin_8;
  PORT_InitStructure.PORT_OE    = PORT_OE_IN;
  PORT_InitStructure.PORT_MODE  = PORT_MODE_ANALOG;
  PORT_Init(MDR_PORTB, &PORT_InitStructure);

  /* ADC Configuration */
  /* Reset all ADC settings */
  ADC_DeInit();
  ADC_StructInit(&sADC);
  ADC_Init (&sADC);

  ADCx_StructInit (&sADCx);
  sADCx.ADC_ClockSource      = ADC_CLOCK_SOURCE_CPU;
  sADCx.ADC_SamplingMode     = ADC_SAMPLING_MODE_CICLIC_CONV;
  sADCx.ADC_ChannelSwitching = ADC_CH_SWITCHING_Disable;
  sADCx.ADC_ChannelNumber    = ADC_CH_ADC7;
  sADCx.ADC_Channels         = 0;
  sADCx.ADC_LevelControl     = ADC_LEVEL_CONTROL_Enable;
  sADCx.ADC_LowLevel         = L_Level;
  sADCx.ADC_HighLevel        = H_Level;
  sADCx.ADC_VRefSource       = ADC_VREF_SOURCE_INTERNAL;
  sADCx.ADC_IntVRefSource    = ADC_INT_VREF_SOURCE_INEXACT;
  sADCx.ADC_Prescaler        = ADC_CLK_div_32768;
  sADCx.ADC_DelayGo          = 0x7;
  ADC1_Init (&sADCx);

  /* Enable ADC1 EOCIF and AWOIFEN interupts */
  ADC1_ITConfig((ADCx_IT_END_OF_CONVERSION  | ADCx_IT_OUT_OF_RANGE), ENABLE);

  /* Init display */
  Display_Init();

  /* ADC1 enable */
  ADC1_Cmd (ENABLE);

  while(1)
{
MDR_ADC->ADC1_CFG |= 0x02; // ADC Start
while(!(MDR_ADC->ADC1_STATUS & 0x04)) __NOP();
      adc_result=MDR_ADC->ADC1_RESULT&0x0FFF;
adc_result_volt = 3.3*adc_result/0x0FFF;
}


и в конце подсчет соответственно вставил я.

Проблема: я подключаю к ADC1 батарейку 3v, подключал и 1,5v, а значение не менялось. Что с батарейками, что без них: результат - от 1,16v до 1,92v.
Вопрос:что не так, подскажите?

Автор:  prostoRoman [ 2016-авг-22 08:50 ]
Заголовок сообщения:  Re: Померить напряжение на входе ADC1

Во-первых надо указать какой контроллер и писать в соответствующую ему ветку.
Во-вторых надо проверить и убедиться что восьмая ножка порта В соответствует седьмому каналу АЦП.
В-третьих, желательно указать отладочная ли это плата и какие перемычки на ней как установлены.

Автор:  редактор [ 2016-авг-25 12:14 ]
Заголовок сообщения:  Re: Померить напряжение на входе ADC1

Цитата:
результат - от 1,16v до 1,92v

Это скорее всего из-за притяжек. Если притяжки включены и в питание и в землю, то где-то в районе средней точки и результат.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/