STM32模数转换器ADC

时间:2022-04-07 01:11:45

目录

一、ADC模数转换概述

二、单通道采集和多通道采集


一、ADC模数转换概述

ADC的作用

        采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。

ADC的性能指标

量程:能测量的电压范围
分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。
转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间 STM32模数转换器ADC

12位精度下转换速度可高达1MHz
可配置的转换精度:6位,8位,10位,12位
转换电压范围:0 ~ 3.6V,V SSA ~ V DDA
供电范围:2.4V ~ 3.6V
19个转换通道: 16个外部通道、 3个内部通道
采样时间可配置
ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中

STM32模数转换器ADC

APB时钟的2或4分频,最高14MHz

   优点:不会有时钟域之间的同步带来的抖动,触发事件和转换的起始时刻之间的延迟是确定 的,从 而保证转换之间的时间间隔是固定的

    缺点: ADC的转换时间和系统时钟频率相关,受系统频率的影响较大

片上14MHZ HSI RC振荡器

    优点:无论MCU的运行频率,都可以保证最高的ADC工作频率可以使用自动节电模式(自动开启或关闭14MHz的内部振荡器)

    缺点:触发信号的同步会带来抖动,触发事件和转换的起始时刻之间的延迟不确定

STM32模数转换器ADC

 STM32模数转换器ADC

19路复用通道

● 16 个从 GPIO 引脚引入的模拟输入 (ADC_IN0...ADC_IN15)

● 3 个内部模拟输入 ( 温度传感、内部参考电压、 VBAT 通道 )

     ADC 可以转换一个单一通道或自动扫描一个序列通道。被转换的通道序列必须在通道选择寄存器 ADC_CHSELR 中编程选择:每个模拟输入通道有专门的一位选择位 (CHSEL0...CHSEL18).

STM32模数转换器ADC

注:

 ADC 通知应用每次转换结束 (EOC) 事件

ADC 通知应用每次序列转换结束 (EOS) 事件。

这些标志位都是在ADC 中断和状态寄存(ADC_ISR)

 ADC_CFGR1可配置COUNT

可编程采样时间 (SMP)

 T Sampling 可配置:     SMP[2:0]@ADC_SMPR

    需要和外部电路的输入阻抗匹配,采样时间适用于所有通道

转化的时间

      T conversion 取决于转换精度: RES[1:0]@ADC_CFGR1

每个通道总的转换时间等于:

 T Sampling + T conversion

STM32模数转换器ADC

n  转换时间快速预览表

   不需要高转换精度的应用,可以通过降低精确度来提高转换速度

   假设ADC模块工作在14MHz的最高工作频率下

STM32模数转换器ADC

软件触发

     软件设置ADC_CR的ADSTART=1 时,触发选择有效。

外部事件触发

      外部事件 ( 例如:定时器TRGO、输入引脚 ) 触发,可以设置触发源以及触发极性

STM32模数转换器ADC

 STM32模数转换器ADC

STM32模数转换器ADC 

     检测待转换的模拟电压

     电压超出检测范围就置位AWD@ADC_ISR,并条件性地产生中断

     检测范围由上下门限寄存器指定、 12位的ADC_HTR和ADC_LTR有效值

模拟看门狗的使能控制

  AWDEN@ADC_CFGR1

      检测所有通道还是单个通道由AWDSEL@ADC_CFGR1决定

      检测哪个单个通道由AWDCH[4:0]@ADC_CFGR1决定

二、单通道采集和多通道采集

STM32模数转换器ADC

 

STM32模数转换器ADC

STM32模数转换器ADC 

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_ADC_Init();

  /* USER CODE BEGIN 2 */
	HAL_ADC_Start_IT(&hadc);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  
	 HAL_Delay(1000);

	 HAL_ADC_Start_IT(&hadc);
	  
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}
uint32_t light_value;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	light_value = HAL_ADC_GetValue(hadc);
	
	printf("light_value = %d\n",light_value);
}

STM32模数转换器ADCSTM32模数转换器ADC 有两种方式来进行多通道采集,第一种是判断EOC标志,来了就赶紧取走不然会被覆盖

第二种是DMA,也是正常使用时最推荐用的

STM32模数转换器ADC

这次用的EOC判断

STM32模数转换器ADC 

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	uint32_t temp = 0;
	
	if(GPIO_Pin == GPIO_PIN_8)
	{
		HAL_ADC_Start(&hadc);
		
		while( !(hadc.Instance->ISR & (1<<2)));  //如果退出表示EOC置位,当前通道转化结束
		temp = HAL_ADC_GetValue(&hadc);		
		printf("key adc value = %d\n", temp);
		
		while( !(hadc.Instance->ISR & (1<<2)));  //如果退出表示EOC置位,当前通道转化结束
		temp = HAL_ADC_GetValue(&hadc);		
		printf("light adc value = %d\n", temp);

		HAL_ADC_Stop(&hadc);
		
	}
}