基于STM32F103的简易示波器设计(基于正点原子mini开发板)

摘要

本设计采用STM32F103微控制器,硬件为正点原子的MiniSTM32开发板,设计一个示波器,能够测量输入信号的频率、最大值、最小值和幅值,并显示所输入的波形。
并且采样频率可以设置,并能通过串口输出所测量的内容。
采用FFT算法计算频率,精度较高。所用到的硬件模块有ADC、定时器、UART、外部中断、DMA、GPIO、EXTI。

作品实物

一、设计内容与设计方法

1.1 设计内容与要求

  1. 由于STM32采用3.3V的电平标准,所以输入的信号电压范围为0V到3.3V。
  2. 采集输入的信号,计算输入信号的频率、最大值、最小值和幅值。
  3. 由于所测量的频率的范围与采样的频率有关,所以采样频率可以设置,以达到不同的要求。
  4. 计算的信号的内容可以通过串口打印出来。

1.2设计思路

  1. 通过ADC1模数转换模块,采集输入的模拟信号,通过定时器的PWM输出触发一次采样,所以采样频率可以通过定时器设置。将ADC采样的数据通过DMA的方式送到指定的内存中去。
  2. 将采样得到的数据通过循环比较得到最大值和最小是,两者相减得到信号幅值。将得到的采样数据进行FFT变换,然后在进行一系列的计算得到信号的频率。
  3. 通过UART1将得到的信号计算内容发送的PC,波特率可以设置。采样率的设置以及串口输出的设计通过外部中断(外部按键)设置。
  4. 设置开发板自带的LED灯,通过LED灯来指示系统是否工作。
  5. 将输入信号的波形以及计算结果在LCD屏幕上显示出来,LCD显示采用正点原子提供的LCD驱动函数。

硬件设计

2.1 STM32最小系统设计

  1. 采用的微控制器为STM32F103RCT6,该微控制器采用Cortex-M3体系结构,它拥有的资源包括: 48KB SRAM、 256KB FLASH、 2 个基本定时器、 4 个通用定时器、 2 个高级定时器、 2个 DMA 控制器(共 12 个通道)、 3 个 SPI、 2 个 IIC、 5 个串口、 1 个 USB、 1 个 CAN、 3 个 12位 ADC、 1 个 12 位 DAC、 1 个 SDIO 接口及 51 个通用 IO 口分三组,该芯片性价比较高。
  2. 该系统采用外部晶振作为时钟源,外部晶振频率为8MHz,通过内部PLL等电路设置系统频率为72MHz。,系统电源采用3.3V供电,DAC的参考电压设置为5V。
  3. 复位端外界一个按键,即RESET按键接到单片机的NRST端,当按下该按键时,系统复位。下载电路采用JTAG下载。
  4. 本次设计用到的内部资源有:SRAM、FLASH、通用定时器2,DMA1,UART1,DAC1,GPIOA、EXTI。
  5. 最小系统电路图为:

2.2、LED显示与外部中断按键电路

  1. LED显示控制端为GPIOA_Pin_8,LED的阳极通过保护电阻接电源,阴极连接到GPIOA_Pin_8,该端口采用推挽输出,输出高电平时LED灭,输出低电平,LED亮。
  2. 按键连接电路如图所示,WK_UP按键连接到PA0,KEY0连接到PC5,KEY1连接到PA15,他们分别对应外部中断通道0、通道5、通道15。通道0的中断为上升沿触发,通道5和15为下降沿触发。

2.3、LCD显示屏接口电路

  1. LCD显示屏我们采用的为2.8寸屏,分辨率为320*240,支持65K色显示,接口为16位的80并口,自带触摸屏,TFTLCD 模块采用 2*17 的 2.54 公排针与外部连接。
  2. LCD控制芯片采用ILI9341,ILI9341液晶控制器自带显存,可以通过不同的命令在LCD的不同位置显示不同的颜色,从而显示图像。
  3. 开发板上自带LCD显示屏接口,直接将开发板与LCD相连即可,其接口电路如下图:

三、软件设计

3.1、软件设计总体流程

  1. 1、主函数执行过程
1、初始化(延时函数、LED灯、串口、LCD显示、外部中断、定时器、DMA、ADC)2、中断向量优先级分组、LCD显示3、 输入信号采样、等待采样完成4、关闭信号采样(关闭DMA)、找出最大值、最小值、幅值5、利用FFT计算频率6、如果相应按键按下,则通过串口打印数据
7、 通过LCD屏显示相应数据
8、清除采集到的信号数据,打开信号采集(打开DMA)
9、外部中断服务函数
10、DMA中断服务函数,响应时为采集完毕
  1. 当按键KU_UP按下时,定时器分频系数增加,采样率减小;当按键KEY1按下时定时器分频系数减小,采样率增加;当KEY0按下时,通过串口发送数据到PC机。
  2. 信号采集采用ADC+DMA+TIMER的方式,采集完成,触发DMA中断,采集完成标记位置位。

3.2、按键中断设计

  1. KW_UP、KEY1、KEY2对应的引脚PA0、PC5、PA15,对应的中断触发条件为信号上升沿、下降沿、下降沿。PA0设置为输入下拉,PC5和PA15设置为输入上拉,设置前首先开启时钟,对应程序为:
  2. PA0、PC5、PA15对应的中断通道为通道0、5、15,外部中断配置响应的模式并使能,然后配置响应的NVIC并使能NVIC,他们对应的抢占优先级都为2,副优先级为0、1、2,相应代码为(以通道1为例):
  3. 在他们的中断服务函数中,先判断相应的按键是否按下,按下则执行相应的功能,然后清楚相应的外部中断,程序如下(以K0为例):

3.3、TIMER+DMA+ADC1组成的数据采集模块

  1. 本实验用PA1口做为数据采集端口,定时器2配置为PWM模式,通过PWM,触发一次采样,改变PWM的频率,就可以改变采样率。通过DMA1,将采集的数据传送给内存,然后在处理数据。
  2. 首先使能GPIOA与ADC1的时钟,然后将PA1配置为模拟输入。ADC1选择通道1使用规则转换,配置为连续转换模式,触发方式选择T2_CC2,即定时器2,数据选择右对齐,规则顺序转换的通道数目为1,采样时间设置为cycles。
    ADC1设置完成之后,使能DAC1,并且重置指定ADC的校准寄存器进行校准。设计程序为:
  3. 首先使能定时器的时钟,计数器2的预分频值与计数值通过外部参数传入,可以设置,从而设置频率,计数器设置为向上计数方式。
    输出设置为PWM1,输出极性为低,并且设置TIM_Pulse,来设置占空比。最后使能TIM2.程序如下:
    4.使用DMA1的通道1,首先开启DMA1的时钟,将ADC1的数据传入内存,设置一次传输数据量为1024个字,内存和外设的数据位数都为16位,循环传输,优先级设置位最高。
    开启DMA1的中断,当一次DMA传输完成时,响应中断,在中断服务函数中通知一次数据采样完成,抢占优先级与副优先级都设置为0。

3.4UART设置

  1. 通过UART1将相应的数据打印出来,UART1对应的端口为PA9、PA10。根据参考手册,PA9应该设置为复用推挽输出,PA10设置为浮空输入。
    初始化UART1,首先开启GPIOA和UART1的时钟,然后设置字长为8位,一个停止位,无奇偶效验位,无硬件数据流,波特率可设置。相关程序如下:
  2. 重定向函数printf(),在工程中加入fputc(int ch,FILE *f)函数代码,并包含“stdio.h”,即可通过printf()进行串口发送数据。

3.5、FFT计算频率

  1. 我们一次连续采样1024个点,对这些点利用提供的FFT库函数进行离散傅里叶变换,变换后从频谱中找出最大的频率,该频率即为采样信号的频率。由采样定理可知,采样信号的频率要大于所采集信号频率的两倍才能恢复出信号的频谱,求得最大频率。
  2. 采样信号的频率为fus=72000000/(Tpsc),其中T为STM32定时器的计数值,psc为分频值。所以如果当k=temp时,频率取最大值,则最大频率为f=tempF=temp*fus/n,(n为一次采样的点数)。
  3. cr4_fft_1024_stm32(fftout ,fftin ,n)为使用的进行FFT变换的库函数,fftin为采集的输入信号的数组,fftout为输出的数组,n为点的个数。fftout中每个点有32位,高16位为FFT变换后的实部,低16位为虚部。对fftout进行变换,然后在求出频率的幅度最大时的k,即求出最大的频率。
    相应的程序为:

3.6 TFTLCD显示界面设计

  1. 显示屏采用正点原子的3.2寸TFTLCD显示屏,利用正点原子提供的库函数进行开发。首先调用函数”LCD_Init()”进行初始化。
  2. 然后调用函数windows()函数进行绘制基本的显示窗口,当采样完1024个点后,将相应的点在LCD屏上显示出来,即形成波形。

四、设计结果

  1. 当输入1kHz方波时,采样频率为12000Hz:
    .
    测量得到频率为996Hz,最大值571mV,最小值0V。

  2. 当输入的信号频率为5kHz时,采样率为12000Hz时,得到:


    测量得到信号的频率为5003Hz,最大值为577mV,最小值为0V。

附录


作品实物

基于STM32F103的简易示波器设计相关推荐

  1. 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现

    基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...

  2. 《Arduino开发实战指南:LabVIEW卷》6.3 基于Arduino的简易示波器

    6.3 基于Arduino的简易示波器 6.3.1 实现的功能 LabVIEW在测试测量方面是应用非常广的一款软件,本节以Arduino为信号采集硬件,设计一个简易的"示波器".能 ...

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

            前言:本文基于STM32的简易示波器项目,示波器作为嵌入式开发中必不可少的器件,其使用方式和工作原理是必须被掌握的.巧妙利用STM32可以实现媲美度非常高的示波器,本文中的简易示波器主 ...

  4. 单片机c语言数字频率计的课程设计,基于单片机的简易数字频率计设计报告(最终版)最新版...

    <基于单片机的简易数字频率计设计报告.doc>由会员分享,可免费在线阅读全文,更多与<基于单片机的简易数字频率计设计报告(最终版)>相关文档资源请在帮帮文库(www.woc88 ...

  5. 简易电子琴c语言程序,基于单片机的简易电子琴设计(C语言编程).docx

    单片机课程设计报告 基于单片机的简易电子琴设计 摘 要 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器.它在现代音乐 扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经 ...

  6. 个人项目 免费开源 基于STM32F103的oled示波器,频谱fft adc电压采集 spi接口0.96寸oled

    @基于stm32的adc检测波形 0.96oled显示(spi/iic)移植gui库(开源). 使用标准库开发,未使用dsp官方库. adc采集到电压并且在oled上显示. 支持0-3.3v电压采集显 ...

  7. 基于STM32F407的简易菜单设计+LCD+按键

    基于STM32F407的简易多级菜单设计+LCD+按键 实现原理 主要使用 双向链表 结构实现的菜单: 结构体包含7个变量,分别是菜单中功能项的个数,当前菜单标题,菜单中各功能项标题,功能项的类型,然 ...

  8. 基于单片机的简易电子琴设计(电路+程序)

    博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...

  9. 基于FPAG的简易数字频率计设计

    一.设计要求 1. 设计四位十进制的简易数字频率计,能够利用系统时钟产生1KHZ-9999KHZ方波信号,并且设计模块对1KHZ-9999KHZ的方波信号进行频率测量: 2.测量的方波频率值要在4位数 ...

最新文章

  1. [一文一命令]tail命令详解
  2. 《Xcode实战开发》——2.8节调试区域
  3. OpenCV实现图像颜色特征提取
  4. 对计算机网络的父亲,父亲节朋友圈对老爸说的话 写给父亲催泪的话简短
  5. Spark Metrics配置详解
  6. Request load 没有成功执行的原因分析
  7. 使用FastDFS在CentOS上搭建简易分布式文件系统
  8. My SQL中show命令--MySQL中帮助查看
  9. TensorFlow MNIST(手写识别 softmax)实例运行
  10. 软件项目验收汇报ppt_扔掉你收藏的PPT吧,设计院专用项目汇报模板来袭(68GB)!...
  11. NET Reflector 8 使用
  12. python如何编写温度转换_用python写温度转换
  13. XUPT 寒假算法集训第三周
  14. 电脑怎么写入便签并同步到手机版便签上?
  15. 计算机机超级用户,电脑超级密码的设置方法
  16. oracle报错——字符集不匹配
  17. 2022年长安杯比赛复现
  18. C#接口--C#基础
  19. ADC系列---噪声与误差(TI视频)
  20. UOS服务器操作系统下载RPM包和依赖

热门文章

  1. 深度学习与西储大学轴承数据集(二)
  2. Unittest简单项目
  3. AE基础教程第一阶段——20层的简单操作
  4. AE基础教程第一阶段——22旋转动画初体验
  5. AE基础教程(21)——第21章 层的属性简介
  6. 航天五院待遇2011zz
  7. ZPL II 语言编程基础
  8. AutoVue软件在电子制造行业…
  9. PostgreSQL生成测试数据
  10. 福建泉州:未来5年新建民房绿标全覆盖 鼓励发展太阳能建筑