OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3962|回复: 11

STM32F103C8T6 ADC采样问题

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
发表于 2019-10-22 15:42:45 | 显示全部楼层 |阅读模式
1金钱
请问下,我用PB0口进行采样,仿真时,采样数据慢慢变大后再慢慢减小,随后又慢慢变大,反复循环,无法测的真实数据,请问下,是什么原因导致的??谢谢~

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2019-7-25
在线时间
57 小时
发表于 2019-10-22 17:00:52 | 显示全部楼层
----------------肉粒多真好吃呀
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2018-1-22
在线时间
7 小时
发表于 2019-10-22 17:32:30 | 显示全部楼层
把代码发上来看看。
stm32f103资料
硬氪网
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
 楼主| 发表于 2019-10-22 17:47:10 | 显示全部楼层
#include "adc.h"
void GPIOINIT_ADC()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

}
void RCCINIT_ADC()
{
        SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M  最大14M 设置ADC时钟(ADCCLK)
}
void ADCINIT_ADC()
{
        ADC_InitTypeDef ADC_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的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);
       
        ADC_Cmd(ADC1,ENABLE);       

        ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
       
        ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
        while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能


}




#include "systick.h"
#include "printf.h"
#include "adc.h"
double ad1;
int main()
{
        u32 ad=0;
        u8 i;
        RCCINIT_PRINTF();           //初始化printf的系统时钟
        RCCINIT_ADC();                        //初始化ADC的系统时钟
        GPIOINIT_ADC();                        //初始化ADC的端口配置
        GPIOINIT_PRINTF();               
        USARTINIT_PRINTF();                //printf串口的初始化配置
        NVICINIT_PRINTF();                 //printf中断模式的初始化配置
        ADCINIT_ADC();                                                                                                             
        while(1)
        {
                ad=0;
                for(i=0;i<50;i++)//读取50次的AD数值取其平均数较为准确       
                {
                        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
                        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
                        ad=ad+ADC_GetConversionValue(ADC1);//返回最近一次ADCx规则组的转换结果               
                }
                ad1=(ad/50)*3.304/4096;

        //        printf("ad=%f\n",ad*3.3/4096);
                delay_ms(1000);               
        }               
}
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
 楼主| 发表于 2019-10-22 18:09:13 | 显示全部楼层
gk18965 发表于 2019-10-22 17:32
把代码发上来看看。

#include "adc.h"
void GPIOINIT_ADC()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

}
void RCCINIT_ADC()
{
        SystemInit();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M  最大14M 设置ADC时钟(ADCCLK)
}
void ADCINIT_ADC()
{
        ADC_InitTypeDef ADC_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的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);
        
        ADC_Cmd(ADC1,ENABLE);        

        ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
        
        ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
        while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能


}




#include "systick.h"
#include "printf.h"
#include "adc.h"
double ad1;
int main()
{
        u32 ad=0;
        u8 i;
        RCCINIT_PRINTF();           //初始化printf的系统时钟
        RCCINIT_ADC();                        //初始化ADC的系统时钟
        GPIOINIT_ADC();                        //初始化ADC的端口配置
        GPIOINIT_PRINTF();               
        USARTINIT_PRINTF();                //printf串口的初始化配置
        NVICINIT_PRINTF();                 //printf中断模式的初始化配置
        ADCINIT_ADC();                                                                                                            
        while(1)
        {
                ad=0;
                for(i=0;i<50;i++)//读取50次的AD数值取其平均数较为准确        
                {
                        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
                        while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
                        ad=ad+ADC_GetConversionValue(ADC1);//返回最近一次ADCx规则组的转换结果               
                }
                ad1=(ad/50)*3.304/4096;

        //        printf("ad=%f\n",ad*3.3/4096);
                delay_ms(1000);               
        }               
}
回复

使用道具 举报

0

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2018-1-22
在线时间
7 小时
发表于 2019-10-22 18:24:16 | 显示全部楼层
莫负韶 发表于 2019-10-22 18:09
#include "adc.h"
void GPIOINIT_ADC()
{

0.0看了 没发现问题啊。。。坐等大神解答
stm32f103资料
硬氪网
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
 楼主| 发表于 2019-10-22 21:01:58 | 显示全部楼层

file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\944510297\QQ\WinTemp\RichOle\YIO}T3`3)O)GP35OTC}I{AH.png

回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
 楼主| 发表于 2019-10-22 21:04:02 | 显示全部楼层

QQ图片20191022210054.png
回复

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2019-4-19
在线时间
13 小时
 楼主| 发表于 2019-10-22 21:05:25 | 显示全部楼层

QQ图片20191022210441.png
回复

使用道具 举报

10

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2019-9-5
在线时间
134 小时
发表于 2019-10-23 00:31:56 | 显示全部楼层
普通接地和模拟接地分开了吗
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-5-18
在线时间
1 小时
发表于 2019-10-23 09:28:35 | 显示全部楼层
采样的是个什么
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-12-11
在线时间
7 小时
发表于 2020-4-29 10:06:27 | 显示全部楼层
直接接PB0进行采样,需要在中间加电容吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 22:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表