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。

 

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

posted @ 2014-03-20 00:22  熄灯就睡  阅读(1412)  评论(0编辑  收藏  举报