[STM32F103C8T6]ADC转换

什么是ADC转换?

ADC转换的全称是:Analog-to-Digital Converter,指模拟/数字转换器

[STM32F103C8T6]ADC转换_第1张图片

ADC的性能指标:

[STM32F103C8T6]ADC转换_第2张图片

[STM32F103C8T6]ADC转换_第3张图片

ADC分辨率:

SSA与VREF-一起接到地,DDA与VREF+接到3.3v,所以ADC转换的范围是0---3.3v

所以最后的ADC转换值应该是我们的测量值*分辨率   

分辨率 = 3.3v/2^12 = (3.3/4096)   12位的转换器所以是2的12次方为最小刻度

ADC通道:

[STM32F103C8T6]ADC转换_第4张图片 什么叫注入通道?什么叫规则通道?

 我的理解是:注入通道是有特权的通道,可以优先转换,而规则通道是没有特权的通道只能按顺序转换(类似于买票排队,注入通道就类似于老弱病残孕军人之类的,享有优先特权,而规则通道就是普通的排队通道必须排队通过)

ADC转换顺序

[STM32F103C8T6]ADC转换_第5张图片

[STM32F103C8T6]ADC转换_第6张图片

 

[STM32F103C8T6]ADC转换_第7张图片

 注入通道的顺序不是指定的,而是4-JL,如果JL=1,就是从第三个通道开始,如果JL=4才会按照JSQ1,JSQ2,JSQ3,JSQ4的顺序

ADC的触发方式

ADC转换时间

[STM32F103C8T6]ADC转换_第8张图片

ADC转换模式

[STM32F103C8T6]ADC转换_第9张图片

 打开扫描模式是扫描被选中的SQR的所有通道

 关闭扫描模式则只扫描被选中的SQR的第一个通道

单次转换是指只扫描一次从第一个到最后一个通道,扫描结束后停止扫描,连续转换是指从第一个通道扫描到最后一个通道再重头扫描

用ADC转换读取烟雾报警器的值

[STM32F103C8T6]ADC转换_第10张图片

通过查看产品手册,确定了烟雾报警器的接线AO模拟输出口接在PA0上 

 因为ADC是挂在PCLK2上经过分频最大为14MHZ,在cubeMX上RCC我们配置的时钟数上,PCLK2为最大72MHZ,所以我们必须更改分频,使ADC转换时钟在14MHZ以内 

[STM32F103C8T6]ADC转换_第11张图片

配置ADC 

[STM32F103C8T6]ADC转换_第12张图片

 关于ADC转换的几个HAL库函数

        HAL_ADC_Start(&hadc1);//启动ADC转换

        原型:HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
        参数1:ADC句柄:&hadcx

          HAL_ADC_PollForConversion(&hadc1,50);//阻塞在这,等待转换完成

        原型:HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
      参数1:ADC句柄:&hadcx    参数2:堵塞时间

         HAL_ADC_GetValue(&hadc1);//读取ADC转换的值

        原型:uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)          

       参数1 :ADC句柄:&hadcx 返回值:读取到的转换值 uint32_t型

本次实验是通过串口打印ADC的转换值,所以要使用printf重定向

#include 
#include 

int fputc(int ch,FILE*f)
{
	unsigned char temp[1] = {ch};
	HAL_UART_Transmit(&huart1,temp,strlen((const char*)temp),0xffff);
	return ch;
}

 使用重定向必须勾选Micro LIB库

 [STM32F103C8T6]ADC转换_第13张图片

main.c

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint32_t smoke_value = 0;
  /* 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_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		HAL_ADC_Start(&hadc1);//启动ADC转换
		HAL_ADC_PollForConversion(&hadc1,50);//阻塞在这,等待转换完成
		smoke_value = HAL_ADC_GetValue(&hadc1);//读取ADC转换的值
		printf("smoke_value = :%f\r\n",(3.3/4096)*smoke_value);
		HAL_Delay(500);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

你可能感兴趣的:(stm32,单片机,嵌入式硬件)