基于STM32的简单数字示波器
来源:互联网 发布:混沌战域仙魂进阶数据 编辑:程序博客网 时间:2024/06/05 05:38
1. 平台说明
基于STM32F103ZET6芯片最小系统 + TFT液晶屏。
用到了:STM32内部ADC,DAC,DMA,FSMC等等。。
2. 基本原理
(1). 用STM32芯片内部的AD连续采样
(2). 用DMA传送到数据缓冲区
(3). 把采样结果转化为液晶屏上的坐标位置
(4). 在液晶屏上面画出来波形
(5). 回到(1)
一言概之,采样&画图。
3. 结果展示
这个三角波是用STM32内部的DAC产生。
4. 遇到的问题
(1). 闪屏问题
问题描述:更新波形时候闪屏严重。
原因:一次重画,需要经历三次过程,首先清空波形图所在矩形,然后画波形坐标的格子(方便查看电压大小),最后画波形,因为刷屏速度本身不快,所以刷三遍后,闪屏很严重。
想到了三种解决方法:在重画之前,先进行预处理,处理方式:
a方式: 每次先处理一条竖线上的数据,然后画一条竖线,处理包括刷屏,格子,波形。这样处理一条,画一条,一次刷屏即可完成重画。
b方式:开辟一块与屏幕像素数相同的缓冲区(16位),缓冲区与屏幕坐标一一对应,每次刷屏操作都是修改缓冲区,当完成所有操作,然后再把缓冲区内容画到屏幕上。
c方式:每次刷屏仍需三次操作,不过,之前是针对整个屏幕,而现在针对一条线,每次先画完一条竖线,然后再画完下一条。
理论上来说,b方法效果最好,操作也较简单。c方式效果相对最差,但操作方法最简单。
b方式只是空想,空间上不符合现实。对于单片机而言,RAM本就不多。假如使用320*240屏,一共76800个像素点,每个像素点用RGB565的话,一个点需要两个字节,那一共就是150KB。想法不错,但是严重脱离群众。
a方式可行,但是数据预处理也比较麻烦,只比c方式好了一点点,因此除非要求特高。。。
所以采用c方式,效果也不错,没有明显的闪屏了。
(2). DMA问题
问题描述:DMA连续传送时,在画波形时数据可能部分被修改。而单次传输,如何快速重启DMA?
解决方法(DMA重启传输): DMA初始化时选择单次传输,传输过程中,BufferSize会改变,实测数据位宽也改变了。因此先关闭DMA,然后重新设置BufferSize和数据位宽,再开启DMA就好了。
代码:
DMA_Cmd(DMA1_Channel1, DISABLE);DMA_SetCurrDataCounter(DMA1_Channel1,n);DMA1_Channel1->CCR &= 0xFFFFF0FF;DMA1_Channel1->CCR |= 0x00000900; DMA_Cmd(DMA1_Channel1, ENABLE);
5. 功能拓展
自己焊接了几个按键,可以实现暂停,调节时间宽度的功能。调节时间宽度,通过改变ADC采样时间来修改,ADC共有8种采样时间,因此可以调节8个时间宽度。
代码比较长,内容也比较多,所以不能细细描述。
有兴趣的可以去下载代码:http://download.csdn.net/detail/u013771867/9548642
0 1
- 基于STM32的简单数字示波器
- 基于多功能DAQ卡的虚拟数字示波器的设计
- 基于S12的简易数字示波器的设计
- 基于FIFO IDT7202-12的数字存储示波器
- 数字示波器的使用
- 数字示波器的用法
- 当代数字示波器的发展
- 数字示波器的激烈竞争
- 数字示波器的使用情况
- 基于USB的虚拟示波器
- 基于多功能DAQ卡的虚拟数字示波器的设计 (图)
- 示波器使用的简单介绍
- 基于STM32的简单电子书的实现
- 基于STM32最简单的呼吸灯
- 用STM32内置的高速ADC实现简易示波器
- 简易数字存储示波器
- 数字存储示波器
- 数字示波器FFT分析
- setsockopt()函数使用详解
- CSAPP: Bomb Lab(1)
- 欢迎使用CSDN-markdown编辑器
- tomcat下jndi的三种配置方式
- Java 继承Thread类和实现Runnable接口的区别
- 基于STM32的简单数字示波器
- 十分钟理解 Java 中的动态代理
- Excel -- 自动填充
- 前端学习_Series2_01.JavaScript_03
- Java通过WebSocket WebRTC实现视频通话实例
- Android APK安装后点击[打开]与[完成]的区别
- 学习路上的鸡汤
- Mac下清空DNS缓存
- lua防止访问不存在的全局变量