您的位置 首页 培训

STM32的AD输进口存在电压的问题–接连转化形式

找到了AD输入口存在电压的问题今天重新整了一下程序,改变了思路,结果不但解决了数据出现错位的问题.无意中居然把前面的问题也解决了,原…

找到了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的输入阻抗了。

故运用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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/268237.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部