基于STM32的简单数字示波器

混江龙づ霸主 提交于 2019-12-01 07:05:42

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!