Back

模数转换的应用

AD的概念及性能指标

  • AD概念:将连续的模拟信号转换为离散的数字信号的器件。
  • 转换时间:AD完成一次转换所需要的时间,其倒数为转换速率。
  • 分辨率 输出模拟量最小变化程度的指标(32上的为12位)。12位,满量程5v分辨率为:5 /(2^12)=1.22mv
  • 量化误差 量化过程引起的误差 理论上规定为一个单位分辨率的-1/2 — +1/2LSB 。
  • 转换精度:实际A/D转换器与一个理想A/D转换器在量化值上的差值,可用绝对误差或相对误差表示。

AD时钟

时钟由PCLK2经过分频产生,最大14M 一般使PCLK2=HCLK=72M

采样的周期数可通过 ADC 采样时间寄存器 ADC_SMPRx(x=0、1) 中的 SMP[2:0]位设置,ADC_SMPR2 控制的是通道 0~9,ADC_SMPR1 控制的是通道 10~17。每个通道可以分别用不同的时间采样。其中采样周期最小是 1.5 个(ADC_CLK 周期,1/ADC_CLK),即如果我们要达到最快的采样,那么应该设置采样周期为 1.5 个周期。

ADC的转换时间:与ADC的输入时钟和采样时间有关。 公式为:Tconv = 采样时间 + 12.5 个周期。

CubeMX的配置

使用 ADC1 的其中1个通道,通道号10,对应的引脚是 PC0;

设置ADC 时钟参数,这里设置 PLCK2是72M;时钟经过 6 分频,那么此时的时钟就是 12MHz。

设置 ADC 的转换模式以及通道进行设置,独立模式(Independent mode)、数据右对齐(Right Alignment)、连续转换模式(Continuous Conversion Mod)使能;使能规则通道转换,选择1个通道。

6u1ZOU.png

常用函数

ADC:HAL_StatusTypeDef  HAL_ADC_Start(ADC_HandleTypeDef* hadc);//此函数Adon控制位,置1,启动ADC。
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
//用于轮询ADC转换。  adc句柄和超时时间
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); 
//读取ADC的值,清EOC; 返回AD采集的值
uint32_t  HAL_ADC_GetState(ADC_HandleTypeDef* hadc);
//读取ADC的状态;本例参数: adc句柄,取值&hadc1    返回状态值

终端回调函数的编写

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	uint16_t ADC1_Value;
  	 uint32_t Rt;
    if (htim->Instance == htim1.Instance)   //判断时钟状态是否达到中断
    {
        HAL_ADC_Start(&hadc1);
  	HAL_ADC_PollForConversion(&hadc1, 50);
 	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
  	 {
	ADC1_Value = HAL_ADC_GetValue(&hadc1);
   	 Rt=(10000*ADC1_Value)/ (4096-ADC1_Value); //计算此时电阻 
                return Rt
    }
}
Licensed under GNU General Public License v2.0