【STM32嵌入式系统设计与开发拓展】——15_ADC

一、问题集结

1、ADC?

(Analog to Digital Converter)即模数转换器,用来将模拟信号转换为数字信号. 模数转换器

2、什么是模拟量?

如温度,湿度等随着时间逐步逐步连续变化的量

3、什么是数字量?

如我们单片机处理的信号010101这些。

4、什么是分辨率

A/D转换器对输入模拟量微小变化的分辨能力,通常用二进制数的有效位表示。

二、ADC框图

三、代码分析

c 复制代码
	/* 设置ADC分频因子 */
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                   // 将ADC时钟设置为PCLK2的1/6,此处PCLK2为72MHz,分频后为12MHz
c 复制代码
	/* 引脚配置 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                           // 配置PA1为ADC输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                       // 模拟输入模式
	GPIO_Init(GPIOA, &GPIO_InitStructure);                              // 初始化GPIOA	
c 复制代码
	/* ADC配置 */
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  // 独立模式,单独使用ADC1
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       // 关闭扫描模式,单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                 // 关闭连续转换模式,单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发转换
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              // 数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;                             // 转换通道数量为1
	ADC_Init(ADC1, &ADC_InitStructure);                                 // 初始化ADC1
	/* 使能ADC */
	ADC_Cmd(ADC1, ENABLE);

	/* 复位校准 */
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1));                        // 等待复位校准结束
	
	/* 开始校准 */
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1));                             // 等待校准结束
	
c 复制代码
/*********************************************************************
 @Function  : 获得ADC值
 @Parameter : ch : 通道值 0~3
 @Return    : ADC值
**********************************************************************/
uint16_t Get_Adc(uint8_t ch)   
{
	/*设置指定ADC的规则组通道,一个序列,采样时间*/
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期
	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		                          //使能指定的ADC1的软件转换启动功能
	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));                     //等待转换结束
	
	return ADC_GetConversionValue(ADC1);	                              //返回最近一次ADC1规则组的转换结果
	
}
c 复制代码
/*********************************************************************
 @Function  : 获得ADC的平均值
 @Parameter : ch : 通道值 0~3
						  times :采集次数
 @Return    : ADC平均值
**********************************************************************/
uint16_t Get_Adc_Average(uint8_t ch, uint8_t times)
{
	uint32_t temp_val = 0;      // 初始化累加变量为0
	uint8_t t;                  // 循环计数变量
	for (t = 0; t < times; t++) // 循环执行指定次数
	{
		temp_val += Get_Adc(ch);  // 获取指定通道的ADC值并累加到temp_val
		delay_ms(5);              // 延时5毫秒,等待下一次采样		
	}
	return temp_val / times;    // 返回ADC采样值的平均值
}
相关推荐
anghost15038 分钟前
基于 STM32 的多传感器健康监测系统设计
stm32·单片机·嵌入式硬件
玉~你还好吗1 小时前
【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
单片机·嵌入式系统·电机控制
STC_USB_CAN_80512 小时前
所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
单片机·嵌入式硬件·51单片机
正点原子3 小时前
《ESP32-S3使用指南—IDF版 V1.6》第三十四章 RGB触摸实验
单片机·物联网·嵌入式
码小文4 小时前
Altium Designer 22使用笔记(8)---PCB电气约束设置
笔记·嵌入式硬件·硬件工程·ad22
dumpling01204 小时前
新手向:使用STM32通过RS485通信接口控制步进电机
stm32·单片机·嵌入式硬件
hazy1k4 小时前
STM32-FreeRTOS快速入门指南(中)
stm32·单片机·嵌入式硬件
清风6666665 小时前
基于51单片机自动浇花1602液晶显示设计
单片机·嵌入式硬件·mongodb·毕业设计·51单片机·课程设计
古译汉书5 小时前
嵌入式-SPI番外之按钮驱动程序的编写-Day15
c语言·stm32·单片机·嵌入式硬件·mcu·算法
小莞尔10 小时前
【Proteus仿真】【51单片机】基于51单片机密码锁
stm32·单片机·嵌入式硬件·51单片机·proteus