【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采样值的平均值
}
相关推荐
盈创力和20079 分钟前
物联网 “神经” 之以太网:温湿度传感器的工业级 “高速干道”
运维·服务器·网络·嵌入式硬件·以太网温湿度传感器
GilgameshJSS39 分钟前
STM32H743-ARM例程36-DNS
c语言·arm开发·stm32·单片机·嵌入式硬件
工具人55551 小时前
电脑插入USB一个端口都识别不出来
单片机·嵌入式硬件·电脑
KOAN凯擎小妹2 小时前
晶振信号质量:上升下降时间与占空比
单片机·嵌入式硬件·fpga开发·信息与通信
sheepwjl3 小时前
《嵌入式硬件(二十一):基于IMX6ULL的脉冲宽度调制(PWM)操作》
嵌入式硬件·pwm·脉冲宽度调制
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机简易电子琴系统(8键)
c语言·单片机·嵌入式硬件·物联网·51单片机
盈创力和20076 小时前
技术解析:CO与NO₂双气体监测如何构筑协同化安全防线
嵌入式硬件·安全·以太网温湿度传感器·多参量传感器·温湿度+气体智能传感器
平凡灵感码头6 小时前
STM32 串口中断接收原理与实战详解:从配置到中断服务函数全流程解析
单片机·嵌入式硬件
切糕师学AI7 小时前
MCU中的RC电路(Resistor-Capacitor Circuit)
单片机·嵌入式硬件
朱嘉鼎7 小时前
KeilIDE背后的命令
c语言·嵌入式硬件·keilmdk