第 30 章 ADC—电压采集

30.1 ADC 简介

30.2 ADC 功能框图剖析

2.1 电压输入范围
2.2 输入通道

1.规则通道

2.注入通道

2.3 转换顺序

1.规则序列

2.注入序列

2.4 触发源
2.5 转换时间

1.ADC 时钟

2.采样时间

2.6 数据寄存器

1.规则数据寄存器

2.注入数据寄存器

2.7 中断

1.转换结束中断

2.模拟看门狗中断

3.DMA 请求

2.8 电压转换

30.3 ADC 初始化结构体详解

1.ADC_InitTypeDef 结构体

(1)ADC_Mode:配置 ADC 的模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,我们一般使用一个 ADC 的独立模式。

(2)ScanConvMode:可选参数为 ENABLE 和 DISABLE,配置是否使用扫描。如果是单通道 AD 转换,使用 DISABLE,如果是多通道 AD 转换使用 ENABLE。

(3)ADC_ContinuousConvMode:可选参数为 ENABLE 和 DISABLE,配置是启动自动连续转换还是单

次转换。使用 ENABLE 配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转换一次后停止需要手动控制才重新启动转换。一般设置为连续转换。

(4)ADC_ExternalTrigConv:外部触发选择,图单个 ADC 功能框图 中列举了很多外部触发条件,可根据项目需求配置触发来源。实际上,我们一般使用软件自动触发。

(5)ADC_DataAlign:转换结果数据对齐模式,可选右对齐 ADC_DataAlign_Right 或者左对齐ADC_DataAlign_Left。一般我们选择右对齐模式。

(6)ADC_NbrOfChannel:AD 转换通道数目,根据实际设置即可。

30.4 独立模式单通道采集实验

4.1 硬件设计
4.2 软件设计
4.2.1 编程要点
  1. 初始 ADC 用到的 GPIO;
  2. 设置 ADC 的工作参数并初始化;
  3. 设置 ADC 工作时钟;
  4. 设置 ADC 转换通道顺序及采样时间;
  5. 配置使能 ADC 转换完成中断,在中断内读取转换完数据;
  6. 使能 ADC;
  7. 使能软件触发 ADC 转换。

ADC 转换结果数据使用中断方式读取,这里没有使用 DMA 进行数据传输。

4.2.2 代码分析

1.ADC 宏定义

2.ADC GPIO 初始化函数

3.配置 ADC 工作模式

4.ADC_Cmd 函数控制 ADC 转换启动和停止。

5.ADC 中断配置

6.ADC 中断服务函数

7.主函数

main.c


// ADC 单通道采集,不使用DMA,一般只有ADC2才这样使用,因为ADC2不能使用DMA

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_adc.h"

extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal;        

// 软件延时
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
} 

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	
	// 配置串口
	USART_Config();
	
	// ADC 初始化
	ADCx_Init();
	
	printf("\r\n ----这是一个ADC单通道中断读取实验----\r\n");
	
	while (1)
	{
		ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; 
	
		printf("\r\n The current AD value = 0x%04X \r\n", 
		       ADC_ConvertedValue); 
		printf("\r\n The current AD value = %f V \r\n",
		       ADC_ConvertedValueLocal); 
		printf("\r\n\r\n");

		Delay(0xffffee);  
	}
}
/*********************************************END OF FILE**********************/

其他文件:
在这里插入图片描述

30.5 独立模式多通道采集实验

5.2 软件设计
5.2.1 编程要点
  1. 初始化 ADC GPIO;
  2. 初始化 ADC 工作参数;
  3. 配置 DMA 工作参数;
  4. 读取 ADC 采集的数据;

ADC 转换结果数据使用 DMA 方式传输至指定的存储区,这样取代单通道实验使用中断服务的

读取方法。实际上,多通道 ADC 采集一般使用 DMA 数据传输方式更加高效方便。

5.2.2 代码分析

1.ADC 宏定义

2.ADC GPIO 初始化函数

3.配置 ADC 工作模式

4.主函数

main.c


// ADC 6通道采集实验

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_adc.h"

// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal[NOFCHANEL];        

// 软件延时
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
} 

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{		
	// 配置串口
	USART_Config();
	
	// ADC 初始化
	ADCx_Init();
	
	printf("\r\n ----这是一个ADC多通道采集实验----\r\n");
	
	while (1)
	{	
    
			ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*3.3;
			ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*3.3;
			ADC_ConvertedValueLocal[2] =(float) ADC_ConvertedValue[2]/4096*3.3;
			ADC_ConvertedValueLocal[3] =(float) ADC_ConvertedValue[3]/4096*3.3;
			ADC_ConvertedValueLocal[4] =(float) ADC_ConvertedValue[4]/4096*3.3;
			ADC_ConvertedValueLocal[5] =(float) ADC_ConvertedValue[5]/4096*3.3;
		
			printf("\r\n CH0 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
			printf("\r\n CH1 value = %f V \r\n",ADC_ConvertedValueLocal[1]);
			printf("\r\n CH2 value = %f V \r\n",ADC_ConvertedValueLocal[2]);
			printf("\r\n CH3 value = %f V \r\n",ADC_ConvertedValueLocal[3]);
			printf("\r\n CH4 value = %f V \r\n",ADC_ConvertedValueLocal[4]);
			printf("\r\n CH5 value = %f V \r\n",ADC_ConvertedValueLocal[5]);
		
			printf("\r\n\r\n");
			Delay(0xffffee);		 
	}
}
/*********************************************END OF FILE**********************/


其他文件:

在这里插入图片描述

30.6 双重 ADC 同步规则模式采集实验

6.1 硬件设计
6.2 软件设计
6.2.1 编程要点
  1. 初始化 ADC GPIO;
  2. 初始化 DMA 配置;
  3. 初始化 ADC 参数;
  4. 读取 ADC 采集的数据,并打印出来校正;
6.2.2 代码分析

1.ADC 宏定义

2.ADC GPIO 初始化函数

3.配置双重 ADC 规则同步模式

4.主函数

main.c



#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_adc.h"

// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint32_t ADC_ConvertedValue[NOFCHANEL];

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal[NOFCHANEL*2];        

// 软件延时
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
} 

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{		
	uint16_t temp0=0 ,temp1=0;
	// 配置串口
	USART_Config();
	
	// ADC 初始化
	ADCx_Init();
	
	printf("\r\n ----这是一个双ADC规则同步采集实验----\r\n");
	printf("欢迎使用野火STM32开发板\n");
	
	while (1)
	{	
    // 取出ADC1数据寄存器的高16位,这个是ADC2的转换数据
		temp0 = (ADC_ConvertedValue[0]&0XFFFF0000) >> 16;
		// 取出ADC1数据寄存器的低16位,这个是ADC1的转换数据
		temp1 = (ADC_ConvertedValue[0]&0XFFFF);	
		
		ADC_ConvertedValueLocal[0] =(float) temp0/4096*3.3;
		ADC_ConvertedValueLocal[1] =(float) temp1/4096*3.3;
		
		printf("\r\n ADCx_1 value = %f V \r\n",
		        ADC_ConvertedValueLocal[1]);
		printf("\r\n ADCx_2 value = %f V \r\n",
		        ADC_ConvertedValueLocal[0]);
		
		printf("\r\n\r\n");
		Delay(0xffffee); 
		 
	}
}
/*********************************************END OF FILE**********************/


其他文件:
在这里插入图片描述

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自动化王祖豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值