STM32 ADC转换器、串口输出

这篇具有很好参考价值的文章主要介绍了STM32 ADC转换器、串口输出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


前言

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

什么是比较器

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

https://www.bilibili.com/video/BV1q54y1Z7uU/?spm_id_from=333.337.search-card.all.click


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

一、ADC是什么?

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

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

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

https://www.bilibili.com/video/BV1rL411U77J/?spm_id_from=333.337.search-card.all.click

模数转换框图
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

二、STM32的ADC

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

2.1 认识STM32 ADC

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.2转换方式

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.3 为什么要校准?

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.4 采样时间计算

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.5 触发方式

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.6 多通道采集解决方案

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

2.7 提高ADC采样时间的方法

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

三、如何使用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时钟

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

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

4.2.3 选定通道及配置

选定通道0
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
引脚配置模式
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

通道和引脚对应关系
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

	//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);

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

	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.通道参数配置

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);

4.2.6开启ADC

ADC_Cmd(ADC1, ENABLE);

4.2.7 校准ADC

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

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

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

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

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

4.2.9 读取数据

4.2.9.1 查询方法

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

     while(!ADC_GetFlagStatus( ADC1, ADC_FLAG_EOC) );//等待转换完成
	 adc_temp=ADC_GetConversionValue(ADC1);//读取数据
	 printf("ADC的电压为 %d \r\n",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 \r\n",adc_temp);
					
}
 

程序框架

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

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
问题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 \r\n",ADC_channel0());
	}
}

结果
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
转换成模拟电压

整体程序框架

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

结果

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

五、中断读取ADC电压

5.1 基本步骤

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

5.2使能转换完成中断

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机
STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

	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中断服务函数

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

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

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

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 \r\n",adc_data);
			printf("ADC的电压为 %f \r\n",adc_data*3.3/4095.0);
			flag_adc_cm=0;
			 
			 ADC_SoftwareStartConvCmd( ADC1, ENABLE);
			 
		 }
	}
}

5.5 测试结果

STM32 ADC转换器、串口输出,STM32 学习教程,stm32,嵌入式硬件,单片机

六、思考

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

总结

讲解了什么是ADC,ADC的工作原理是什么,重点讲解了STM32ADC的框架,举例讲解了ADC电压采集过程,并在串口上显示文章来源地址https://www.toymoban.com/news/detail-759688.html

到了这里,关于STM32 ADC转换器、串口输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 智能电视只有数字音频输出,传统音响只有模拟音频输入,巧用数字音频转模拟音频转换器,完美解决!

            智能电视已经成为了现代家庭的必备家电设备,它不仅可以播放高清视频,还可以连接网络,享受各种在线资源。但是,智能电视的音质往往不能满足我们的要求,尤其是对于喜欢听音乐或者看大片的用户来说,智能电视的内置扬声器显得力不从心。这时候,我们

    2024年02月14日
    浏览(44)
  • [嵌入式软件][启蒙篇][仿真平台] STM32F103实现串口输出输入、ADC采集

    上一篇:[嵌入式软件][启蒙篇][仿真平台] STM32F103实现LED、按键 学C语言时,使用的printf()函数,就是通过串口打印出来的。 跟外部器件通信,比如GPS模块、蓝牙模块、wifi模块; 两个开发板之间通信,制定私有协议。 PC电脑通信,使用上位机显示数据或控制下位机。 操作:打

    2024年01月22日
    浏览(71)
  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(49)
  • STM32 ADC数模转换器

    ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想读取电压值,就需要借助ADC模数转换器来实现了,

    2024年02月06日
    浏览(44)
  • STM32 ADC—模数转换器

    目录 一、ADC功能框图 1.电压输入范围 2.输入通道 3.转换顺序 4.触发源 5.转换时间 6.数据寄存器 二、ADC初始化结构体介绍 三、ADC常用固件库函数 四、实验设计 1.独立模式-单通道-中断读取 2.独立模式-(单)多通道-必须采用DMA读取 3.双重模式-多通道-规则同步 简介:STM32单片机

    2024年02月05日
    浏览(47)
  • STM32模数转换器(ADC)

    1.ADC的简要  我们首先说一下ADC的转换过程,然后说一下原理,当然如果嫌啰嗦可以直接跳过。  ADC是英文Analog-to-Digital Converter缩写,翻译过来就是模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。A/D转换的作用是将时间连续、幅值也连续的模拟信号转

    2024年02月16日
    浏览(51)
  • 【STM32学习】模数转换器——ADC

    [STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(一) 刘凯:STM32F103(一):ADC 通过上述的两个链接以及stm32的参考手册,应该可以把ADC理解的差不多了,接下来说一下自己对某些内容的理解。 STM32 ADC转换速度与精度 对于AD转换所需要的时间,我们经常看到:Tconv = S

    2024年02月05日
    浏览(45)
  • STM32之模数转换器ADC

    目录 1、ADC介绍 1.什么是ADC? ADC的全称是Analog-to-Digital Converter,指模拟/数字转换器  2.ADC的性能指标 3.ADC特性 12位分辨率 4.ADC通道 5.ADC转换顺序  6.ADC触发方式  7.ADC转化时间  8.ADC转化模式  9.模拟看门狗 实验:使用ADC读取烟雾传感器的值  CubeMX配置   ​编辑 代码实现  效

    2024年02月04日
    浏览(71)
  • STM32之模数转换器(ADC)

    一、模数转换器介绍 1、模数转换器简介 为什么使用模拟转换器?? 因为MCU只能识别01010101的数字信号,而外部物理信号均为模拟信号,如声音、光、电等,所以为了让计算机能够处理外部物理的信息,必须要通过模拟转换器将模拟量转换成数字量。 模数转换器:将模拟信号

    2024年02月20日
    浏览(42)
  • stm32学习笔记-7ADC模数转换器

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 ADC(Analog-Digital Converter)模拟-数字转换器 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立 模拟电路到数字电路的桥梁 。当然

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包