77范文网 - 专业文章范例文档资料分享平台

多电机同步控制(10)

来源:网络收集 时间:2019-08-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

RCAP3=0X0000; TMR3=0X0000; TMR3CN=0X06; }

void timer4() //T4初始化,定时25ms {

SFRPAGE=0X02;

TMR4CN=0X84; //溢出位清0,启动T4

TMR4CF=0X00; //T4重载计数,采用系统时钟12分频 RCAP4=0X389E; //设定时初值 TMR4=0x389e; SFRPAGE=0X00;

EIE2|=0X04; //允许T4中断 }

void config() {

WDTCN=0X07; //看门狗禁止,便于系统调试 WDTCN=0XDE; WDTCN=0XAD;

SFRPAGE=0X0F; //交叉开关配置

XBR0=0X14; //将CEX0和CEX1,UART0配置到端口 XBR1=0X20; //将T2配置到端口 XBR2=0X40; //开启交叉开关配置 XBR3=0X01; //将T3配置到端口

SFRPAGE=0X0F;

P0MDOUT=0X0D; //P0口输出配置 P0=0X32;

SFRPAGE=0X0F;

CLKSEL=0X00; //采用内部晶振

OSCXCN=0X00; //关闭外部晶振电路

OSCICN=0X83; //开启内部晶振,系统时钟为内部晶振1分频 }

void main()

{uchar k1=1,k2=1; //积分项系数

int e11,e12,e13; //主电机近三次速度偏差

46

int e21,e22,e23; //从电机近三次速度偏差 int eu1,u1,eu2,u2; //主从电机的控制量

u1=u2=0;

e11=e12=e13=0; e21=e22=e23=0;

shj=300; // shd=shj*5/3;

T1=8; //300 T2=8; Td1=2; Td2=1;

Ti1=Ti2=32; Kp1=0.3; Kp2=0.3;

A12=-1-2*Td1/T1; // A22=-1-2*Td2/T2; A13=Td1/T1; A23=Td2/T2;

config(); // pwm_set(); Uart0init(); timer0(); timer1(); timer2(); timer3(); timer4();

EA=1; //

while(1) // {

if(j==1) // {j=0;

e11=e12; // e12=e13; e13=shd-cesu1;

将主电机速度设定为300 转时的控制参数 运算系数 初始化 开启中断 主循环 判断是否运算 计算主电机的最近三次偏差47

e21=e22; //计算主电机的最近三次偏差 e22=e23;

e23=cesu1-cesu2;

if((e13>300)||(u1==255)&&(e13>0)) k1=0; //判断主电机运算是否积分饱和 else k1=1;

if((e23>200)||(u2==255)&&(e23>0)) k2=0; //判断主电机运算是否积分饱和 else k2=1;

if((e13>2)||(e13<-2)||(e13-e12>2)||(e12-e13>2)) //计算主电机控制量 { A11=1+k1*T1/Ti1+Td1/T1;

eu1=(A11*e13+A12*e12+A13*e11)*Kp1; u1+=eu1;

if(u1>255) u1=255; if(u1<0) u1=0; SFRPAGE=0X00;

PCA0CPH0=~u1; }

if((e23>2)||(e23<-2)||(e13-e12>2)||(e12-e13>2)) //计算主电机控制量 { A21=1+k2*T2/Ti2+Td2/T2;

eu2=(A21*e23+A22*e22+A23*e21)*Kp2; u2+=eu2;

if(u2>255) u2=255; if(u2<0) u2=0; SFRPAGE=0X00;

PCA0CPH1=~u2; } } } }

/*void t4ISR() interrupt 16 { //T4中断程序,与下面一个T4中断程序 temppage=SFRPAGE; //功能相同 i++; if(i>=4) {i=0; j=1;

SFRPAGE=0X00; TR2=0;

cesu1=TMR2; TMR2=0X0000;

48

TR2=1;

SFRPAGE=0X01; TR3=0;

cesu2=TMR3; TMR3=0X0000; TR3=1; }

SFRPAGE=0X02; TF4=0;

SFRPAGE=temppage; }*/

void t4ISR() interrupt 16{ //T4中断程序 SFRPAGE=0X00;

TR2=0; //停止T2计数

cs1[i]=TMR2; //读主电机25ms的脉冲数 TMR2=0X0000; //T2计数初值清0 TR2=1; //T2计数开启 SFRPAGE=0X01;

TR3=0; //停止T3计数

cs2[i]=TMR3; //读从电机25的脉冲数 TMR3=0X0000; //T3计数初值清0 TR3=1; //T3计数开启 SFRPAGE=0X02;

TF4=0; //清除T4中断标志位 i++;

if(i>=4) //计时1ms {cesu1=j=cs1[0]; for(i=1;i<=3;i++)

{if(jcs1[i]) cesu1=cs1[i]; //找出cs1中最小值赋给cesu1 }

i=cesu1;

cesu1=(cs1[0]+cs1[1]+cs1[2]+cs1[3]-i-j)*2; //中值滤波 cesu2=j=cs2[0]; for(i=1;i<=3;i++)

{if(jcs2[i]) cesu2=cs2[i]; } i=cesu2;

49

cesu2=(cs2[0]+cs2[1]+cs2[2]+cs2[3]-i-j)*2;

i=0; //循环标志清0 j=1; //主程序启动运算 } }

void Uart0_ISR() interrupt 4{ //串口通信程序 SFRPAGE=0X00;

if(RI0) //接收数据 {if(m<=2)

{js[m]=SBUF0; m++; }

if(m>=3) //已接收到三个数据 {m=0;

if(js[2]==1) //修改主电机设定速度 {shj=256*js[0]+js[1]; shd=shj*5/3;

if(shj<=120) //设定速度低于120时的控制参数 {Ti1=Ti2=32; Td1=1; Td2=2;

Kp1=Kp2=0.3; }

else if(shj<=250) //设定速度介于120和250之间的控制参数 {Ti1=Ti2=48; Td1=2; Td2=1; Kp1=0.3; Kp2=0.2; }

else //设定速度大于250时的控制参数 {Ti1=Ti2=32; Td1=2; Td2=1; Kp1=0.3; Kp2=0.3; }

A12=-1-2*Td1/T1; //计算运算系数 A22=-1-2*Td2/T2; A13=Td1/T1;

50

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库多电机同步控制(10)在线全文阅读。

多电机同步控制(10).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/680709.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: