Skip to content

ADC

将模拟量转化为数字量的器件叫做模数转换器, ADC

将数字量转换为模拟量的是DAC, 只要和CPU打交道的都是数字量

传感器的数据通过运放进行放大, 之后通过多路模拟开关, 进行采样保持, 传给A/D转换器转换为数字量通过I/O接口交给微处理器

  • stm32最少支持到12位的ADC, 但是如果传感器的精度不够就会导致在放大以后的精度变得更差
  • 第二个参数相对精度ADC实际输出的数字量和实际的值之间的最大的差值
  • 转换速度指的是一次转换需要的时间
  • 采样间隔时间, 两次转换之间的时间
  • 采样的电压范围

stm32的ADC

12位分辨率, 单次和连续转换切换模式, 转换结束以及注入结束以后会发生中断和模拟看门狗事件

规则模式会依次进行采集, 但是有些时候需要插入一个通道的采集的时候需要注入通道的使用

模拟看门狗设定一个阈值, 在电平超过一个值以后会发生中断

image-20231028091328367

每一个ADC在某一次只能连接到某一个通道, 有多个通道要采集的时候, 需要设定一个顺序, 三个ADC可以同时对一个引脚进行采集用来加快采集的顺序

规则通道最多有16个, 注入通道最多有四个, 注入通道使用的前提是有规则通道

使用的时候可以选择左对齐右对齐, 将数据存放在一个16位的寄存器里面, 使用6位保存结果的时候会把数据放在低八位里面

ADC输入范围:VREF- ≤ VIN ≤ VREF+

image-20231028092534936

image-20231028093348195

image-20231028093403895

这个在进行转换的时候如果JL设置的数字小于四, 会将最上面的通道不予以考虑, 例如设置为00也就是1的时候实际转换的是JSQ4保存的通道

温度传感器和通道ADC1_IN16相连接,内部参照电压VREFINT和ADC1_IN17相连接

image-20231028094535622

可以利用这一个值进行计算实际采样得到的数据

在使用双ADC的时候, 使用的是ADC1和ADC2

image-20231028100318249

高级的芯片有三DMA模式

image-20231028103647643

由于现在设置的是中断处理, 中断函数需要一定的时间, 所以需要把采样时间设置比较大

image-20231028103833374

实际使用

c
/* USER CODE BEGIN PD */
uint16_t ADC_Data = 0;
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	/*获取结果*/
	ADC_Data = HAL_ADC_GetValue(hadc);
}
/* USER CODE END PM */

设置一个回调函数的值

c
  /* USER CODE BEGIN ADC1_Init 2 */
	HAL_ADC_Start_IT(&hadc1);
  /* USER CODE END ADC1_Init 2 */

交替采集

采样同一个通道的时候不要使用同步注入以及同步规则模式进行采样

一般使用DMA进行数据的传输, 设置一块较大的区域进行存储, 防止DMA频繁进入中断

采集的时候由于不支持多个ADC同时采集一个引脚, 所以使用多个ADC采集同一个通道的意义不大