什么是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 */
}