OpenEdv-开源电子网

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

关于ADC采样电压与实际测量值有偏差的问题

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2021-4-12
在线时间
16 小时
发表于 2021-7-15 18:41:09 | 显示全部楼层 |阅读模式
1金钱
使用的STM32C8T6,PA1采样电压值,与实际输入电压值相差0.5v

ADC头文件
void ADCx_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量       
        ADC_InitTypeDef       ADC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        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;//1个转换在规则序列中 也就是只转换规则序列1
        ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
       
        ADC_Cmd(ADC1, ENABLE);//开启AD转换器
       
        ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
       
        ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
        while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

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

/*******************************************************************************
* 函 数 名         : Get_ADC_Value
* 函数功能                   : 获取通道ch的转换值,取times次,然后平均        
* 输    入         : ch:通道编号
                                         times:获取次数
* 输    出         : 通道ch的times次转换结果平均值
*******************************************************************************/
u16 Get_ADC_Value(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        //设置指定ADC的规则组通道,一个序列,采样时间
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                            
       
        for(t=0;t<times;t++)
        {
                ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能       
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
                temp_val+=ADC_GetConversionValue(ADC1);
                delay_ms(5);
        }
        return temp_val/times;
}



printf到串口:


        value=Get_ADC_Value(ADC_Channel_1,20);
        printf("检测AD值为:%d\r\n",value);
        vol=(float)value*(3.3/4096);
        printf("检测电压值为:%.2fV\r\n",vol);
        temp = (u8)100*(vol - 0.5);
        printf("检测温度值为:%d\r\n",temp);
        delay_ms(1000);

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

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2021-6-12
在线时间
9 小时
发表于 2021-7-17 15:23:19 | 显示全部楼层
我也有这个问题,用电压表测DAC的电压总是测出来是设定值的0.8倍,但是用ADC去测每次都和设定值差不多,不知道什么原因
回复

使用道具 举报

0

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2020-4-2
在线时间
35 小时
发表于 2021-7-20 13:44:45 | 显示全部楼层
出现偶发值首先电路,固定值查软件和电路,还有测量方法
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 06:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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