[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句柄:&hadcxHAL_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 */
}