zoukankan      html  css  js  c++  java
  • stm32之ADC(规则通道)

    1.ADC是12位的一种逐次型模拟数字转换器,所以进行存储时只能存储在16位数据寄存器中,不能低于12位。其中有16个外部信号源(ADCx_IN0--ADCx_IN15)和2个内部信号源(温度传感器、)

    2.ADC时钟--由时钟控制器提供的ADCCLK时钟(RCC_CFGR寄存器设置ADC时钟分频)和PCLK2(APB2时钟)同步 。

    3.每个通道可以分别用不同的时间采样。

      总转换时间如下计算:
      TCONV = 采样时间+ 12.5个周期
      当ADCCLK=14MHz,采样时间为1.5周期    TCONV = 1.5 + 12.5 = 14周期 = 1μs 

    4.转换可以由外部事件触发(例如定时器捕获, EXTI线)。 如果设置了EXTTRIG控制位, 则外部事件就能够触发转换。 

    5.ADC寄存器

      (1)ADC_CR2 控制寄存器

    23
    22
    20
    TSVREFE: 温度传感器和VREFINT使能
    SWSTART: 开始转换规则通道
    EXTTRIG: 规则通道的外部触发转换模式
    19:17                                                   EXTSEL[2:0]: 选择启动规则通道组转换的外部事件
    11
    3
    2
    1
    0
    ALIGN: 数据对齐
    RSTCAL: 复位校准 (Reset calibration)
    CALA/D校准 (A/D Calibration)
    CONT: 连续转换
    ADON: 开/A/D转换器

      (2)采样时间寄存器 ADC_SMPRx --1,2分别是通道1和通道2的。

     

     

       (3)ADC规则序列寄存器ADC_SQRx--查找数据手册:进行设置通道转换数目:ADC_SQR1的位23:20位,进行设置进行转换顺序即第几个转换:ADC_SQR1-ADC_SQR3。  

    L[3:0]:规则通道序列长度 (Regular channel sequence length)
    这些位由软件定义在规则通道转换序列中的通道数目。
    00001个转换
    00012个转换
    ……
    111116个转换

    6.ADC的一般配置过程:
      1) 开启 PA 口时钟, 设置 PA3为模拟输入。
    STM32F103R8T6 ADC1 通道 3 PA3 上, 所以, 我们先要使能 PORTA 的时钟, 然
    后设置 PA3 为模拟输入。
      2) 使能 ADC1 时钟, 并设置分频因子。
    通过 RCC CFGR 寄存器设置 ADC1 的分频因子。 分频因子要确保 ADC1 的时钟(
    ADCCLK) 不要超过 14Mhz

           (1)RCC->APB2ENR    (2)RCC->CFGR 

      3) 设置 ADC1 的工作模式。
    设置独立模式、 关闭扫描( 使用扫描) 、 单次( 连续) 转换模式、 数据对齐方式
    ( 左对齐) 、 触发方式选择( 外部触发-软件触发) 等都在这一步实现。

            ADCx->CR1和ADCx->CR2
      4) 设置 ADC1 规则序列的相关信息。
    我们这里只有一个通道, 所以设置规则序列中通道数为 1:ADC1->SQR1 设置规则序列转换顺序:ADCx->SQRx

    //*******-3个通道,转换3个
    ADC1->SQR1 |=(2<<20);
    //*******IN3通道3放在规则组中第一个转换,2--2,1--3
    ADC1->SQR3 |=(3<<0);//3--通道编号
    ADC1->SQR3 |=(2<<5);//2--通道编号
    ADC1->SQR3 |=(1<<10);//1--通道编号

     然后设置 ADC1 通道 3的采样周期:ADCx->SMPRx
      5) 开启 AD 转换器, 校准。
    开启 AD 转换器, 复位校准, 等待复位结束, 开启校准, 等待校准结束( 通过
    ADC_CR2 寄存器控制) 。:ADCx->CR2

    //复位校准
    ADC1->CR2 |=(1<<3);
    //等待校准寄存器被初始化
    while(ADC1->CR2 &(1<<3));//初始化校准完成,自动为0,退出whiile
    //A/D校准
    ADC1->CR2 |=(1<<2);
    //等待校准完成
    while(ADC1->CR2&(1<<2));

      6) 读取 ADC 值。
    启动ADC 转换:ADC1->CR2 |=(1<<22) 在转换结束后, 读取 ADC1_DR 里面的值就是了

    void GZ_ADCValue(void)
    {
    #if reg_progream
    u16 gz_value;//光照的值
    //启动规则通道转换
    ADC1->CR2 |=(1<<22);
    //等待转换完成
    while((ADC1->SR &(1<<1))==0);
    gz_value=ADC1->DR;
    printf("gz_value=%d ",gz_value);

    }

     

  • 相关阅读:
    BWList of logged on users in the Portal
    BASIS About Profile
    B/S C/S 打印
    程序员得学习观各种好书推荐
    ORACLE面试测试题目
    oracle经典20题(参考答案)
    程序员得学习观各种好书推荐
    Oracle笔试题
    Oracle笔试题
    Oracle里面常用的数据字典有哪些?
  • 原文地址:https://www.cnblogs.com/juan-4-14/p/12733940.html
Copyright © 2011-2022 走看看