新闻中心

EEPW首页>嵌入式系统>设计应用> STM32的AD输入口存在电压的问题--连续转换模式

STM32的AD输入口存在电压的问题--连续转换模式

作者: 时间:2016-11-17 来源:网络 收藏
找到了AD输入口存在电压的问题

今天重新整了一下程序,改变了思路,结果不但解决了数据出现错位的问题.无意中居然把前面的问题也解决了,原先怀疑输入阻抗引起的结论是错误的。真正的罪魁祸首是下面这句话:
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
使用连续转换模式,在采用电阻分压取信号并且该分压电阻很大的情况下,容易出现信号被引脚电压淹没的现象。至于该电压为何在连续转换模式下产生,现在我没进一步研究。因为后来我的思路是不用连续转换,结果什么问题都解决了,呵呵。
上午我将Fadc改成16M,并且Ts设成最小(1.5Cycles),当电池拿掉后,量AD输入口的电压,约为0.04V,已经比较接近零了。接上电池(标准3.0V,满的时候实际为3.2V)后,分压点的电压变成1.52V,读到CPU内部经运算后的电压为1.6V,这个数据实际上已经很好的,因为此时的输入阻抗应该在1.2K以下了.看来应该重新理解一下AD的输入阻抗了。

本文引用地址://m.amcfsurvey.com/article/201611/315432.htm

故使用ADC单词转换模式解决这个问题

例如,每隔30ms读取4个AD口的数值,官方的例程只给出ADC+DMA的方式,这里采用非DMA方式。

先配置IO口:

GPIO_InitTypeDef gpioInitStruct;
gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &gpioInitStruct);

gpioInitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &gpioInitStruct);

配置ADC:
将ADC配置成非扫描方式(就是每次处理时不会扫描本组内的所有端口),因为采用规则组时只有一个寄存器保存adc结果;单次模式。

ADC_InitTypeDef adcInitStruct;
adcInitStruct.ADC_Mode = ADC_Mode_Independent;
adcInitStruct.ADC_ScanConvMode = DISABLE;
adcInitStruct.ADC_ContinuousConvMode = DISABLE;
adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
adcInitStruct.ADC_NbrOfChannel = 1;

//ADC自校验:

timeOut = 10000;
ADC_ResetCalibration(ADC1);
while((ADC_GetResetCalibrationStatus(ADC1)) && (timeOut--));

timeOut = 10000;
ADC_StartCalibration(ADC1);
while((ADC_GetCalibrationStatus(ADC1)) && (timeOut--));

每次扫描时调用函数:

void sysGetAdcResult(void)
{
u8 i;

for(i=0; i<4; i++)
{
_adcResult[i] = 0x0FFF;

switch (i)
{
case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5); break;
case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5); break;
case 2: ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5); break;
case 3: ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_239Cycles5); break;
}
// 必须先调用ADC_Cmd()

ADC_Cmd(ADC1, ENABLE);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

// 需要等待一段时间
sysDelay(200);
_adcResult[i] = ADC_GetConversionValue(ADC1);

ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
ADC_TempSensorVrefintCmd(DISABLE);
ADC_SoftwareStartConvCmd(ADC1, DISABLE);
ADC_Cmd(ADC1, DISABLE);
}
}

.您在上面提到的采样时间的选择,AD转换周期(TCONV) = 采样时间+ 12.5个周期。如何选择?依据是什么?

要看外接的等效输入电阻及电容。103的DATASHEET上有一个公式

R(AIN)
还有一个图表

Ts (cycles)tS (μs)RAIN max (kΩ)

1.50.111.2

7.50.5410

13.50.9619

28.52.0441

41.52.9660

55.53.9680

71.55.11104

239.517.1350


评论


技术专区

关闭