看到网上很多人做了自制示波器,都是硬件实现的。最近学习了labwindows/cvi,所以萌生出自制一台串口示波器的想法。
下位机采用stm32,通过自带AD采集电压值,然后通过DMA传至串口,发送到上位机。
下面主要叙述一下上位机软件的设计。
利用CVI自带的控件库来创建界面。波形显示控件是stripchart。
软件启动时,自动配置串口:
OpenComConfig (comnum,"com6",115200,0,8,1,512,512); //打开并配置串口,串口号为comnum(定义好了),波特率为115200
FlushInQ (comnum); //清除接收队列
FlushOutQ (comnum); // 清除输出队列
然后绑定串口回调函数(相当于调用串口中断)
InstallComCallback (comnum, LWRS_RECEIVE, 1, 0, Event_Char_Detect_Func, 0); //绑定串口事件回调函数
然后开始写串口中断函数:
void CVICALLBACK Event_Char_Detect_Func (int portNo,int eventMask,void *callbackData)
{
unsigned int strLen=GetInQLen(comnum),val; //获取串口接收的数据缓冲区长度
x[0]=ComRdByte(comnum);
}
一般的示波器都有一个功能是调节时基周期。本项目中,也有这样功能。
添加一个ringknob,把他的变量设置上特定的值:
然后在他的回调函数中将值附给一个全局变量(time_flag):
int CVICALLBACK timediv (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_RINGKNOB_2, &time_flag);
break;
}
return 0;
}
然后再创建四个定时器,分别给不同的值,回调函数如下:
int CVICALLBACK timer002 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int val;
if(time_flag==2)
{
switch (event)
{
case EVENT_TIMER_TICK:
GetCtrlVal(panelHandle,PANEL_BINARYSWITCH,&val);
if(val)
{
PlotStripChartPoint(panelHandle,PANEL_STRIPCHART,x[0]/10);
SetCtrlVal(panelHandle,PANEL_LED,1);
}
else
{
SetCtrlVal(panelHandle,PANEL_LED,0);
}
break;
}
}
return 0;
}
其他的功能还没有添加,等完善了再补。