48脚的STM32F103C8T6,就是AD有很大跳动

[复制链接]
12154|65
 楼主| YEYEYElxj 发表于 2017-8-1 10:14 | 显示全部楼层
fzyuan 发表于 2017-8-1 10:08
采样率不可能是12MHz的,你说的12MHz也许是ADC的时钟,结合你前面的参数,你的采样率可能是47.619ksps。
...

是的,我是ADC时钟是12MHz的,这1000个数据是存在哪里了?那我从哪里调出这1000个数据?
我可以加你QQ或微信吗?
 楼主| YEYEYElxj 发表于 2017-8-1 10:17 | 显示全部楼层
fzyuan 发表于 2017-8-1 10:10
然后你测电池电压的时候是用手搭牢的?

之前是用手搭的,现在换成面包板,然后连起来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yklstudent 发表于 2017-8-1 12:47 | 显示全部楼层
楼主就没有示波器吗?
 楼主| YEYEYElxj 发表于 2017-8-1 13:39 | 显示全部楼层
yklstudent 发表于 2017-8-1 12:47
楼主就没有示波器吗?

有啊,示波器怎么观察精度呢?
XZL 发表于 2017-8-1 14:08 | 显示全部楼层
MCU的供电是分数字和模拟的,要对模拟部分进行处理(电源和地线),与数字电源分开,防止干扰
 楼主| YEYEYElxj 发表于 2017-8-1 14:20 | 显示全部楼层
XZL 发表于 2017-8-1 14:08
MCU的供电是分数字和模拟的,要对模拟部分进行处理(电源和地线),与数字电源分开,防止干扰 ...

怎么处理呢?
皈依 发表于 2017-8-1 15:33 | 显示全部楼层
ADC采样不仅要硬件滤波 还要搭配软件滤波
丁弋宇 发表于 2017-8-1 22:51 | 显示全部楼层
不想回帖。。。
 楼主| YEYEYElxj 发表于 2017-8-2 09:08 | 显示全部楼层

不会就别给自己加戏。

评论

新手总是很吊...  发表于 2017-8-2 10:12
潜力变魅力 发表于 2017-8-2 09:19 | 显示全部楼层
我正好在做这个,我可以给楼主参考程序,非常稳定,在3V以下跟标准万用表比较大概10mv以下的误差!!!
潜力变魅力 发表于 2017-8-2 09:20 | 显示全部楼层
/**********************************************************
* º¯Êý¹¦ÄÜ:void  Adc_Init(void)
* Èë¿Ú²ÎÊý:               
* ·µ»ØÊýÖµ:
* ¹¦ÄÜ˵Ã÷:
**********************************************************/                                                                                                                                  
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);   //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M

        //PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //Ä£ÄâÊäÈëÒý½Å
        GPIO_Init(GPIOB, &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_Cmd(ADC1, ENABLE);        //ʹÄÜÖ¸¶¨µÄADC1
       
        ADC_ResetCalibration(ADC1);        //ʹÄܸ´Î»Ð£×¼  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //µÈ´ý¸´Î»Ð£×¼½áÊø
       
        ADC_StartCalibration(ADC1);         //¿ªÆôADУ׼

        while(ADC_GetCalibrationStatus(ADC1));         //µÈ´ýУ׼½áÊø

}                                  
/**********************************************************
* º¯Êý¹¦ÄÜ:u16 Get_Adc(void)  
* Èë¿Ú²ÎÊý:               
* ·µ»ØÊýÖµ:
* ¹¦ÄÜ˵Ã÷:
**********************************************************/
u16 Get_Adc(void)   
{
          //ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
        ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_55Cycles5 );        //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ55.5ÖÜÆÚ                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø

        return ADC_GetConversionValue(ADC1);        //·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
/**********************************************************
* º¯Êý¹¦ÄÜ: u16 Get_Adc_Average(u8 times)
* Èë¿Ú²ÎÊý:               
* ·µ»ØÊýÖµ:
* ¹¦ÄÜ˵Ã÷:
**********************************************************/
u16 Get_Adc_Average(void)
{
        u32 temp_val=0,temp1=0,ResultVolt=0;
        u8 t;
        for(t=0;t<50;t++)
        {       
                temp1=Get_Adc();
                temp_val+=temp1;
        }
        ResultVolt=temp_val/50;
        ResultVolt=(ResultVolt*3200) >>12;
        if(ResultVolt>=3190)
        {
                ResultVolt=3190;
          over_range_flag=TRUE;
        }
        return ResultVolt ;
}
基于各种原因,我只给楼主提供ADC部分以供参考
 楼主| YEYEYElxj 发表于 2017-8-2 09:35 | 显示全部楼层
潜力变魅力 发表于 2017-8-2 09:20
/**********************************************************
* º¯Êý¹¦ÄÜ:void  Adc_Init(void)
...

好的,谢谢分享
潜力变魅力 发表于 2017-8-2 09:39 | 显示全部楼层

如果不行,你可以把你的电路贴出来,我帮你看看!!
 楼主| YEYEYElxj 发表于 2017-8-2 09:56 | 显示全部楼层
潜力变魅力 发表于 2017-8-2 09:20
/**********************************************************
* º¯Êý¹¦ÄÜ:void  Adc_Init(void)
...

这个函数我放进去编译有错误。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| YEYEYElxj 发表于 2017-8-2 09:58 | 显示全部楼层
潜力变魅力 发表于 2017-8-2 09:39
如果不行,你可以把你的电路贴出来,我帮你看看!!

这个是我的电路

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
潜力变魅力 发表于 2017-8-2 10:00 | 显示全部楼层
YEYEYElxj 发表于 2017-8-2 09:56
这个函数我放进去编译有错误。

一看你就是新手,有这样放函数的吗,至少也得放到main函数上面吧
潜力变魅力 发表于 2017-8-2 10:01 | 显示全部楼层

你是直接供电,还是测量电池电压?
 楼主| YEYEYElxj 发表于 2017-8-2 10:02 | 显示全部楼层
潜力变魅力 发表于 2017-8-2 10:00
一看你就是新手,有这样放函数的吗,至少也得放到main函数上面吧

我是放在MAIN函数里面的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

这个函数放得也是醉了。楼主不如把main.c贴出来,大家给参谋参谋  发表于 2017-8-3 09:52
 楼主| YEYEYElxj 发表于 2017-8-2 10:03 | 显示全部楼层
潜力变魅力 发表于 2017-8-2 10:01
你是直接供电,还是测量电池电压?

我是测量电池电压,供电是通过仿真器来供电的,之前试过外部供电,但是板子就不能跟电脑连接了
潜力变魅力 发表于 2017-8-2 10:12 | 显示全部楼层
YEYEYElxj 发表于 2017-8-2 10:02
我是放在MAIN函数里面的

放到main函数外面去
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部