项目一阶段问题汇总
实验室需要一个简单的串口通信界面来控制电机驱动器,从而实现对电机的控制(主要是闭环恒速,闭环位置),相关算法已经集成在驱动器里,主要是根据驱动器的手册对寄存器功能的介绍,用mfc界面进行对寄存器的操作。在编写过程中遇到了很多问题,不记下来容易遗忘,才意识到写博客的重要性。由于之前没有学习过c++,只有一些C语言的基础,涉及的问题比较初级,仅仅是为了记录问题解决的过程,在遇到相同问题时可以回忆起解决的办法。
问题1:串口控件的使用就不多说了,网上有很多控件的教程,要注意控件的更新方式,控件使用出现了崩溃的情况,是在速度框输入负转速时,程序发生了崩溃,经过网上查询相关内容,还没有解决问题,初步猜想是使用UpdateData(1); //控件--->变量 的时机出现了问题,正在排查程序里更新控件的时机,考虑使用单个控件更新来代替更新所有控件。--发现问题是在显示速度中GetDlgItem(IDC_EDIT_FWDSPD)->SetWindowText(strText);//显示到当前速度栏
//UpdateData(1);//更新控件的值 删除这句之后就解除了bug
问题2:界面中使用了teechart控件,来绘制实时的转速图像,不得不说此控件很强大,仅仅通过对控件的设置就完成了控件标题、坐标轴标题、鼠标停留显示点的坐标等功能
也通过下面的语句,放置在0.1s周期的定时器的处理函数实现了对转速的绘制。
程序为:if(status.nMotorSpd!=0x0000)//status.nMotorSpd为读回的速度
{
CSeries SpeedSeries = (CSeries)m_Chart.Series(0);
double speed=status.nMotorSpd*Direction; 定义了全局变量实现对不同方向转速的绘制
SpeedSeries.Add(speed,NULL,0);//速度不为零时绘制一个点
CAxes chartaxis=(CAxes)m_Chart.get_Axis();
CAxis chartaxisbottom=(CAxis)chartaxis.get_Bottom();
chartaxisbottom.Scroll(1,TRUE); 实现图像的移动,设置横坐标为固定个数点
}
存在的问题是:速度的方向,是否可以用驱动器来识别,现在只是实现了通过判断速度设定值的正负来设置标志Direction
使用Add函数添加点,造成图像横坐标是0.1s为单位的,想用Addxy函数实现横坐标单位为s,定义了变量x,在定时器处理函数中进行x++,而后将x*0.1设定为横坐标进行显示,但是x变量的定义,不知道放在何处,全局变量是否可以,以及如何使用。
--(类向导直接添加自定义变量?类似Direction)可以实现效果
由于使用了多个定时器,使用switch(nIDEvent)来区分各定时器的处理,ontimer函数中语句过于复杂,对图像点的时间精度造成了影响,出现了10s的离心过程只绘制了七八十个点(每个点0.1s)。猜想是定时器执行过程造成了时间延迟,导致了打点精度未知。
设置定时器回调函数是否能解决
SetTimer(
UINT_PTR
nIDEvent,
UINT
nElapse,
void
(CALLBACK* lpfnTimer
)
void
CALLBACK EXPORT TimerProc(
HWND
hWnd,
// handle of CWnd that called SetTimer
UINT
nMsg,
// WM_TIMER
UINT
nIDEvent
// timer identification
DWORD
dwTime
// system time
);
问题3:在多阶段的转速控制中,增速变换效果符合预期,减速变换效果出现了问题,速度差超过了200转问题很明显,应对离心流程的程序进行检查。
提速过程正常,但横轴时间精度明显有问题
第三阶段的300转并非没有写入..而是在执行时出现了问题,降速的速度等同于*停车的速度,*停车减速到指定速度时间过长时可能会引起pi调节器的饱和,也许解决饱和问题能减少超调。 然而在后续的实验中发现了pi正常作用的情况,怀疑是pi控制短时间失效造成超调过大。.