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...(规则/注入都可以这么设置)
配置:
- 时钟:
- 时钟使能 RCC_APB2PeriphClockCmd
- 速度设置(分频)RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72/6=14 MAX
- GPIO
- 模拟输入 GPIO_Mode_AIN
- ADC配置 ADC_Init(ADC1, &ADC_InitStructure);
- 模式:ADC_Mode = ADC_Mode_Independent;//规则组和注入组独立
- 是否多通道:ADC_ScanConvMode = DISABLE/ENABLE;
- 是否连续转:ADC_ContinuousConvMode = DISABLE;
- 选择触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发
- 结果对齐方式:ADC_DataAlign = ADC_DataAlign_Right;
- 通道数目:ADC_NbrOfChannel = 1;
- 使能ADC(若要开始转换还要触发信号)
- ADC_Cmd(ADC1, ENABLE);
- 需转换的通道设置
- ADC_RegularChannelConfig(ADC1, 通道号ADC_Channel_0-17, 该通道排位1-16, 采样时间ADC_SampleTime_239Cycles5最慢 );
- 触发信号
- 软件触发:ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- 获取转换值
- u16 ADC_GetConversionValue(ADC_TypeDef* ADCx)//返回最近一次 ADCx 规则组的转换结果
多通道:
- ADC_ScanConvMode = ENABLE;
- ADC_NbrOfChannel =2;
- ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
- ADC_RegularChannelConfig(ADC1,ADC_Channel_17,2,ADC_SampleTime_239Cycles5);
- (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。
上述方法在使用内置温度传感器对因为温度变化,对系统参数进行补偿时就十分有效。