MFC的固高环形倒立摆GRIP2002实验平台

 固高环形倒立摆GRIP2002是基于GT-400-SV-PCI运动控制卡的一个二级环形倒立摆(摆杆和连杆两根杆的摆),固高公司提供了一个DOS环境下的Demo和MATLAB 7.0的simulink的Demo,但DOS版本貌似不能用,下面是在VS2008+SP1平台下用VC做的控制程序,中间拖延了一阵子,今天算是全部完成,这个小实验平台提供了三个基本实验,第一个是编码器测试,第二个是测试伺服电机,第三个是主要的,通过LQR算法控制倒立摆的杆竖起来,即Swing-up Control实验。。。



实验效果图

 


 


 


 


 

Swing-up Control 用VC控制的原理就是设置一个定时器,在相应函数里对倒立摆施加控制,这里的定时由于是5ms,非常下的时间,一般的方法不行,需要利用多媒体定时器。


//启动定时

UINT CGRIP2002DemoDlg::CreateTimer()

{

//create the timer


// Create a periodic timer

timeBeginPeriod(1);

    gl_uTimerID = timeSetEvent(5,1,TimerHandler,(DWORD)this,TIME_PERIODIC); //5ms定时,最小是1ms


return gl_uTimerID;


}

//取消定时

void CGRIP2002DemoDlg::DestroyTimer()

{

if (m_bShiYanFlag)

{

timeKillEvent(gl_uTimerID);

timeEndPeriod(1);


m_bShiYanFlag = FALSE;

m_start = 0;

m_safety = 0;

m_pend = 0;

//offset = 0;

m_vel = 0;

m_acc = 0;

TRACE0("swing-up control is stoped...\n");

}

}


//

//多媒体定时器回调函数,这里面控制倒立摆

void CALLBACK  TimerHandler(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)

{

short rtn;

long actl_pos;

CGRIP2002DemoDlg* pThis = (CGRIP2002DemoDlg *)dwUser;

GT_Axis(2);

GT_GetAtlPos(&actl_pos);             //get angle of axis 2 

pThis->m_angle = ENCODE2*actl_pos;   


 GT_Axis(3);

 rtn=GT_GetAtlPos(&actl_pos);//error_msg(rtn);

 pThis->m_angle2 = ENCODE2 * actl_pos;


 GT_Axis(1);

 GT_GetAtlPos(&actl_pos);               /* get position of axis 1 */

 pThis->m_pos=ENCODE1*actl_pos; 

//TRACE1("get pos of axis 1 where is %f\n",pThis->m_pos);


  // get speed

 pThis->m_posDot = (pThis->m_pos - pThis->m_pos0) / INTPERIOD;

pThis->m_angleDot = (pThis->m_angle - pThis->m_angle0) / INTPERIOD;

 pThis->m_angleDot2 = (pThis->m_angle2 -pThis->m_angle02 ) / INTPERIOD;

 

 pThis->m_pos0 = pThis->m_pos;

 pThis->m_angle0 = pThis->m_angle;

 pThis->m_angle02 = pThis->m_angle2;


//安全检查

if (pThis->handle_safety() ==-1) return;


//归一化摆杆1角度,使之在0~2*PI之间

pThis->m_ang_2pi = pThis->m_angle;

while (pThis->m_ang_2pi < 0)

{pThis->m_ang_2pi += 2 * M_PI;};


while (pThis->m_ang_2pi >= (2*M_PI))

{pThis->m_ang_2pi -= 2 * M_PI;};


//归一化摆杆2角度

pThis->m_ang_2pi2 = pThis->m_angle2 + pThis->m_ang_2pi - M_PI;


// pThis->m_ang1=pThis->m_ang2;                            //保存最近四次的角度值,都为负值

// pThis->m_ang2=pThis->m_ang3;

// pThis->m_ang3=pThis->m_ang4;

// pThis->m_ang4=-(pThis->m_angle);


if(pThis->m_bShiYanFlag)                         //进入控制程序

{

pThis->m_vel=0;

pThis->m_acc=0;

 

TRACE1("m_safety = %d\n",pThis->m_safety);

switch(pThis->m_start)

{

case 1:                 

pThis->m_start = 2;

pThis->enable_servo();

break;

case 2:

if ((fabs(pThis->m_ang_2pi-M_PI) <= (pThis->m_entryAngle)) && (fabs(pThis->m_ang_2pi2) <= (pThis->m_entryAngle)))

{

pThis->anti_cran_two();

pThis->m_start = 5;

pThis->m_pend = 1;

}

break;

case 5:

if (pThis->m_pend == 1)

pThis->anti_cran_two();

break;

}

 

//控制器输出/

TRACE1("m_ang_2pi2 = %f,,,,,,, \n",pThis->m_ang_2pi2);

TRACE3("m_start=%d,m_acc=%f,m_vel=%f\n",pThis->m_start,pThis->m_acc,pThis->m_vel);

 

   GT_ClrSts();

   GT_SetVel(pThis->m_vel);

   GT_SetAcc(pThis->m_acc);

   GT_Update(); 


}

}

其他还有很多代码。。。

//这是 启动 按钮的代码

void CGRIP2002DemoDlg::OnOK()

{


if (m_bAlarmOn) 

{

AfxMessageBox(_T("当前有轴报警,必须消除才能继续运行!"));

return;

}

short rtn=0;

int nID;

int nPage;

long pos;

double vel;

double acc;

TCHAR str[20];

KillTimer(1);


nID = GetCheckedRadioButton(IDC_RADIO3,IDC_RADIO5);

nPage = m_wndTab.GetActiveTab();


switch(nID)

{

case IDC_RADIO3:  //encoder test

SetTimer(1, 10, NULL);   //定时器

break;

case IDC_RADIO4:   //servo motor control

if (nPage == 0)

{

//T

m_wndPage1.GetDlgItemText(IDC_EDIT1,str,20);

pos = _tstol(str);

m_wndPage1.GetDlgItemText(IDC_EDIT2,str,20);

vel = _tstof(str);

m_wndPage1.GetDlgItemText(IDC_EDIT3,str,20);

acc = _tstof(str);


rtn+=GT_PrflT();

rtn+=GT_SetPos(pos);

rtn+=GT_SetVel(vel);

rtn+=GT_SetAcc(acc);

rtn+=GT_Update();

else

{

//V

m_wndPage2.GetDlgItemText(IDC_EDIT2,str,20);

vel = _tstol(str);

m_wndPage2.GetDlgItemText(IDC_EDIT3,str,20);

acc = _tstof(str);


rtn+=GT_PrflV();

rtn+=GT_SetVel(vel);

rtn+=GT_SetAcc(acc);

rtn+=GT_Update();

}

Sleep(200);

break;


case IDC_RADIO5:  //swing-up control

if (m_safety == 0 && m_start == 0)

{

TRACE0("swing-up control\n"); 

CreateTimer();

//注册空格键键为紧急键

::RegisterHotKey(GetSafeHwnd(),WM_EMERGENCY_HOTKEY,/*MOD_ALT | MOD_CONTROL*/NULL,VK_SPACE);  

SetWindowText(_T("环形二级倒立摆实验平台(Swing-up Control 急停按空格键)"));

//

m_acc = 0;

m_vel = 0;

m_pend = 0;

m_offset = 0;

m_pos = m_pos0 = 0;

m_angle = m_angle0 = 0;

m_angle2 = m_angle02 = 0;

m_posDot = m_angleDot = 0;


m_bShiYanFlag = TRUE;

m_bSuanFaFlag = TRUE;  //LQR

m_start = 1;

//Sleep(1000);  //延迟1秒

}


break;

default: 

break;

}

error_msg(rtn);


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《长调》 :寻找我们共同失去的天堂

《长调》&#xff08;大众文艺出版社2008年1月出版&#xff09;的作者千夫长是蒙古人。他出生于古老的科尔沁草原&#xff0c;如今却生活在中国最现代化的商业前沿——深圳。他的小说更是与现代化这个词格格不入&#xff0c;他的小说地理是远隔几千里之外的故土草原&#xff0c…

说两句电视剧《东归英雄》

这几天熬夜看欧锦赛&#xff0c;过瘾&#xff0c;毕竟四年一次嘛。恰好电视剧《东归英雄》也开始在中央8套播出&#xff0c;我断断续续看了几集&#xff0c;先不多论拍的好坏&#xff0c;贴几张剧照欣赏一下。 导演是麦丽斯。以前看过她和她丈夫塞夫共同执导的电影《东归英雄传…

begin:块名

begin:块名 在VerilgHDL语言中&#xff0c;可以给每个块取一个名字&#xff0c;只需将名字加在关键词begin或fork后面即 可。这样做的原因有以下几点。 这样可以在块内定义局部变量&#xff0c;即只在块内使用的变量。这样可以允许块被其它语句调用&#xff0c;如被disable语…

stl

#include <iostream> #include <vector> //常见6种STL容器 deque list queue priority_queue stack vector #include <algorithm> //通用算法 #include <fstream> //文件 #include <string> using namespace std; int main() { cout&l…

“所有一切”和“介于之间”:欧美“新媒体”艺术

6月15日&#xff0c;在北京798艺术区的映艺术中心看了欧美8位艺术家的展览。这些作品被称为“新媒体艺术”&#xff0c;主题为All&#xff08;所有一切&#xff09;和Between&#xff08;介于之间&#xff09;。这些艺术家来自美国、英国、西班牙、德国和瑞士。策展人是Alison …

Ubuntu下无法安装sun-java6-jdk的解决办法

安装sun-java6-jdk出现以下错误 rootstu-system:/home# sudo apt-get install sun-java6-jdk Reading package lists... Done Building dependency tree Reading state information... Done Package sun-java6-jdk is not available, but is referred to by another package. T…

过年回家,走之前留一个用GDI+实现的略缩图控件

这是一个加载文件夹图片略缩图的控件&#xff0c;支持多种图片格式~~用法也比较简单&#xff08;1&#xff09;、源代码//头文件ListImageCtrl.h #pragma once #include <vector>//note:need GDI// ListImageCtrl.h : header fileclass CListImageCtrl : public CListCt…

如何避免偶然的锁存器和%0h

如何避免偶然的锁存器和%0h 如果用到if语句&#xff0c;最好写上else项。如果用case语句&#xff0c;最好写上default项。遵循上面两条原则&#xff0c; 就可以避免发生这种错误&#xff0c;使设计者更加明确设计目标&#xff0c;同时也增强了Verilog程序的可读性可以通过在%和…

记住北京历史上的灾难

读《北京灾害史》&#xff0c;不免令人心惊肉跳。原来古老的北京曾经遭遇过那么多的灾难和浩劫。洪涝、干旱、蝗灾、瘟疫和地震&#xff0c;几乎所有的自然灾害都光顾过北京&#xff0c;尤其是地震。记得1976年唐山大地震过后&#xff0c;民间曾流传一种说法&#xff0c;说北京…

我喜欢荷兰队,可是今天我爱上了俄罗斯

希丁克 我一直喜欢荷兰队&#xff0c;可是今天早晨我爱上了俄罗斯。我喜欢上了那个像高中生一样羞涩的阿尔沙文、笑面绅士狙击手帕甫柳琴科、长相酷似年轻时屠格涅夫的边锋托尔宾斯基、22岁的天才门将阿金费耶夫以及他们的主帅、足球国际主义者、荷兰人希丁克。刘建宏说荷兰是被…

图片浏览控件。。

代码暂时不上传。看看图片得了、 图片可以进行各种操作

Ubuntu15.04如何添加163源

具体的源地址如何获取参见以下网站&#xff1a; http://wiki.ubuntu.org.cn/源列表#Vivid.2815.04.29.E7.89.88.E6.9C.AC sudo gedit /etc/apt/sources.list 将下列源复制粘贴至最前面&#xff0c;然后保存退出 deb http://mirrors.163.com/ubuntu/ vivid main restricted univ…

使用MATLAB和Vivado读取txt文件

使用MATLAB和Vivado读取txt文件 MATLAB处理十六进制的数据: 将你的16进制数据保存到txt文件中,打开MATLAB选择workspace->importdata,导入txt文件中的数据,这样会得到cell格式数据(假设名字为textdata),调用函数hex2dec即可,a=hex2dec(textdata),a就是你所想要的数…

意大利终于付出了代价

今天凌晨在西班牙与意大利的4分之一淘汰赛中,意大利这个老爷车终于掉链子了。这场比赛可说是进攻战胜了保守&#xff0c;诚实消灭了狡猾。从他们排出的不思进取的阵型&#xff0c;到迪纳塔莱佯装受伤受到全场嘘声开始&#xff0c;意大利就注定了要输掉他们一直以来的运气。 看着…

电影《蒙古王》剧照

电影《蒙古王》&#xff0c;由德国、俄罗斯和哈萨克斯坦合拍&#xff0c;影片讲述了成吉思汗早年的故事&#xff0c;拍摄期间曾在蒙古、哈萨克斯坦和中国境内的新疆地区取景。影片的导演是俄罗斯人谢尔盖波德罗夫&#xff0c;演员则来自12个国家&#xff0c;中国演员孙红雷出演…

蒙特卡罗方法求一个三维积分(论坛帮顶)

在vs2008 sp1下编译 http://topic.csdn.net/u/20120312/13/a979f330-ff73-4e5d-ae92-d463c93de5bf.html?seed498140863&r77861318#r_77861318 #include <iostream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <mall…

CRC校验

CRC校验 1 基本原理 CRC校验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列。附加一个r位二进制序列、附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据…

64位ubuntu kylin 16.04下tiny4412开发环境搭建

以下内容均来自互联网&#xff0c;我只是大自然的搬运工。 ubuntu用的是ubuntukylin-16.04-desktop-amd64.iso 1&#xff0c;ubuntu和windows时间不统一解决办法&#xff1a; vi里一条命令解决所有问题 sudo timedatectl set-local-rtc 1 2&#xff0c;安装vim sudo apt in…

温网告别了两位美女:伊万和莎娃

在刚刚结束的英国温布尔登网球公开赛女子第三轮的比赛中&#xff0c;我国选手郑洁以6比1和6比4&#xff0c;直落两局淘汰了塞尔维亚美女伊万诺维奇&#xff0c;进入16强&#xff0c;暴了本届温网的最大冷门。伊万诺维奇目前在女子网球排名中名列第一&#xff0c;是当今女子网坛…

一个有意思的CStatic和combobox以及Cedit控件结合使用

如图。。源代码下载地址 http://download.csdn.net/detail/hemmingway/4187082 这是编辑字符串。。。 这是用组合框选择字符串。。。。 使用方法是托一个Static Text控件到窗口上&#xff0c;调整好大小&#xff0c;修改ID&#xff0c;取一个CEditStatic 的变量类型 在头文件里…