【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采样值的平均值
}
相关推荐
不悔哥5 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20165 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子5 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡5 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5555 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡5 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9665 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛5 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅5 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员5 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程