打印

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

[复制链接]
楼主: YEYEYElxj
手机看帖
扫描二维码
随时随地手机跟帖
21
YEYEYElxj|  楼主 | 2017-8-1 10:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
fzyuan 发表于 2017-8-1 10:08
采样率不可能是12MHz的,你说的12MHz也许是ADC的时钟,结合你前面的参数,你的采样率可能是47.619ksps。
...

是的,我是ADC时钟是12MHz的,这1000个数据是存在哪里了?那我从哪里调出这1000个数据?
我可以加你QQ或微信吗?

使用特权

评论回复
22
YEYEYElxj|  楼主 | 2017-8-1 10:17 | 只看该作者
fzyuan 发表于 2017-8-1 10:10
然后你测电池电压的时候是用手搭牢的?

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

6$Y%8NOUZU[4_J`H55))O$U.png (229.59 KB )

6$Y%8NOUZU[4_J`H55))O$U.png

使用特权

评论回复
23
yklstudent| | 2017-8-1 12:47 | 只看该作者
楼主就没有示波器吗?

使用特权

评论回复
24
YEYEYElxj|  楼主 | 2017-8-1 13:39 | 只看该作者
yklstudent 发表于 2017-8-1 12:47
楼主就没有示波器吗?

有啊,示波器怎么观察精度呢?

使用特权

评论回复
25
XZL| | 2017-8-1 14:08 | 只看该作者
MCU的供电是分数字和模拟的,要对模拟部分进行处理(电源和地线),与数字电源分开,防止干扰

使用特权

评论回复
26
YEYEYElxj|  楼主 | 2017-8-1 14:20 | 只看该作者
XZL 发表于 2017-8-1 14:08
MCU的供电是分数字和模拟的,要对模拟部分进行处理(电源和地线),与数字电源分开,防止干扰 ...

怎么处理呢?

使用特权

评论回复
27
皈依| | 2017-8-1 15:33 | 只看该作者
ADC采样不仅要硬件滤波 还要搭配软件滤波

使用特权

评论回复
28
丁弋宇| | 2017-8-1 22:51 | 只看该作者
不想回帖。。。

使用特权

评论回复
29
YEYEYElxj|  楼主 | 2017-8-2 09:08 | 只看该作者

不会就别给自己加戏。

使用特权

评论回复
评论
icecut 2017-8-2 10:12 回复TA
新手总是很吊... 
30
潜力变魅力| | 2017-8-2 09:19 | 只看该作者
我正好在做这个,我可以给楼主参考程序,非常稳定,在3V以下跟标准万用表比较大概10mv以下的误差!!!

使用特权

评论回复
31
潜力变魅力| | 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部分以供参考

使用特权

评论回复
32
YEYEYElxj|  楼主 | 2017-8-2 09:35 | 只看该作者
潜力变魅力 发表于 2017-8-2 09:20
/**********************************************************
* º¯Êý¹¦ÄÜ:void  Adc_Init(void)
...

好的,谢谢分享

使用特权

评论回复
33
潜力变魅力| | 2017-8-2 09:39 | 只看该作者

如果不行,你可以把你的电路贴出来,我帮你看看!!

使用特权

评论回复
34
YEYEYElxj|  楼主 | 2017-8-2 09:56 | 只看该作者
潜力变魅力 发表于 2017-8-2 09:20
/**********************************************************
* º¯Êý¹¦ÄÜ:void  Adc_Init(void)
...

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

11.png (325.01 KB )

11.png

使用特权

评论回复
35
YEYEYElxj|  楼主 | 2017-8-2 09:58 | 只看该作者
潜力变魅力 发表于 2017-8-2 09:39
如果不行,你可以把你的电路贴出来,我帮你看看!!

这个是我的电路

22.png (172.28 KB )

22.png

使用特权

评论回复
36
潜力变魅力| | 2017-8-2 10:00 | 只看该作者
YEYEYElxj 发表于 2017-8-2 09:56
这个函数我放进去编译有错误。

一看你就是新手,有这样放函数的吗,至少也得放到main函数上面吧

使用特权

评论回复
37
潜力变魅力| | 2017-8-2 10:01 | 只看该作者

你是直接供电,还是测量电池电压?

使用特权

评论回复
38
YEYEYElxj|  楼主 | 2017-8-2 10:02 | 只看该作者
潜力变魅力 发表于 2017-8-2 10:00
一看你就是新手,有这样放函数的吗,至少也得放到main函数上面吧

我是放在MAIN函数里面的

33.png (291.93 KB )

33.png

使用特权

评论回复
评论
pkuzhx 2017-8-3 09:52 回复TA
这个函数放得也是醉了。楼主不如把main.c贴出来,大家给参谋参谋 
39
YEYEYElxj|  楼主 | 2017-8-2 10:03 | 只看该作者
潜力变魅力 发表于 2017-8-2 10:01
你是直接供电,还是测量电池电压?

我是测量电池电压,供电是通过仿真器来供电的,之前试过外部供电,但是板子就不能跟电脑连接了

使用特权

评论回复
40
潜力变魅力| | 2017-8-2 10:12 | 只看该作者
YEYEYElxj 发表于 2017-8-2 10:02
我是放在MAIN函数里面的

放到main函数外面去

使用特权

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

本版积分规则