本帖最后由 MariaBrook 于 2013-1-14 13:34 编辑
我使用STM32F103ZET6,将16个ADC通道全部引出,采用最简单直接的单次采样方式。前6个通道的数据跳变不稳。后10个通道的数据稳定可用,基本保持在1LSB左右。 硬件16路,前八路通过3.3K和22K分压,后八路通过3.3K和1.8K分压,分别采24V和5V量程的电压。再无其他的处理。使用示波器测量,至引脚的输入电压均无问题。
程序如下:
//首先将16路采样的宏定义出来
ADC_TypeDef* adcUserADC[ADC_channal_MAX] = {ADC3, ADC3, ADC3, ADC3, ADC3, //PF 6 7 8 9 10
ADC3, ADC3, ADC3, //PC 0 1 2
ADC1, ADC1, //PA 6 7
ADC3, //PA 1
ADC3, ADC1, //PC 3 4
ADC1, ADC1, //PB 0 1
ADC1}; //PC5
uint8_t adcUserChannal[ADC_channal_MAX] = {ADC_Channel_4, ADC_Channel_5, ADC_Channel_6, ADC_Channel_7, ADC_Channel_8,
ADC_Channel_10, ADC_Channel_11, ADC_Channel_12,
ADC_Channel_6, ADC_Channel_7,
ADC_Channel_1,
ADC_Channel_13, ADC_Channel_14,
ADC_Channel_8, ADC_Channel_9,
ADC_Channel_15};
// **** 将adc输入的引脚配置
// **** 将adc寄存器进行配置
// **** 标定和校准
void ADC_initMy(void){
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Init(ADC3, &ADC_InitStructure);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC3, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1) == SET);
ADC_ResetCalibration(ADC3);
while(ADC_GetResetCalibrationStatus(ADC3) == SET);
ADC_StartCalibration(ADC3);
while(ADC_GetCalibrationStatus(ADC3) == SET);
}
// **** 单次采样的函数
uint16_t ADC_getChannal(ADC_TypeDef* ADCx, uint8_t channal){
uint16_t tem = 0;
ADC_ClearFlag(ADCx, ADC_FLAG_EOC);
ADC_RegularChannelConfig(ADCx, channal, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADCx, ENABLE);
while(ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET);
tem = ADC_GetConversionValue(ADCx);
return tem;
}
// 主函数中的调用
uint8_t adc_debug(void){
uint32_t tem;
uint8_t i, flag;
while(1){
my_printf_SendString("\r\nRound: ");
for(i = 0; i <16; i++){
tem = ADC_getChannal(adcUserADC, adcUserChannal);
my_printf_SendASCII_num16Hex(tem);
my_printf_SendString(" ");
}
Delay10Ms(20);
}
return TRUE;
}
各个IO口的时钟已经打开,ADC和uart的时钟都已经在初始化的时候打开。
在硬件电路和软件函数一模一样的情况下,后10路的数据非常稳定,前6路的数据大概只能保持8位,而且会经常出现0x1FF这个数
在没有电压输入的情况下,16路的采样结果
Round: 0000 0000 0002 0005 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0002 0004 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0005 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 000D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 001F 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0005 001F 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0001 0000 000D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0002 0000 000D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0005 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
第5通道有+3.3V经过3.3k/(3.3k+22k)电阻分压之后,数据输入时
Round: 0000 0000 0000 0000 01DC 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0006 01F5 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0002 0004 01F6 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0222 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 01E4 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 01DB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 0222 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0000 0005 01E4 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0005 0217 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 01DE 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0210 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0002 0004 01F6 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
第7通道有+3.3V经过3.3k/(3.3k+22k)电阻分压之后,数据输入时
Round: 0000 0000 0000 0001 0000 0002 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0000 0005 0000 0000 0213 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0006 0000 0000 0213 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0000 0000 0000 0014 0001 0216 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0003 0002 001F 0001 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0001 0000 0002 001F 0000 0213 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0013 0000 0214 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0002 0001 0000 0000 0000 0001 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0000 0002 0000 000E 0001 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0000 0000 001F 0000 0216 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0014 0000 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0000 0014 0000 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0000 0000 0000 0000 0215 0000 0000 0000 0000 0000 0000 0000 0000 0000
第9通道有+3.3V经过3.3k/(3.3k+1.8k)电阻分压之后,数据输入时
Round: 0000 0000 0000 0006 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0001 000F 0000 0000 0000 0A55 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0001 0006 001F 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0000 0000 0001 001F 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0003 0005 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0001 0001 0002 0000 001F 0001 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0002 0000 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0002 0001 0000 0000 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0002 0002 0005 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0001 0002 0000 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
Round: 0000 0000 0000 0000 0000 0000 0000 0000 0A54 0000 0000 0000 0000 0000 0000 0000
前6个通道特性一致,第7、8通道特性一致,第9~16通道特性一致
如果说是某一组IO口的问题,但是不稳定的6个中,有PF6、PF7、PF8、PF9、PF10、PC0,而PC1、PC2、PC3、PC4、PC5都是稳定的;
如果说是ADC的配置问题,后面的10路中有ADC1,也有ADC3,都获得了比较好的数据,前6路使用的ADC3也应该没有问题。
那么前6路测出的那些不稳定的数据,是从哪里来的呢?
|
|