> 文章列表 > [STM32F103C8T6]ADC转换

[STM32F103C8T6]ADC转换

[STM32F103C8T6]ADC转换

什么是ADC转换?

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

ADC的性能指标:

ADC分辨率:

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

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

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

ADC通道

 什么叫注入通道?什么叫规则通道?

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

ADC转换顺序

 

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

ADC的触发方式

ADC转换时间

ADC转换模式

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

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

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

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

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

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

配置ADC 

 关于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 <stdio.h>
#include <string.h>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库

 

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 */
}

穿搭知识