找到了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