基于STM32的简易示波器项目(含代码)——HAL库

这篇具有很好参考价值的文章主要介绍了基于STM32的简易示波器项目(含代码)——HAL库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的。巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主要是为了简单实现了示波器的功能,主要利用了ADC+DMA去快速读取并显示波形。(文末有项目代码开源

        实验硬件:STM32F103C8T6;0.96寸OLED

        硬件实物图:

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

        效果图:

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

   引脚连接:

OLED模块:

VCC --> 3.3V

GND --> GND

SCL --> PB10

SDA --> PB11

 方波模块(PWM):

PA0 --> PA3

一、示波器简介

        示波器是一种用途十分广泛的电子测量仪器。它能把肉眼看不见的电信号变换成看得见的图像,便于人们研究各种电现象的变化过程。在被测信号的作用下,电子束就好像一支笔的笔尖,可以在屏面上描绘出被测信号的瞬时值的变化曲线。利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用它测试各种不同的电量,如电压电流频率相位差调幅度等等。

按照信号的不同分类

        模拟示波器采用的是模拟电路(示波管,其基础是电子枪电子枪向屏幕发射电子,发射的电子经聚焦形成电子束,并打到屏幕上。屏幕的内表面涂有荧光物质,这样电子束打中的点就会发出光来。
        数字示波器则是数据采集,A/D转换,软件编程等一系列的技术制造出来的高性能示波器。数字示波器的工作方式是通过模拟转换器(ADC)把被测电压转换为数字信息。数字示波器捕获的是波形的一系列样值,并对样值进行存储,存储限度是判断累计的样值是否能描绘出波形为止,随后,数字示波器重构波形。数字示波器可以分为数字存储示波器(DSO)数字荧光示波器(DPO)采样示波器

        本文中实现的简易示波器可以归结为数字示波器,是利用STM32ADC+DMA去去快速读取数据,并且在OLED上显示出对应波形。本项目采用的是STM32F103C8T6,其性能非常一般。如果使用较高性能的STM32单片机,可以复现出功能非常完善的示波器

硬件实物:

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

二、功能模块

2.1、ADC模块

        模拟数字转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。STM32 的 ADC12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值

        STM32F103 系列最少都拥有 2 个 ADC,我们的C8T6刚好是2个ADC,STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us。(搭配DMA模块,可以进行超快的数据读取与传输)

        STM32 将 ADC 的转换分为 2 个通道组规则通道组注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

        简述:STM32的ADC就是将阈值内的电压映射至409612位的ADC),然后通过映射值再转换成电压数值。这里笔者准备使用ADC+DMA去快速读取和传输数据,尽可能于OLED屏幕上去显示出波形。

2.2、DMA模块

        DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高

        STM32 最多有 2 个 DMA 控制器(DMA2 仅存在大容量产品中),DMA1 有 7 个通道。DMA2 有 5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个 DMA 请求的优先权

STM32 的 DMA 有以下一些特性:
        ●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能
通过软件来配置。
        ●在七个请求间的优先权可以通过软件编程设置(共有四级很高、高、中等和低),假如
在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。

        ●独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐
        ●支持循环的缓冲器管理
        ●每个通道都有3个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
        ●存储器和存储器间的传输
        ●外设和存储器存储器和外设的传输
        ●闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。
        ●可编程的数据传输数目:最大为 65536

2.3、方波模块

        示波器主要的作用之一就是显示波形,其实,利用STM32单片机可以输出方波,正弦波,余弦波,三角波,锯齿波等等特殊波形。(使用DAC模块)由于笔者本次使用的是STM32F103C8T6的MCU,不存在DAC模块,所以这里笔者给大家使用定时器的PWM调节去输出一个方波,并在OLED屏幕上进行显示。

PWM波形:

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

2.4、OLED模块

        关于OLED的使用与原理不熟悉的笔者欢迎去笔者另一篇文章学习。【强烈推荐】基于stm32的OLED各种显示实现(含动态图)_混分巨兽龙某某的博客-CSDN博客_oled显示stm32https://blog.csdn.net/black_sneak/article/details/125418537?spm=1001.2014.3001.5501

三、CubexMX配置

        1、RCC配置外部高速晶振(精度更高)——HSE;

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

          2、SYS配置:Debug设置成Serial Wire否则可能导致芯片自锁);

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

        3.1、ADC1配置:选取ADC1的通道0(IN0)

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

         3.2、ADC1+DMA配置:配置其DMA的选项

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

         4、TIM2配置:配置通道4为PWM调节(作为输出方波)

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

         5、I2C2配置:作为OLED的通讯方式;

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

         6、时钟树配置:

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

         7、工程配置

基于stm32的简易多路数字示波器,STM32开发,stm32,单片机,arm,嵌入式硬件

四、代码

4.1 OLED显示的基础代码

OLED.C代码:

        代码可以直接使用本人另一篇文章的代码。

【强烈推荐】基于stm32的OLED各种显示实现(含动态图)_混分巨兽龙某某的博客-CSDN博客_oled显示stm32https://blog.csdn.net/black_sneak/article/details/125418537?spm=1001.2014.3001.5501

4.2 示波器显示效果API函数

        简单描述就是将数据点进行连线操作。

void Before_State_Update(uint8_t y)//根据y的值,求出前一个数据的有关参数
{
	Bef[0]=7-y/8;
	Bef[1]=7-y%8;
	Bef[2]=1<<Bef[1];
}
void Current_State_Update(uint8_t y)//根据Y值,求出当前数据的有关参数
{
	Cur[0]=7-y/8;//数据写在第几页
	Cur[1]=7-y%8;//0x01要移动的位数
	Cur[2]=1<<Cur[1];//要写什么数据
}


void OLED_SetPos2(unsigned char x, unsigned char y) //设置起始点坐标
{ 
	WriteCmd(0xb0+x);
	WriteCmd((y&0x0f)|0x00);//LOW
	WriteCmd(((y&0xf0)>>4)|0x10);//HIGHT
}

void OLED_DrawWave(uint8_t x,uint8_t y)
{

	int8_t page_sub;
	uint8_t page_buff,i,j;
	Current_State_Update(y);//根据Y值,求出当前数据的有关参数
	page_sub=Bef[0]-Cur[0];//当前值与前一个值的页数相比较
	//确定当前列,每一页应该写什么数据
	if(page_sub>0)
	{
		page_buff=Bef[0];
		OLED_SetPos2(page_buff,x);
		WriteDat(Bef[2]-0x01);
		page_buff--;
		for(i=0;i<page_sub-1;i++)
		{
			OLED_SetPos2(page_buff,x);
			WriteDat(0xff);
			page_buff--;
		}
		OLED_SetPos2(page_buff,x);
		WriteDat(0xff<<Cur[1]);
	}
	else if(page_sub==0)
	{
		if(Cur[1]==Bef[1])
		{
			OLED_SetPos2(Cur[0],x);
			WriteDat(Cur[2]);
		}
		else if(Cur[1]>Bef[1])
		{
			OLED_SetPos2(Cur[0],x);
			WriteDat((Cur[2]-Bef[2])|Cur[2]);
		}
		else if(Cur[1]<Bef[1])
		{
			OLED_SetPos2(Cur[0],x);
			WriteDat(Bef[2]-Cur[2]);
		}
	}
	else if(page_sub<0)
	{
		page_buff=Cur[0];
		OLED_SetPos2(page_buff,x);
		WriteDat((Cur[2]<<1)-0x01);
		page_buff--;
		for(i=0;i<0-page_sub-1;i++)
		{
			OLED_SetPos2(page_buff,x);
			WriteDat(0xff);
			page_buff--;
		}
		OLED_SetPos2(page_buff,x);
		WriteDat(0xff<<(Bef[1]+1));
	}
	Before_State_Update(y);
	//把下一列,每一页的数据清除掉
	for(i=0;i<8;i++)
	{
		OLED_SetPos2(i, x+1) ;
		for(j=0;j<1;j++)
			WriteDat(0x00);
	}
}

4.3 PWM调制的方波

        利用PWM去产生方波,这里50%宽的方波

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);            //开启PwM调节(TIM2CHANNEL_4)
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,500);   //PWM方波的占空比50%

4.4 main函数部分

        主要是去将ADC1读取的数据点进行连线操作,利用DMA传输可以更快的在OLED上去显示,提高整体速度。(包含数据的缩放因子)

#define accur 0.015295 //18*3.3/4096 (3.3/4096就是ADc采样精度,1:是为了让波形转化一下能够显示在适当位子)
uint16_t ConvData;
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ConvData,1);		//ADC+DMA的读取

//while函数中
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		for(x=0;x<128;x=(x+1)%128)//若测高频,改为x=(x+8)号128,注意由于没进行信号发生器验证可能出现bug
		{
			HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ConvData,1);
			float count=accur*ConvData;			
			OLED_DrawWave(x,count);
		}
		
  }

五、实验效果

简易示波器

六、总结

        本项目为简易的示波器实现(乞丐版),后续如果有空,笔者可能会在性能较优的STM32板子上做一个功能非常完善的示波器项目,感兴趣的读者朋友可以关注一下。本项目中因为OLED尺寸有限没有去读取电压等数据(可以使用ADC的HAL库函数去读取,问题不大),但是整体代码框架是比较简明清楚的,欢迎读者朋友在此基础上补全功能,或是提出不足!

代码开源

链接:https://pan.baidu.com/s/1BNcL7BqHYhGzV_OQsH4wqQ 提取码:rciu文章来源地址https://www.toymoban.com/news/detail-785588.html

到了这里,关于基于STM32的简易示波器项目(含代码)——HAL库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程

    一入电赛深似海,此话不假,个人感觉很累,但是收获确实多。本人去年参加了国赛,电赛提前半个月就开始着手准备了,只记得那时候不是调试就是在调试的路上,也因此留下了宝贵的我姑且称之为“经验”,作为一名小白,借此机会跟各位老白和小白分享一下。我训练较

    2024年02月03日
    浏览(51)
  • stm32毕设 示波器设计与实现(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(51)
  • 【数字示波器设计】——基于FPGA的数字示波器实现

    【数字示波器设计】——基于FPGA的数字示波器实现 数字示波器是电子技术领域中非常重要的仪器之一,可以用来观察电信号的波形,是电子工程师必备的工具。而基于FPGA的数字示波器则具有高速、高精度和可编程性强等优势,成为了现代电子工程师常用的示波器。 本文将介

    2024年01月20日
    浏览(45)
  • 基于FPGA的示波器设计

    目录 一、设计要求 二、系统架构设计         本次基于FPGA的示波器设计主要技术要求包含以下内容: 系统能够实现模数转换功能,即包含ADC驱动模块; 系统能够实现ADC采集数据的缓存功能; 系统包含辅助测试模块,DAC数模转换模块; 系统能够实现ADC数据和LCD液晶显示数

    2024年02月14日
    浏览(41)
  • 示波器波形文件解析,github 中找到一份代码`

    arg 是选择第几个波形,Header 中记录了 横坐标是时间,纵坐标是 电压值

    2024年02月11日
    浏览(36)
  • 示波器带宽

    示波器有很多不同规格,确定了可捕获和测量信号的准确度。但是示波器的主要规格是其带宽。 所有示波器都具有以较高频率展示的低通频率响应,如下图所示。大多数带宽规格为 1 GHz 以及更低的示波器通常具有高斯频率响应。示波器高斯频率响应近似于单极点低通滤波器

    2024年02月13日
    浏览(44)
  • ThunderScope开源示波器

    4CH,1GSa/S 开源示波器。前端很简洁,BUF802+LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。 设计日志:https://hackaday.io/project/180090-thunderscope 开源地址:https://github.com/EEVengers/ThunderScope discord讨论组:

    2024年02月16日
    浏览(49)
  • 电脑连接示波器读取数据

    示波器型号:北京普源的RIGOL MSO4034 首先连接示波器: 连接线与示波器相连的端口如上图USB DEVICE所示,是一个比较奇怪的方形接口。连接线的另一端是标准的USB typeA接口,可以直接插在电脑上,当示波器和电脑连接时,电脑会提示安装驱动。 该型号示波器端口是业界通用的

    2023年04月08日
    浏览(54)
  • LabVIEW虚拟数字示波器

    1、简易版 1.1、生成虚拟数据 1.2、 数据参数信息 1.3、 调节时间和幅度 1.4、 调节直流偏置和增益 1.5、 数据信号频域分析 1.6、数据信号滤波 1.7、 保存波形数据 1.8、加载波形数据 1.9、停止运行 2、复杂版 2.1、调节数据信号频率、幅度、相位、偏移量和占空比 2.2、调节时

    2024年02月03日
    浏览(52)
  • 嵌入式开发----示波器入门

    对于嵌入式工程师来说,示波器的使用极为重要,他就像是“电子工程师的眼睛”,把被测信号的实际波形显示在屏幕上,以供工程师查找定位问题或评估系统性能等,利用示波器能观察各种不同信号幅度随时间变化的波形曲线,还可以用来测试电量,如电压、电流、频率、

    2024年01月18日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包