提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文基于本人对应开源工程[对应b站链接]所编写的编程思路,旨在分享关键部分的编程方法,来教授大家制作属于自己的示波器。
对应的原理图见附录
本文章将同步至b站专栏
一、示波器采样部分
1.ADC采集
没什么好说的,找个支持ADC的单片机拿来用就好了,同时记得把采样速度调最高
2.定时采集
为保证采样间隔的准确性,这里使用的方法是模拟STM32的定时器ADC触发模式。但一般的51单片机不支持也没有这种功能,因此这里使用定时器中断触发的方式来模拟这种过程,如下代码所示
u8 en_adc;//中断延时控制位
int main()
{
...略
for(i=0;i<adc_length;i++)
{
adc_db[i]=get_adc();
en_adc=1;
while(en_adc);
}
...略
}
void TM0_Isr() interrupt 1
{
en_adc=0;
}
主函数内,在每一位ADC采集完后都会等待en_adc控制位变成0,这样就可以通过修改定时器的重装值来修改定时器进入中断的时间,从而达到定时采集的效果。
需要注意,进入中断的速度有限,在32M的主频下最高进入中断速率是200k次,再高的速率,即使修改定时器重装值也无济于事。若需要再提高采样速率,就需要使用硬件PWM触发ADC了。本人将在新版本的STC示波器更新这一功能又挖坑了(笑
二、数据处理部分
1.触发
预先设定一个触发电平,然后依次对采样数据进行比较即可
2.数据计算
要怎么算怎么算,最高最小值比较,其他数据按照一般的统计学方法计算即可
三、显示部分
1.波形显示
使用简单的画线函数,随后依次画线即可
做到不闪烁的效果可以预先缓存上一次显示的波形,随后在显示新波形前先运行一次旧波形,便可以达到不闪烁的效果,如下方代码所示
Gui_linemap(db_old,x+1,y,h,l-1,BLACK); //旧波形
Gui_linemap(db,x+1,y,h,l-1,wave_col); //新波形
其中,Gui_linemap是画波形函数,其代码如下
void Gui_linemap(u8 *db,u16 x,u16 y,u16 h,u16 l,u16 color)
{
u8 i;
for(i=0;i<l-1;i++)
{
LCD_DrawLine(i+x, *(db+i)+y, i+x,*(db+i+1)+y,color);
}
}
2.数据显示
没啥好说的,调用对应函数即可
需要注意,51单片机调用sprintf将会大大增加程序存储空间(-9级优化将会增加6kb),因此老老实实拼接把。
四、调试注意点
善用keil设置页面的编译选项,一般来说比较吃紧的是程序空间,善用下图部分便可以很好的来节省程序空间。
待补充。。。
总结
本文介绍了STC示波器的部分关键点,希望大家可以从中学习,做成属于自己的示波器。
附录
版权声明:本文为CSDN博主「Eltecz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Eltecz/article/details/122293592
暂无评论