打印

STM32F103ZET6 ADC采样16个通道 10个通道稳定可用 6个通道不稳定

[复制链接]
11992|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MariaBrook|  楼主 | 2013-1-14 13:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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路测出的那些不稳定的数据,是从哪里来的呢?


沙发
MariaBrook|  楼主 | 2013-1-14 14:45 | 只看该作者
已解决。
原来是AD线从晶振脚下过的原因

使用特权

评论回复
板凳
uet_cache| | 2013-1-14 18:19 | 只看该作者
呵呵,这种只要能正常采集,一般就是硬件问题了,,

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
MariaBrook + 1 赞一个!
地板
jomosiron| | 2013-1-14 22:53 | 只看该作者
学习了

使用特权

评论回复
5
云仔| | 2013-3-10 20:51 | 只看该作者
求教:为什么不使能多通道扫描呢(ADC_InitStructure.ADC_ScanConvMode = DISABLE;)您的程序不是用到了好多AD通道么?
转换的通道数为什么也设置成1呢?

使用特权

评论回复
6
136154458| | 2017-6-11 11:43 | 只看该作者
程序很工整一目了然

使用特权

评论回复
7
捉虫天师| | 2017-6-11 19:06 | 只看该作者
没想到走线还影响这个。学习了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:天道酬勤

4

主题

29

帖子

0

粉丝