打印
[STM32F7]

ADC采样严重不准的问题

[复制链接]
7092|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cjy_JDxy|  楼主 | 2018-10-18 17:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我写了一个STM32F767AD采样的程序。
我测了一下,AD口(PF4)那儿只有0.几V,可是采样值很大0x3c8,0x3cb。
程序如下:
int main(void)
{
        u8 i;

        float temp;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
        uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED

    SDRAM_Init();                   //初始化SDRAM

    MY_ADC_Init();                  //初始化ADC1通道5

                
    while(1)
        {
        adcx=Get_Adc_Average(ADC_CHANNEL_14,20);//获取通道5的转换值,20次取平均
                i=8;
                delay_ms(5);
        }
}


以上是主程序。
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;            //PA5
    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;
}

以上是AD程序。

请大神给我看看,哪儿有问题?谢谢!

沙发
734774645| | 2018-10-18 21:19 | 只看该作者
这要看参考电压是多少,你从0到VCC变化,看看数据怎么变。

使用特权

评论回复
板凳
airwill| | 2018-10-19 18:15 | 只看该作者
应该不至于这么差,除了基准要检查,硬件也查一下,端口并个电容试试

使用特权

评论回复
地板
xiaoqizi| | 2018-10-22 15:57 | 只看该作者
楼主硬件怎么连接的 给个电路图瞅瞅

使用特权

评论回复
5
Cjy_JDxy|  楼主 | 2018-10-22 17:09 | 只看该作者
xiaoqizi 发表于 2018-10-22 15:57
楼主硬件怎么连接的 给个电路图瞅瞅

后来,算了算,0.7,0.8V也差不多那个值,12位AD

使用特权

评论回复
6
yiyigirl2014| | 2018-10-22 19:01 | 只看该作者
用个电位器,连续变化,看测量结果在什么范围内变。

使用特权

评论回复
7
zhuomuniao110| | 2018-10-23 10:35 | 只看该作者
最好做个电位器,能从0到VCC,然后变化起来看看测的结果怎么变。

使用特权

评论回复
8
磨砂| | 2018-10-23 11:39 | 只看该作者
采样前校准了吗

使用特权

评论回复
9
wakayi| | 2018-10-23 12:58 | 只看该作者
是不是寄存器读错了

使用特权

评论回复
10
xiaoqizi| | 2018-10-23 13:02 | 只看该作者
Cjy_JDxy 发表于 2018-10-22 17:09
后来,算了算,0.7,0.8V也差不多那个值,12位AD

那就是说没啥问题啦

使用特权

评论回复
11
Cjy_JDxy|  楼主 | 2018-10-23 13:02 | 只看该作者
wakayi 发表于 2018-10-23 12:58
是不是寄存器读错了

没有读错

使用特权

评论回复
12
CaLipton| | 2018-10-23 20:36 | 只看该作者
周围有强磁场干扰没有?

使用特权

评论回复
13
caijie001| | 2018-10-23 23:48 | 只看该作者
不可能吧,,是你搞错了吧

使用特权

评论回复
14
Cjy_JDxy|  楼主 | 2018-10-24 08:21 | 只看该作者
CaLipton 发表于 2018-10-23 20:36
周围有强磁场干扰没有?

没有

使用特权

评论回复
15
Varus| | 2018-10-27 20:56 | 只看该作者
获取指定通道的转换值,取times次,然后平均

使用特权

评论回复
16
peterlifan| | 2018-10-27 22:03 | 只看该作者
很有可能是你板子上测试ad的端口没有阻抗匹配 st mcu的ad口手册上写的应该小于50kΩ 你看一下是否外部阻抗大于这个值

使用特权

评论回复
17
stm32jy| | 2018-10-27 23:54 | 只看该作者
看下芯片的模拟地,是如何接的

使用特权

评论回复
18
stm32jy| | 2018-10-27 23:54 | 只看该作者
有时候ADC 的值不准确跟模拟地有一些关系

使用特权

评论回复
19
yzzly| | 2018-10-28 07:30 | 只看该作者
Stm32芯片的ADC还是相当不错的,103VE做的产品大批量应用,没有因测量精度问题烦恼过,0.5%很容易做到

使用特权

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

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝