倒立摆初步调式程序_程序调式
倒立摆初步调式程序由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“程序调式”。
/*/***************************************************** 此为倒立摆程序,共分为六个模式
//************************************************ *************************************************** *********************************************************/ #include #include #define uint unsigned int #define uchar unsigned char sbit A1=P2^0;//步进电机方向控制 sbit A2=P2^1;//步进电机的速度调整 sbit A3=P2^2;//待定接口 sbit A4=P2^3;// 待定接口
sbit B1=P1^0;//按键接口由模式1到模式6,模式6必须在完成模式5所设定功能启动 sbit B2=P1^1;sbit B3=P1^2;sbit B4=P1^3;sbit B5=P1^4;sbit B6=P1^5;
sbit Zx=P3^2;
//增量式编码器接口z用于判断起点 sbit Ax=P3^3;//A,B联立用于判断方向 sbit Bx=P2^4;
sbit rs=P2^5;
//1602的数据/指令选择控制线
sbit rw=P2^6;
//1602的读写控制线
sbit en=P2^7;
//1602的使能控制线
void moshi1();//倒立摆的不同模式函数 void moshi2();void moshi3();void moshi4();void moshi5();void moshi6();//*********************************************** //lcd显示函数声明
void fuzhi1(uchar n2,uchar n3);void fuzhi(uchar n2,uchar n3);void lcd_w1(uchar ff);void lcd_w2(uchar dat);void lcd_init();void display();
//************************************************ //pid参数及其计算函数声明 void PID_init();void chushihua();float PID_jisuang(float shuzhi);//************************************************** void dianji(int v,int s,char m);//电机函数
int zhuanghua(float shijizhi1);//pid控制量转化为电机运转角度函数
float zengliangzhi,jiaodu,Py;
uchar flag=1,a=0,j=0,j1=0,su=0,time,time1,time2,y=0;uchar table[]={“jiaodu1=00.00”};uchar table1[]={“p=0000,x=0;”};uint mc,n,Pw,d1,d2,d3,d4,d5,m1;//********************************************************* //延时函数 void deplay(uint ms){
uchar i;
while(ms--)
for(i=0;i
} //*********************************************
void main(){
PID_init();
chushihua();
while(1)
} //************************************************* void chushihua(){ {
while(B1)
moshi1();while(B2)
moshi2();while(B3)
moshi3();while(B4)
moshi4();while(B5)
moshi5();
}
EA=1;
//开总中断1优先级
TMOD=0x01;
//T0定时方式1 TH0=(65536-200)/256;
TL0=(65536-200)%256;
} //****************************************************** void bianmaA()interrupt 2 {
if((time1-time2)>=2)
{
time2=time1;if(Bx)
IT0=1;IT1=1;EX0=1;PX0=1;
//下降沿触发
//下降沿触发
//开外部中断0 //外部中断0高
TR0=1;
//启用定时器T0 ET0=1;
//控制打开T0
j++;
else
j1++;
}
} //******************************************** void bianmaZ()interrupt 0 {
EX0=0;
EX1=1;
PX1=1;flag=0;}
//*********************************************** void time0()interrupt 1 {
TL0=(65536-200)%256;TH0=(65536-200)/256;su++;time++;while(time==5){
time=0;
time1++;
} } while(su==a)
//脉冲频率调节
{
su=0;Pw++;}
if(su
A2=0;
else
A2=1;
//************************************** //模式1实现倒立摆左右大于60度角功能,具体再看;
void moshi1(){
dianji(6,100,1);
dianji(6,100,0);
} //*************************************** //模式1实现倒立摆运转至少一周功能;具体再看; void moshi2(){
dianji(6,200,1);
dianji(6,200,0);} //*************************************** //模式1实现倒立摆摆杆拿到左边165度自平衡功能;并显示角度(100次测量)具体再看; void moshi3(){
while(flag)
{ a=6;
Pw=0;
A1=1;
}
if(1)
{
jiaodu=(j-j1)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,1);
y=1;
}
else { a=0;
jiaodu=(j1-j)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,0);
y=0;} m1++;
if(m1==100)
{
d1=((int)(jiaodu*100))/1000;
d2=((int)(jiaodu*100))%1000/100;
d3=((int)(jiaodu*100))%1000%100/10;
d4=((int)(jiaodu*100))%1000%100%10;
fuzhi(d1,8);
fuzhi(d2,9);
fuzhi(d3,11);
fuzhi(d4,12);
d1=mc/1000;
d2=mc%1000/100;
d3=mc%1000%100/10;
}
d4=mc%1000%100%10;
d5=y;
fuzhi1(d1,2);
fuzhi1(d2,3);
fuzhi1(d3,4);
fuzhi1(d4,5);
fuzhi1(d5,9);
display();
m1=0;
} //************************************************************ //模式1实现倒立摆摆杆拿到右边165度自平衡功能;并显示其角度(100次测量)具体再看; void moshi4(){
a=6;
Pw=0;
while(flag)
{
A1=0;
}
if(j>j1)
{
jiaodu=(j-j1)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,1);
y=1;}
else
{
jiaodu=(j1-j)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,0);
y=0;} m1++;if(m1==100)
{
d1=((int)(jiaodu*100))/1000;
d2=((int)(jiaodu*100))%1000/100;
}
d3=((int)(jiaodu*100))%1000%100/10;
d4=((int)(jiaodu*100))%1000%100%10;
fuzhi(d1,8);
fuzhi(d2,9);
fuzhi(d3,11);
fuzhi(d4,12);
d1=mc/1000;
d2=mc%1000/100;
d3=mc%1000%100/10;
d4=mc%1000%100%10;
d5=y;
fuzhi1(d1,2);
fuzhi1(d2,3);
fuzhi1(d3,4);
fuzhi1(d4,5);
fuzhi1(d5,9);
display();
m1=0;
} //********************************************************* //模式1实现倒立摆摆杆由低到最高点平衡功能,平衡后按下B6实现单方向旋转一周;具体再看; void moshi5(){
if(!flag)
{
if(j>j1)
{
jiaodu=(j-j1)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,1);
} else {
jiaodu=(j1-j)*0.36;y=1;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);
dianji(6,mc,0);
y=0;} m1++;
if(m1==100)
{
d1=((int)(jiaodu*100))/1000;
d2=((int)(jiaodu*100))%1000/100;
d3=((int)(jiaodu*100))%1000%100/10;
d4=((int)(jiaodu*100))%1000%100%10;
fuzhi(d1,8);
fuzhi(d2,9);
fuzhi(d3,11);
fuzhi(d4,12);
d1=mc/1000;
d2=mc%1000/100;
d3=mc%1000%100/10;
d4=mc%1000%100%10;
d5=y;
fuzhi1(d1,2);
fuzhi1(d2,3);
fuzhi1(d3,4);
fuzhi1(d4,5);
fuzhi1(d5,9);
display();
m1=0;
}
} else {
a=6;
Pw=0;
while((Pw
{
A1=1;
}
Pw=0;
while((Pw
{
A1=0;
} } while(B6)
{
if(((j-j1)>=2)&&((j-j1)
{
a=50;A1=1;
//此为功能6
}
} else
{
if(j>j1)
jiaodu=(j-j1-5)*0.36;else
jiaodu=(j1-j-5)*0.36;
Py=(int)PID_jisuang(jiaodu);
mc=zhuanghua(Py);dianji(6,mc,0);
} }
//************************************************** //pid算法 struct _pid
{
float shijizhi;
//定义实际值
float piancha;
//定义偏差值
float piancha_1;
//定义上一个偏差值
float piancha_2;
//定义最上前的偏差值
float Kp,Ki,Kd;
//定义比例、积分、微分系数
}pid;//****************************************************** //数字增量式pid参数值的设定 void PID_init(){
pid.shijizhi=0.0;
pid.piancha=0.0;
pid.piancha_1=0.0;pid.piancha_2=0.0;
pid.Kp=2.0;pid.Ki=0.25;
pid.Kd=0.5;}
//********************************************************** //数字增量式pid计算误差 float PID_jisuang(float shuzhi){
pid.piancha=shuzhi;
zengliangzhi=pid.Kp*(pid.piancha-pid.piancha_1)+pid.Ki*pid.piancha+pid.Kd*(pid.piancha-2*pid.piancha_1+pid.piancha_2);
pid.shijizhi+=zengliangzhi;
pid.piancha_2=pid.piancha_1;
pid.piancha_1=pid.piancha;
return pid.shijizhi;} //*************************************************************** //电机调整角度模块 void dianji(int v,int s,char m){
} //****************************************** //pid控制量转为步进电机角度函数 int zhuanghua(float shijizhi1){
} float dianjizhuangtai=0.75*sin(shijizhi1);int dianjishuchu=(int)(dianjizhuangtai*127.4);return dianjishuchu;a=v;Pw=0;while(Pw
void lcd_w1(uchar ff)//1602写命令函数
{
rs=0;
//选择指令寄存器
rw=0;
//选择写
P0=ff;
//把命令字送入P2
deplay(5);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,命令送入1602的8位数据口
en=0;}
void lcd_w2(uchar dat)
//1602写数据函数
{
rs=1;
//选择数据寄存器
rw=0;
//选择写
P0=dat;
//把要显示的数据送入P2
deplay(5);
//延时一小会儿,让1602准备接收数据
en=1;
//使能线电平变化,数据送入1602的8位数据口
en=0;}
void lcd_init()
//1602初始化函数
{
lcd_w1(0x38);
//8位数据,双列,5*7字形
lcd_w1(0x0c);
//开启显示屏,关光标,光标不闪烁
lcd_w1(0x06);
//显示地址递增,即写一个数据后,显示位置右移一位
lcd_w1(0x01);
//清屏
}
void display(){
lcd_init();
//液晶初始化
lcd_w1(0x80);
//显示地址设为80H(即00H,)
if(1)
{
for(n=0;n
//将table1[]中的数据依次写入1602显示
{
lcd_w2(table[n]);
deplay(1);
}
lcd_w1(0x80+0x40);//重新设定显示地址
for(n=0;n
//将table1[]中的数据依次写入1602显示
{
lcd_w2(table1[n]);
deplay(1);
}
}
//***************************************** void fuzhi(uchar n2,uchar n3)
{
switch(n2){
case 0:table[n3]='0';break;case 1:table[n3]='1';break;case 2:table[n3]='2';break;case 3:table[n3]='3';break;case 4:table[n3]='4';break;case 5:table[n3]='5';break;
}
}
} case 6:table[n3]='6';break;case 7:table[n3]='7';break;case 8:table[n3]='8';break;case 9:table[n3]='9';break;default:break;
void fuzhi1(uchar n2,uchar n3)
{
switch(n2){
case 0:table1[n3]='0';break;case 1:table1[n3]='1';break;case 2:table1[n3]='2';break;case 3:table1[n3]='3';break;case 4:table1[n3]='4';break;case 5:table1[n3]='5';break;case 6:table1[n3]='6';break;case 7:table1[n3]='7';break;case 8:table1[n3]='8';break;case 9:table1[n3]='9';break;default:break;
}
}//*****************************************
倒立摆基础知识1.背景在控制理论发展的过程中,一种理论的正确性及在实际应用中的可行性,往往需要一个典型对象来验证,并比较各种控制理论之间的优劣,倒立摆系统就是这样的一个可......
一、实验内容1、完成Matlab Simulink 环境下的电机控制实验。2、完成直线一级倒立摆的建模、仿真、分析。3、理解并掌握PID控制的的原理和方法,并应用与直线一级倒立摆4、主......
西北民族大学2012级自动化3班钟小龙摘 要倒立摆系统作为一个具有绝对不稳定、高阶次、多变量、强祸合的典型的非线性系统,是检验新的控制理论和方法的理想模型,所以 本文选择......
洛阳理工学院毕业设计(论文)第1章:绪论1.1 倒立摆的发展历史及现状控制理论教学领域,开展各种理论教学、控制实验、验证新理论的正确性的理想实验平台就是倒立摆控制系统。对倒......
直线一级倒立摆数学模型建立及线性化处理直线一级倒立摆系统的组成本系统由水平移动的小台车及由其支撑的单节倒立摆构成。控制输入量是拖动小台车的直流伺服电机的驱动力,被......
