查看: 132|回复: 2

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

[复制链接]

26

主题

3

好友

1412

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 106 天

    [LV.6]常住居民II

    发表于 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));        //等待校准结束(该位由软件设置以开始校准,并在校准结束时由硬件清除)
    }

    XinChao
    回复

    使用道具 举报

    0

    主题

    0

    好友

    54

    积分

    童生

    Rank: 2

    该用户从未签到

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

    使用道具 举报

    26

    主题

    3

    好友

    1412

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 106 天

    [LV.6]常住居民II

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

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

    使用道具 举报

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

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-4 12:00 , Processed in 0.172069 second(s), 10 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部