打印

用正点原子的mini开发板做ADC不准确,不知道怎么回事

[复制链接]
2697|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
平常心kxy|  楼主 | 2014-9-7 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,板载stm32103rbt6。。。。。我直接用它测量电源电压。测0v可以。3.3v可以。但是其他的电压不准。很不准。求大家帮我看看是程序有问题还是怎么着?
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟

        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
        //PA0/1/2/3 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        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数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
//    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );

        ADC_Cmd(ADC1, DISABLE);        //使能指定的ADC1
    delay_ms(1);
       
        ADC_ResetCalibration(ADC1);        //重置指定的ADC1的校准寄存器
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //获取ADC1重置校准寄存器的状态,设置状态则等待
       
        ADC_StartCalibration(ADC1);                //开始指定ADC1的校准状态

        while(ADC_GetCalibrationStatus(ADC1));                //获取指定ADC1的校准程序,设置状态则等待
    ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
//        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

}                                  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期                                      

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}
、、。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
float voltageRead()
{
    u16 adcx=0;
        u16 adcx1=0;
        int i=0;
    char j=0;
        float  E=0;
        LED0=1;
        for(i=0;i<60;i++)        //等待一分钟
        {
           delay_ms(1000);
                LED1=!LED1;//DS0闪烁
        }
        for(j=0;j<20;j++)                //连续20次取平均值
        {
                adcx1=Get_Adc(ADC_Channel_1);
                adcx=adcx+adcx1;
                delay_ms(200);
        }
    adcx=adcx/20;
        E=(float)adcx*(3.3/4096);
        LED0=0;                //读取数据完毕
        return E;
}
//----------------------显示电压值------------------------
void voltagedisplay(float E)
{
        u16 temp=0;
        POINT_COLOR=BLUE;//设置字体为蓝色
        LCD_ShowString(60,170,"ADC_CH1_VOL:0.000V");
        temp=E;
        LCD_ShowNum(156,170,temp,1,16);//显示电压值
        E=(E-temp)*1000;
        LCD_ShowNum(172,170,E,3,16);





相关帖子

沙发
airwill| | 2014-9-7 13:03 | 只看该作者
这基本都是硬件问题, 一方面 mini 板的布线不太合理, 地线处理不好;
另一方面信号连接不合理, 噪声大.

使用特权

评论回复
板凳
coody| | 2014-9-7 19:06 | 只看该作者
ADC输入端对地接一个104电容,软件滤波,看是否好转。
STM32F103系列的无外接基准的ADC,很多人发现其跳动很大(就是噪声大),使用合适的数字滤波可以解决这个问题,但是仅使用在反应缓慢的场合,快速的,比如语音采集,则会有噪声,使用合适的数字滤波器(比如16阶低通滤波)也能改善,但是增加运算量。
快速或高精度的场合,我一般外挂ADC芯片,这芯片有时候比MCU还贵。

最后,发现本坛有一个特点,参加讨论什么IC,就被说成是什么IC的水军。
不知道有人说我是STM32的水军不?

使用特权

评论回复
地板
平常心kxy|  楼主 | 2014-9-7 22:19 | 只看该作者
coody 发表于 2014-9-7 19:06
ADC输入端对地接一个104电容,软件滤波,看是否好转。
STM32F103系列的无外接基准的ADC,很多人发现其跳动 ...

我增大了取平均值次数。现在比电压表测的低0.1v左右。测量统一个电压值,每次波动几十mv。软件已经做到仁至义尽了。谢谢您的帮助

使用特权

评论回复
5
江枫渔火| | 2014-9-7 23:43 | 只看该作者
我有这块板子,能转手多少钱?感觉这种东西一转就不值钱了,就觉得倒不如留着,说不定哪天想玩玩

使用特权

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

本版积分规则

23

主题

107

帖子

3

粉丝