本帖最后由 ntwhq 于 2016-10-11 10:01 编辑
本坛FoieDEEEE_仲敬 同学用arduino做的示波器是一个创新,对我很有启发,仔细学习和研究了他的程序,发现有一缺陷:采集一个数据,就把数组所有数左移一下,并把整个屏幕刷新一次,这样两次采集数据之间的时间很长,所以速度很慢,只能显示几Hz的信号。因此我决定自己写一下代码,我采用先把所有一屏所需数据全采集好再作处理的方法,明显提高了工作速度,最简洁的代码如下:
#include <U8glib.h> //声明库
U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏 13=SCLK, 12=SID, 11=CS
int x,y; int Buffer[128];//
void setup( ) { }
void loop( )
{
for(x = 0;x < 128;x++) //信号采样
Buffer[x] = 63-(analogRead(A0)>>4);
u8g.firstPage(); //清屏
do //显示
{
for(x = 0;x < 127;x++)
u8g.drawLine(x,Buffer[x],x,Buffer[x+1]); //画相邻两点连线
}
while(u8g.nextPage( ));
}
用arduino代码,完成一次AD转换约需112微秒,这样显示频率在1500Hz以下的输入信号的波形。
如果想在程序上加坐标轴和边框,代码如下:
#include <U8glib.h> //声明库
U8GLIB_ST7920_128X64_4X u8g(13, 12, 11); // 声明液晶屏 13=SCLK, 12=SID, 11=CS
int x,y; int Buffer[128];
void setup( )
{
analogReference(INTERNAL); //ADC使用单片机内部1.1V基准
}
void loop( )
{
for(x = 0;x < 128;x++) //信号采样
Buffer[x] = 63-(analogRead(A0)>>4);
u8g.firstPage(); //清屏
do //显示
{
for(x = 0;x < 127;x++)
u8g.drawLine(x,Buffer[x],x,Buffer[x+1]); //画相邻两点连线
u8g.drawLine(64,0,64,63); // 画坐标轴
u8g.drawLine(0,32,128,32);
for(x=0;x<128;x+=8) //画坐标轴刻度
u8g.drawLine(x,31,x,33);
for(x=0;x<64;x+=8)
u8g.drawLine(63,x,65,x);
u8g.drawFrame(0,0,128,64); //画边框
}
while( u8g.nextPage( ));
}
下载后显示的波形:
可在此基础上对程序不断进行完善,增加其它功能。
最近版本的功能如下图:
接线图:
U8G库
本制作在我写的这本书里有详细介绍:《玩转Arduino电子制作》
|