STM32简易示波器开发总结

試著忘記壹切 提交于 2020-02-26 12:38:28

考研失利不用准备复试了,有了空闲时间做了个示波器,带宽80Khz,输入幅度0-3.3V,带有触发功能,接近实时的波形显示和FFT计算,不过存储深度太小了只有1024个点。最近要准备工作的面试了之后有时间再完善。简单总结一下设计思路,一些疑问和今后要完善的地方,采用的基本上都是固件库开发怎么配置网上都有就不细说了。
(ps:大四辣鸡一个,半瓶水晃荡着做的,有很多知识和理解受制于自己的视野,也还有许多地方设计的不合理欢迎大家交流,家里没有杜邦线剪了一截导线大家将就看8(狗头))

一.STM32内部DA作为信号源

二.STM23内部AD不间断采样
总线72MHz,6分频,55.5个周期的采样时间,大概有160KHz的采样频率(不知道现在数字示波器还是不是和模拟的一样用扫描信号,没有仔细去找相关资料,但是感觉完全可以用足够的采样率和存储深度恢复波形)

三.DMA总线传输(单次、不循环)
总共传输1024个数据,可以设置更多点,不过本次用的是32内部的SRAM,如果想做更多点的使用外挂RAM不知道速度够不够

四.处理数据
1.触发:设置了俩种,(1)达到触发电平触发、(2)达到触发电平且为上升沿触发。T_point为触发位置,ADC_ConvertedValue为DMA传输的数据,T_value触发电平。
电平触发

int Trigger()
{
	for(T_point=0 ; T_point<NP/5 ; T_point++)
	{
		if((ADC_ConvertedValue[T_point]<T_value-1)&&(ADC_ConvertedValue[T_point]>T_value+1))
		{
			break;
		}
	}
	return T_point;
	
}
上升沿触发
int Trigger()
{
	for(T_point=0 ; T_point<NP/5 ; T_point++)
	{
		if((ADC_ConvertedValue[T_point-1]<T_value)&&(ADC_ConvertedValue[T_point+1]>T_value))
		{
			break;
		}
	}
	return T_point;
	
}

2.时域波形显示、擦除
计算一下像素点在显示区域的高度位置就行,擦除时不要清屏,直接用本次的数据设置成和背景色相同的颜色可以快很多。下一步打算可以做到更改x轴刻度,初步设想是更改显示AD采样数据的间隔就行。还有暂停之后可以左右移动波形,同样更改AD采样数据的位置即可。

3.FFT
采用官方的库,注意修改一下头文件。显示擦除和时域波形同理。

4.数据测量
最大值最小值平均值很好做,频率测量采用的是FFT的数据。

5.画坐标线

注:3.4.运算量较大,在时域波形显示100帧后更新一次,擦除波形时会覆盖坐标线,所以重新画的步骤跟在擦除之后

五.DMA重新传输下一帧的数据点,重复数据处理

不知道是为什么显示的时域波形总有相位不连续的点,所以波形还是不太稳,现在也不敢肯定是不是DA的问题,等回学校了拿示波器和信号发生器看看吧
等这阵忙完了打算先把输入端的电路做了,现在还没办法采集负电压,之后把该用中断的用上,可以试一试把这个搬上操作系统的开发,或者做高速AD和FPGA组合,尽量增大带宽。
文件就不上传了,想要的同学私信我8

.

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