查看: 3068|回复: 2

[每日一帖]STM32 ADC采样数据第一次出错~~~~~~~

[复制链接]
  • TA的每日心情
    无聊
    2020-7-7 14:50
  • 签到天数: 284 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2016-8-18 08:54:21 | 显示全部楼层 |阅读模式
    分享到:
    STM32F103ZET6芯片,采集6个通道的数据,每次复位后第一次采集的数据中有3个通道的数据出错,数据特别大,其它3个通道的数据正常,什么原因呢?
    ADC初始化代码如下:

    void Adc_Init(void)
    {
            //先初始化IO口
            RCC->APB2ENR        |= 1 << 4;        //使能PORTC口时钟
           
            GPIOC->CRL        &= 0xFFFF0000;        //PC0-3 模拟输入模式

            RCC->APB2ENR        |= 1 << 9;        //ADC1时钟使能

            RCC->APB2RSTR        |= 1 << 9;        //ADC1复位
            RCC->APB2RSTR        &= ~(1 << 9);        //复位结束

            //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
            //否则将导致ADC准确度下降!
            RCC->CFGR        &= ~(3 << 14);
            RCC->CFGR        |= 2 << 14;        //bit14-15ADCPRE ADC预分频 0-2分频 1-4分频 2-6分频 3-8分频

            ADC1->CR1        &= 0xF0FFFF;        //工作模式清零
            ADC1->CR1        |= 0 << 16;        //bit16-19 0000-独立工作模式

            ADC1->CR1        &= ~(1 << 8);        //bit8-SCAN 0-关闭扫描模式 1-使用扫描模式

            ADC1->CR2        &= ~(1 << 1);        //bit1-CONT 0-单次转换模式 1-连续转换模式

            ADC1->CR2        &= ~(7 << 17);
            ADC1->CR2        |= 7 << 17;        //bit17-19 111-软件控制转换

            ADC1->CR2        |= 1 << 20;        //bit20-EXTTRIG 1-使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
            ADC1->CR2        &= ~(1 << 11);        //bit11-ALIGN 0-右对齐 1-左对齐

            ADC1->CR2        |= 1 << 23;        //bit23-TSVREFE 温度传感器和VREFINT使能 0-禁止 1-启用

            ADC1->SQR1        &= ~(0xF << 20);
            ADC1->SQR1        |= 0 << 20;        //bit20-23规则通道序列长度 0:1个转换在规则序列中 也就是只转换规则序列1

            //设置采样时间
            ADC1->SMPR1        = (        (7 << (3 * 0)) |         //通道10 239.5周期,提高采样时间可以提高精确度
                                    (7 << (3 * 1)) |         //通道11 239.5周期,提高采样时间可以提高精确度
                                    (7 << (3 * 2)) |         //通道12 239.5周期,提高采样时间可以提高精确度
                                    (7 << (3 * 3)) |         //通道13 239.5周期,提高采样时间可以提高精确度
                                    (7 << (3 * 6)) |         //通道16 239.5周期,提高采样时间可以提高精确度
                                    (7 << (3 * 7)));        //通道17 239.5周期,提高采样时间可以提高精确度

            ADC1->CR2        |= 1 << 0;        //bit0-ADON 开启AD转换器

            ADC1->CR2        |= 1 << 3;        //bit3-RSTCAL 使能复位校准
            while(ADC1->CR2 & (1 << 3));        //等待校准结束(该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除)

            ADC1->CR2        |= 1 << 2;        //bit2-CAL 开启AD校准
            while(ADC1->CR2 & (1 << 2));        //等待校准结束(该位由软件设置以开始校准,并在校准结束时由硬件清除)
    }

    回复

    使用道具 举报

  • TA的每日心情

    2020-7-12 13:36
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-8-19 11:59:51 | 显示全部楼层
    貌似手册里有说需要等一段时间让ADC初始化稳定的吧!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2020-7-7 14:50
  • 签到天数: 284 天

    连续签到: 1 天

    [LV.8]以坛为家I

     楼主| 发表于 2016-8-19 13:38:32 | 显示全部楼层
    liang118038 发表于 2016-8-19 11:59
    貌似手册里有说需要等一段时间让ADC初始化稳定的吧!

    试过  等一段时间(1分钟以上) 还是一样的....
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 01:06 , Processed in 0.120549 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.