我是靠谱客的博主 踏实毛巾,最近开发中收集的这篇文章主要介绍第 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("rn ----这是一个ADC单通道中断读取实验----rn");
	
	while (1)
	{
		ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; 
	
		printf("rn The current AD value = 0x%04X rn", 
		       ADC_ConvertedValue); 
		printf("rn The current AD value = %f V rn",
		       ADC_ConvertedValueLocal); 
		printf("rnrn");

		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("rn ----这是一个ADC多通道采集实验----rn");
	
	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("rn CH0 value = %f V rn",ADC_ConvertedValueLocal[0]);
			printf("rn CH1 value = %f V rn",ADC_ConvertedValueLocal[1]);
			printf("rn CH2 value = %f V rn",ADC_ConvertedValueLocal[2]);
			printf("rn CH3 value = %f V rn",ADC_ConvertedValueLocal[3]);
			printf("rn CH4 value = %f V rn",ADC_ConvertedValueLocal[4]);
			printf("rn CH5 value = %f V rn",ADC_ConvertedValueLocal[5]);
		
			printf("rnrn");
			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("rn ----这是一个双ADC规则同步采集实验----rn");
	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("rn ADCx_1 value = %f V rn",
		        ADC_ConvertedValueLocal[1]);
		printf("rn ADCx_2 value = %f V rn",
		        ADC_ConvertedValueLocal[0]);
		
		printf("rnrn");
		Delay(0xffffee); 
		 
	}
}
/*********************************************END OF FILE**********************/


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

最后

以上就是踏实毛巾为你收集整理的第 30 章 ADC—电压采集的全部内容,希望文章能够帮你解决第 30 章 ADC—电压采集所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部