提示文章写完后,目录可以自动生成如何生成参考右边的帮助文档


前言

提示:这里可以添加本文记录的大概内容
工程应用中,除了对数字信号进行处理,常常还要处理模拟信号这个时候就要用到模拟转换器,也就是模拟信号转换成数字信号的器件。
比如设置一个比较器,电压低于1v,就输出3.3v电压高于1v,就输出0v这个就是我们常见到的一位模数转换器

什么比较

快速上手双电压比较器LM393,并制作巡线小车传感器模块无需单片机【IC原来如此】

https://www.bilibili.com/video/BV1q54y1Z7uU/?spm_id_from=333.337.searchcard.all.click


提示:以下是本篇文章正文内容,下面案例可供参考

一、ADC是什么

ADC 是 Analogto-Digital Converter 的缩写,意思是模/数转换器或者模数转换器。它是将连续变化的模拟信号转换离散数位讯号的器件。这种转换器可以将真实世界的模拟信号,如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。

引用B站大神作品进行介绍

ADC——模数转换器基础知识和几个常见类型

https://www.bilibili.com/video/BV1rL411U77J/?spm_id_from=333.337.searchcard.all.click

模数转换框图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、STM32的ADC

STM32中的ADC是12位逐次逼近型ADC,最快转换速度大约1us

2.1 认识STM32 ADC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.2转换方式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.3 为什么校准

在这里插入图片描述

2.4 采样时间计算

在这里插入图片描述

2.5 触发方式

在这里插入图片描述

2.6 多通道采集解决方案

在这里插入图片描述

2.7 提高ADC采样时间方法

在这里插入图片描述

三、如何使用STM32的ADC

3.1. 使用哪个ADC

3.2. 电压基准

3. 3使用什么通道

3.4. 用什么规则

3.5. 时钟来源配置最大吗?14Mhz

3.6. 如何触发软件还是硬件

3.7.是否中断读取数据

四、编程步骤

4.1大概步骤

4.1.1 开时钟

4.1.2 配置gpio

4.1.3 初始化ADC_init()

4.1.4 开启转换

4.1.5 等待转换完成

4.1.6 读取转换数据

4.1.7 串口输出显示电压,模拟电压和数字电压

4.2 具体举例:

4.2.1 选用ADC1,

4.2.2 找到ADC1时钟

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//1.开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC 时钟 
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 分频给ADC实际时钟

4.2.3 选定通道配置

选定通道0
在这里插入图片描述
在这里插入图片描述
引脚配置模式
在这里插入图片描述

通道引脚对应关系
在这里插入图片描述

	//1.开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
	//2.配置引脚   PA0为模拟输入
	
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_0;          //TX
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x

4.2.4初始化adc

ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);

在这里插入图片描述

在这里插入图片描述

	ADC_InitStruct.ADC_ContinuousConvMode= DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=  ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode= ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel= 1;
	ADC_InitStruct.ADC_ScanConvMode= DISABLE;
	ADC_Init(ADC1,  &ADC_InitStruct);

4.2.5.通道参数配置

在这里插入图片描述
在这里插入图片描述

	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);

4.2.6开启ADC

ADC_Cmd(ADC1, ENABLE);

4.2.7 校准ADC

在这里插入图片描述
在这里插入图片描述

// 复位和校准ADC	
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));  //为0说明复位完成
	ADC_StartCalibration(ADC1);
	while( ADC_GetCalibrationStatus( ADC1)) ; //为0说明校准完成

4.2.8触发转换和等待转换完成

在这里插入图片描述

在这里插入图片描述

// 软件触发转换  等待转换完成	
	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);

4.2.9 读取数据

4.2.9.1 查询方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );//等待转换完成
	 adc_temp=ADC_GetConversionValue(ADC1);//读取数据
	 printf("ADC的电压为 %d rn",adc_temp);

完整初始化

void adc1_init()
{
	u16 adc_temp;
	ADC_InitTypeDef ADC_InitStruct;
	//1.开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// 72/6=12
	//2.配置引脚   PA0为模拟输入
			
	GPIO_InitStruct.GPIO_Pin=  GPIO_Pin_0;          //TX
	GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);   //&x
	
	ADC_InitStruct.ADC_ContinuousConvMode= DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=  ADC_ExternalTrigConv_None;
	ADC_InitStruct.ADC_Mode= ADC_Mode_Independent;
	ADC_InitStruct.ADC_NbrOfChannel= 1;
	ADC_InitStruct.ADC_ScanConvMode= DISABLE;
	ADC_Init(ADC1,  &ADC_InitStruct);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
	
	ADC_Cmd(ADC1, ENABLE);
	
// 复位和校准ADC	
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));  //为0说明复位完成
	ADC_StartCalibration(ADC1);
	while( ADC_GetCalibrationStatus( ADC1)) ; //为0说明校准完成
	
// 软件触发转换  等待转换完成	
	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);


     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
	 adc_temp=ADC_GetConversionValue(ADC1);
	  
	  printf("ADC的电压为 %d rn",adc_temp);
					
}
 

程序框架

void main()
{
	...
	//初始串口
	adc1_init();//复位一次读取一次电压
	while(1)
	{
	}
}

在这里插入图片描述
在这里插入图片描述
问题1: 怎么不断的读取电压

4.2.10 不断读取ADC通道0电压

单独读取通道函数

u16 ADC_channel0()
{
     u16 temp;
	// 软件触发转换  等待转换完成	
	 ADC_SoftwareStartConvCmd( ADC1, ENABLE);
     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );
	 temp=ADC_GetConversionValue(ADC1);
	return temp;

}

整体程序框架

void main()
{
	...
	//初始串口
	adc1_init();//复位一次读取一次电压
	while(1)
	{
				printf("ADC的电压为 %d rn",ADC_channel0());
	}
}

结果
在这里插入图片描述
转换成模拟电压

整体程序框架

void main()
{
	...
	//初始串口
	adc1_init();//复位一次读取一次电压
	while(1)
	{
				printf("ADC的电压为 %d rn",ADC_channel0());
				printf("ADC的电压为 %f rn",ADC_channel0()*3.3/4095.0);
	}
}

结果

在这里插入图片描述

五、中断读取ADC电压

5.1 基本步骤

1.配置ADC转换完成中断
2.配置中断优先级
3.写中断服务函数
4.判断中断是否,清楚中断,读取ADC的数值

5.2使能转换完成中断

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStruct.NVIC_IRQChannel=ADC1_2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=  1;
	NVIC_Init(&NVIC_InitStruct);
	

5.3中断服务函数

在这里插入图片描述

5.4 获取标志位,清楚标志位

在这里插入图片描述

void   ADC1_2_IRQHandler()
{
        if(ADC_GetITStatus(ADC1, ADC_IT_EOC)) // 查标志位
		{
		
		    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); //清楚标志位
			
			 adc_data=ADC_GetConversionValue(ADC1); //读取数
			
	     	flag_adc_cm=1;                       //标志位为1 ,主函数判断然后显示数据
			
			
		}


}

整体程序框架

void main()
{
	...
	//初始串口
	adc1_init();//复位一次读取一次电压,加入中断配置
	while(1)
	{
		 if(flag_adc_cm==1)
		 {
			printf("ADC的电压为 %d rn",adc_data);
			printf("ADC的电压为 %f rn",adc_data*3.3/4095.0);
			flag_adc_cm=0;
			 
			 ADC_SoftwareStartConvCmd( ADC1, ENABLE);
			 
		 }
	}
}

5.5 测试结果

在这里插入图片描述

六、思考

  1. 如何实现通道转换
  2. 果实定时器触发转换

总结

讲解什么是ADC,ADC的工作原理是什么,重点讲解了STM32ADC的框架,举例讲解了ADC电压采集过程,并在串口显示

原文地址:https://blog.csdn.net/ganhui13000/article/details/134659534

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43394.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注