打印
[STM32F7]

AD采样值波动大

[复制链接]
1394|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuzaiy|  楼主 | 2020-10-11 18:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片是STM32F767
用万用表测,AD值比较稳定,基本不变。
可是AD采样值变化比较大,以下是采样的10个数,电压值一样。
1941 1928 1930 1933 1952 1967 1963 1955 1958 1959

使用特权

评论回复
沙发
zhuww| | 2020-10-11 18:40 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
liuzaiy|  楼主 | 2020-10-11 18:44 | 只看该作者
程序如下:
j++;
                if(j>=170000)
                {
                        j=0;
                        adcx=Get_Adc_Average(ADC_CHANNEL_14,20);//获取通道5的转换值,20次取平均  PF4
                        adcy=Get_Adc_Average(ADC_CHANNEL_9,20);//获取通道5的转换值,20次取平均   PF3
                        tcp_demo_sendbuf1[0]=0x33;
                        tcp_demo_sendbuf1[1]=adcy/10000+0x30;
                        tcp_demo_sendbuf1[2]=adcy%10000/1000+0x30;
                        tcp_demo_sendbuf1[3]=adcy%1000/100+0x30;
                        tcp_demo_sendbuf1[4]=adcy%100/10+0x30;
                        tcp_demo_sendbuf1[5]=adcy%10+0x30;
                        udp_demo_senddata(udppcb);
                }

#include "adc.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F7开发板
//ADC驱动代码           
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/26
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////         

ADC_HandleTypeDef ADC3_Handler;//ADC句柄

//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{
    ADC3_Handler.Instance=ADC3;
    ADC3_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=108/4=27MHZ
    ADC3_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC3_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC3_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
    ADC3_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC3_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
    ADC3_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC3_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC3_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC3_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC3_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC3_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC3_Handler);                                 //初始化
}

//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC3_CLK_ENABLE();            //使能ADC1时钟
    __HAL_RCC_GPIOF_CLK_ENABLE();                        //开启GPIOA时钟
        
    GPIO_Initure.Pin=GPIO_PIN_4;            //PF4
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
        
        GPIO_Initure.Pin=GPIO_PIN_3;            //PF3
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOF,&GPIO_Initure);
}

//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc(u32 ch)   
{
    ADC_ChannelConfTypeDef ADC3_ChanConf;

    ADC3_ChanConf.Channel=ch;                                   //通道
    ADC3_ChanConf.Rank=1;                                       //1个序列
    ADC3_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC3_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC3_Handler,&ADC3_ChanConf);        //通道配置
        
    HAL_ADC_Start(&ADC3_Handler);                               //开启ADC
        
    HAL_ADC_PollForConversion(&ADC3_Handler,10);                //轮询转换

        return (u16)HAL_ADC_GetValue(&ADC3_Handler);                    //返回最近一次ADC1规则组的转换结果
}
//获取指定通道的转换值,取times次,然后平均
//times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u32 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}

20次取平均。

使用特权

评论回复
地板
songqian17| | 2020-10-11 18:47 | 只看该作者
使用ADC时,ADC初始化后,运行一下ADC自校准

使用特权

评论回复
5
liuzaiy|  楼主 | 2020-10-11 18:53 | 只看该作者

谢谢!我在 stm32f7xx_hal_adc.c
stm32f7xx_hal_adc_ex.c没找到这个函数

使用特权

评论回复
6
supernan| | 2020-10-11 18:57 | 只看该作者
都甩了HAL库,就用HAL库直接生成啊;

使用特权

评论回复
7
liuzaiy|  楼主 | 2020-10-11 19:01 | 只看该作者
我不会生成,HAL的那些程序都是在开发板程序的基础上改的

使用特权

评论回复
8
morrisk| | 2020-10-11 19:04 | 只看该作者
那赶紧学学HAL吧。

使用特权

评论回复
9
guoyt| | 2020-10-11 19:10 | 只看该作者
配置可以自动生成,图形化勾勾选选就行了。

使用特权

评论回复
10
liuzaiy|  楼主 | 2020-10-11 19:13 | 只看该作者
谢谢!学HAL需要什么软件吗?我是菜鸟,请多指教

使用特权

评论回复
11
zhanglli| | 2020-10-11 19:16 | 只看该作者
下载STM32 cubeMX

使用特权

评论回复
12
wenfen| | 2020-10-11 19:20 | 只看该作者
这个值应该可以接受啊

使用特权

评论回复
13
liuzaiy|  楼主 | 2020-10-11 19:42 | 只看该作者

其实还是不大明白,我再琢磨琢磨吧,多谢了哈先

使用特权

评论回复
14
香水城| | 2020-10-11 21:25 | 只看该作者
ADC启用前记得做下校准

注意输入阻抗不要太大,采用时间可以调大点

再就是供电尽量稳定、干净

使用特权

评论回复
15
小明的同学| | 2020-10-11 21:55 | 只看该作者
采样间隔大一点。

使用特权

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

本版积分规则

735

主题

7546

帖子

2

粉丝