zoukankan      html  css  js  c++  java
  • ADC

    简介:

    • 扫描:一次转换中可包含多个通道(信号),一个一个地转换,可设置转换顺序。最多达18个通道包括16个外部和2个内部(温度,电源)【规则组最多16个转换通道;注入组最多4个转换通道】(温度传感器和电源电压传感器只能出现在主ADC1中,注意打开连接通道):每个通道对应指定的引脚(查表)
    • 模式:单次、循环 ...
    • 时钟&速度:输入时钟不得超过14MHz,来自于PCLK2(APB2时钟)的分频,每个通道的最快转换时间为1us
    • 分组:
      • 规则组(类似main):多个通道共用一个结果寄存器
      • 注入组(类似中断):共有4个结果寄存器对应4个通道
    • 触发:
      • 规则组:软件或外部
      • 注入组:外部
    • 中断:规则组某通道转换完成,EOC置位(ADC1和ADC2的中断映射在同一个中断向量上,而ADC3的中断有自己的中断向量。)
    • 精度:12位分辨率
    • 输入范围:VREF- ≤ VIN ≤ VREF
    • 转换结果在寄存器中可设置为左对齐或右对齐
    • 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
    • DMA:只有ADC1和ADC3的规则组拥有DMA功能

    • 如果ADC_SQRx或ADC_JSQR(保存着规则组和注入组的需转换通道和它们的转换顺序)寄存器在转换期间被更改,当前的转换被清除,一个新的启动脉
      冲将发送到ADC以转换新选择的组。

    • ADC何时进行转换:
      • 设置ADON位(只适用于规则通道)

      • 外部触发启动(适用于规则通道或注入通道),EXTI只能上升沿

    转换模式(CONT位):单次/连续

    • EOC/JEOC信号何时产生/清除:
      • 产生:某一个通道转换成功
      • 清除:由软件清除或由读取ADC_DR时清除
    • 中断信号何时产生:
      • EOCIE+信号
    • 什么叫扫描模式:(SCAN位)
      • 一个ADC一次转换多个通道
    • 校准:
      • 建议在每次上电后执行一次校准
      • 启动校准前,ADC必须处于关电状态(ADON=’0’)超过至少两个ADC时钟周期
      • 校准阶段结束后,校准码储存在ADC_DR中
      • 一旦校准结束,CAL位被硬件复位
    • 采样时间设置:

      • 每个通道可以分别用不同的时间采样
      • 和ADC时钟共同决定转换快慢(TCONV = 采样时间+ 12.5个周期)
    • 合作:
      • ADC们:多个ADC同时工作时,可以设置合作模式(设置为独立模式则互不合作)
      • 规则/注入:关键在于如何管理注入组<手册11.3.9 注入通道管理>
        • 注入组由触发启动
        • 注入组在规则组通道之后自动启动
      • 通道们:
        • 把通道们分成多个小组,一次触发转一组,一组一组来 135 246 125 246...(规则/注入都可以这么设置)

    配置:

    1. 时钟:
      1. 时钟使能    RCC_APB2PeriphClockCmd
      2. 速度设置(分频)RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72/6=14  MAX
    2. GPIO
      • 模拟输入   GPIO_Mode_AIN
    3. ADC配置   ADC_Init(ADC1, &ADC_InitStructure);
      1. 模式:ADC_Mode = ADC_Mode_Independent;//规则组和注入组独立
      2. 是否多通道:ADC_ScanConvMode = DISABLE/ENABLE;
      3. 是否连续转:ADC_ContinuousConvMode = DISABLE;
      4. 选择触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发
      5. 结果对齐方式:ADC_DataAlign = ADC_DataAlign_Right;
      6. 通道数目:ADC_NbrOfChannel = 1;
    4. 使能ADC(若要开始转换还要触发信号)
      • ADC_Cmd(ADC1, ENABLE);
    5. 需转换的通道设置
      • ADC_RegularChannelConfig(ADC1, 通道号ADC_Channel_0-17, 该通道排位1-16, 采样时间ADC_SampleTime_239Cycles5最慢 );
    6. 触发信号
      • 软件触发:ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    7. 获取转换值
      • u16 ADC_GetConversionValue(ADC_TypeDef* ADCx)//返回最近一次 ADCx 规则组的转换结果

    多通道:

    1. ADC_ScanConvMode = ENABLE;
    2. ADC_NbrOfChannel =2;
    3. ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
    4. ADC_RegularChannelConfig(ADC1,ADC_Channel_17,2,ADC_SampleTime_239Cycles5);
    5. (DMA :ADC_DMACmd(ADC1,ENABLE);//打开和DMA的连接)

    通道&引脚

    内部的参照电压(转)

    每个STM32芯片都有一个内部的参照电压,相当于一个标准电压测量点,在芯片内部连接到ADC1的通道17。

    根据数据手册中的数据,这个参照电压的典型值是1.20V,最小值是1.16V,最大值是1.24V。这个电压基本不随外部供电电压的变化而变化。

    不少人把这个参照电压与ADC的参考电压混淆。ADC的参考电压都是通过Vref+提供的。100脚以上的型号,Vref+引到了片外,引脚名称为Vref+;64脚和小于64脚的型号,Vref+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压。

    在ADC的外部参考电压波动,或因为Vref+在芯片内部与VCC相连而VCC变化的情况下,如果对于ADC测量的准确性要求不高时,可以使用这个内部参照电压得到ADC测量的电压值。

    具体方法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值,记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为:

    Vchx = Vrefint * (ADchx/ADrefint)

    其中Vrefint为参照电压=1.20V。

    上述方法在使用内置温度传感器对因为温度变化,对系统参数进行补偿时就十分有效。

  • 相关阅读:
    一个方法只做一件事
    日常-生活-学习-经验分享
    Python 用下划线作为变量前缀和后缀指定特殊变量
    浏览器渲染的基本原理
    七个对我最好的职业建议
    web性能优化
    Javascript 设计模式
    数据结构与算法 Javascript描述
    mysql计算连续天数,mysql连续登录天数,连续天数统计
    Oracle计算连续天数,计算连续时间,Oracle连续天数统计
  • 原文地址:https://www.cnblogs.com/2cats/p/3583122.html
Copyright © 2011-2022 走看看