Страница 1 из 1

АПЦ в Stm32

Добавлено: Пн фев 29, 2016 12:15:43
pokk
Добрый день, подключил ацп в stm32f103 на вход 3тьего канала подаю постоянное напряжение через переменный резистор.
Опорное напряжение Vdda=2.5в. Тактовая частота ядра 40Mhz пред делить АЦП=4 (ADCCLK=10Mhz) Период дискретизации 100ms.

Код инициализации.(режим одиночного преобразования)
Спойлер

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);					//ADC init


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);



RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);					//ADC init

RCC_ADCCLKConfig(RCC_PCLK2_Div4);

	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
  	/* Now do the setup */
  	ADC_Init(ADC1, &ADC_InitStructure);
  	/* Enable ADC1 */
  	ADC_Cmd(ADC1, ENABLE);

  	/* Enable ADC1 reset calibaration register */
  	ADC_ResetCalibration(ADC1);
  	/* Check the end of ADC1 reset calibration register */
  	while(ADC_GetResetCalibrationStatus(ADC1));
  	/* Start ADC1 calibaration */
  	ADC_StartCalibration(ADC1);
  	/* Check the end of ADC1 calibration */
  	while(ADC_GetCalibrationStatus(ADC1));
Функция чтения АЦП
Спойлер

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

u16 adc_read(u8 channel)
{
  	ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);
  	// Start the conversion
  	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  	// Wait until conversion completion
  	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  	// Get the conversion value
  	return ADC_GetConversionValue(ADC1);
}

Устанавливаю напряжение на входе АЦП =1В значение АЦП при минимальной времени выборки (ADC_SampleTime_1Cycles5 )
получается (1865 это 1.139В) при увеличении времени выборки значение напряжение увеличивается при ADC_SampleTime_239Cycles5 значение АЦП получается 3225(1.970В).

1) Из за чего такое может происходить ? ведь при увеличении времени выборки напряжение наоборот должно выравняться с входным.

2) откуда взялась погрешность в 0.130В при измерении на ADC_SampleTime_1Cycles5.

Re: АПЦ в Stm32

Добавлено: Пн фев 29, 2016 14:05:13
Galizin
Возможно Вам поможет объяснение Леонида Ивановича. Ищите в его блоге. Коротко говоря - вход потребляет ток, зависящий от входного уровня. Решение - ставьте буфер.
А может быть у вас что нибудь еще. Но почитать все равно стоит.

Re: АПЦ в Stm32

Добавлено: Пн фев 29, 2016 18:53:37
pokk
А это вы про статью "Демоны в АЦП STM32" уже читал, но не особо помогло =(

Re: АПЦ в Stm32

Добавлено: Пн фев 29, 2016 21:22:22
qbit
pokk писал(а):...подаю постоянное напряжение через переменный резистор...
Подайте с батарейки, со "свежей" батарейки.