📄 youyakokngzhi.c
字号:
U0THR=0xfe;
while( (U1LSR&0x20)==0 ); /*等待数据发送完成*/
uarttmp1=uartrcv[2];
uarttmp2=uartrcv[3]*0x10000+uartrcv[4]*0x100+uartrcv[5];
yunxingli=uarttmp1*1.0+uarttmp2/10000000.0;
break;
case 0x17:
PWM_Stop(); //停止
U0THR=0x17;
U0THR=0x17;
U0THR=0xfe;
while( (U0LSR&0x20)==0 ); /*等待数据发送完成*/
break;
case 0x18: //力值请零
U0THR=0x18;
U0THR=0x18;
U0THR=0xfe;
while( (U0LSR&0x20)==0 ); /*等待数据发送完成*/
syl_clr=syl_sjz;
ybl_clr=ybl_sjz;
chuzhi_bz=0x00;
break;
case 0x19: //PID自整定
U0THR=0x19;
U0THR=0x19;
U0THR=0xfe;
while( (U0LSR&0x20)==0 ); /*等待数据发送完成*/
break;
case 0x21: //压边力校准
U0THR=0x21;
U0THR=0x21;
U0THR=0xfe;
while( (U0LSR&0x20)==0 ); /*等待数据发送完成*/
uarttmp1=uartrcv[2];
uarttmp2=uartrcv[3]*0x10000+uartrcv[4]*0x100+uartrcv[5];
lijiaozhun=uarttmp1*1.0+uarttmp2/10000000.0;
break;
default: break;
}
uartrcv_new=0x00;
uartrcv_cnt=0x00;
}
else if(uartrcv_new==0x88)
{
U0THR=0x22; //校验错误帧命令
switch(uartrcv[0])
{
case 0x11:
U0THR=0x11; //错误代码
U0THR=0x33; //校验和
break;
case 0x14: //
U0THR=0x14;
U0THR=0x36;
break;
case 0x15: //
U0THR=0x15;
U0THR=0x37;
break;
case 0x16: //
U0THR=0x16;
U0THR=0x38;
break;
case 0x17: //
U0THR=0x17;
U0THR=0x39;
break;
case 0x18: //
U0THR=0x18;
U0THR=0x3a;
break;
case 0x19: //角度清零
U0THR=0x19;
U0THR=0x3b;
break;
case 0x21: //角度清零
U0THR=0x21;
U0THR=0x43;
break;
default: break;
}
U0THR=0xfe; //帧尾
uartrcv_new=0x00;
uartrcv_cnt=0x00;
}
}
/*if(online==0x00)
{
break;
}*/
}
/********************************************************************************************************
** 名称:System_Ini()
** 功能:系统初始化
** 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz,Fcclk=44MHz
** 入口参数:无
** 出口参数:无
** 全局变量:无
** 调用函数:引脚设置、中断设置、时钟设置
********************************************************************************************************/
void System_Ini(void)
{
//===========================================引脚初始化==================================================
PINSEL0=0x00000005; /*设置所有管脚连接,管脚功能选择详见下位机编程文档*/
PINSEL1=0x00000401;
PINSEL2=0x00000034;
IO0DIR=0x00600081; /*设置所有管脚方向,管脚方向定义详见下位机编程文档*/
IO1DIR=0x03000000;
cs_low; /*初始CPLD并口状态为0*/
clk_low; /*初始CPLD并口状态为0*/
IO1CLR=CPLD_DB0; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB1; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB2; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB3; /*初始CPLD并口状态为0*/
IO1CLR=CPLD_DB4; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB5; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB6; /*初始CPLD并口状态为0*/
IO0CLR=CPLD_DB7; /*初始CPLD并口状态为0*/
IO0CLR=RDY; /*初始CPLD并口状态为0*/
IO0CLR=SN; /*初始CPLD并口状态为0*/
soft_hight;
delayuS(2);
soft_low;
delayuS(2);
soft_hight;
data_cnt=0x00;
chuzhi_bz=0x00;
//===========================================中断设置====================================================
VPBDIV=0;
EXTMODE=0x01; /*设置EINT0中断为边沿触发模式*/
EXTPOLAR=0x01; /*设置EINT0中断为上升沿有效*/
VICIntSelect=0x00000000; /*设置所有通道为IRQ中断*/
//---------------------------------------------------------------------------------------------------
VICVectCntl1 = 0x20|14; /*EINT0中断通道(CPLD中断信号)分配到IRQ slot 1*/
VICVectAddr1 = (int)IRQ_Eint0; /*设置EINT0向量地址*/
EXTINT=0x01; /*清零中断标志*/
VICIntEnable = 0x00004000; /*使能EINT0中断*/
//---------------------------------------------------------------------------------------------------
//VICVectCntl3 = 0x20|4; /*TIME0中断通道分配到IRQ slot 3*/
//VICVectAddr3 = (int)IRQ_Time0; /*设置TIME0向量地址*/
//VICIntEnClr = 0x00000010; /*禁能TIME0中断*/
//---------------------------------------------------------------------------------------------------
//VICVectCntl2 = 0x20|6; /*UART0中断通道分配到IRQ slot 2*/
//VICVectAddr2 = (int)IRQ_UART0; /*设置UART0向量地址*/
//VICIntEnable = 0x00000040; /*使能UART0中断*/
//===========================================时钟设置====================================================
#if(Fpclk/(Fcclk/4))==1
VPBDIV=0;
#endif
#if(Fpclk/(Fcclk/4))==2
VPBDIV=2;
#endif
#if(Fpclk/(Fcclk/4))==4
VPBDIV=1;
#endif
//=======================================================================================================
UART0_Ini();
//--------------------------------------------------------------------------------
uartrcv_new=0x00;
ybl_sjz=0.0;
syl_sjz=0.0;
ybl_clr=0.0;
syl_clr=0.0;
//=======================================================================================================
/*初始化实时时钟*/
//=======================================================================================================
// Time0Enable();
//=======================================================================================================
}
/********************************************************************************************************
*Function Name: main(void)
*Discription: 成型极限控制功能函数
*Data: 2009/03/04
*Author: SuLiangwei
********************************************************************************************************/
int main (void)
{
uint8 ttp,ver;
System_Ini();
while(1)
{
//--------------------------------------------------------------------------------
//--------------------------------------------------------------------------------
if(U0LSR&0x01!=0)
{
uartrcv[uartrcv_cnt]=U0RBR; /*读取FIFO的数据,并清除中断标志*/
uartrcv_cnt++;
if( uartrcv[uartrcv_cnt-1]==0xfe) /*收到帧尾*/
{
ver=0;
for(ttp=0;ttp<(uartrcv_cnt-2);ttp++)
{
ver+= uartrcv[ttp];
}
if(ver== uartrcv[uartrcv_cnt-2]) /*校验和正确*/
{
uartrcv_new=0xff;
}
else /*校验和错误*/
{
uartrcv_new=0x88;
}
}
}
//--------------------------------------------------------------------------------
/*********************************************************************************/
cmd_rcv(); /**上位机指令分类接收处理函数*/
/*********************************************************************************/
if(online==0xff)
{
task_send();
}
/********************************************************************************/
if(jiajinchuli==0xff) /*夹紧力单独处理*/
{
while(jiajinli>ybl_sjz)
{
fxkz=0x00;
rOut=jiajinli-ybl_sjz;
tmp=(uint32)(rOut);
if(tmp<2)
{
PWM_Stop();
}
else
{
PWM_Out(fxkz,tmp);
}
}
jiajinchuli=0x00;
chuzhi_bz=0x00;
}
if(songchichuli==0xff) /*松弛力单独处理*/
{
while(ybl_sjz>songchili)
{
fxkz=0xff;
rOut=ybl_sjz-songchili;
tmp=(uint32)(rOut);
if(tmp<2)
{
PWM_Stop();
}
else
{
PWM_Out(fxkz,tmp);
}
}
songchichuli=0x00;
chuzhi_bz=0x00;
}
//--------------------------------------------------------------------------------
if( data_cnt>= 0x05)
{
if(sq.front!=(sq.rear+1)%QUEUEMAX) //队列未满
{
sq.rear=(sq.rear+1)%QUEUEMAX; //调整队尾指针,准备写入数据
sq.L1[sq.rear]= yabianli; //实时角度值入栈
}
data_cnt=0x00;
// if(sq.front!=(sq.rear+1)%QUEUEMAX) //队列未满
// {
// sq.rear=(sq.rear+1)%QUEUEMAX; //调整队尾指针,准备写入数据
//sq.L1[sq.rear]= shiyanli; //实时角度值入栈
// }
}
//--------------------------------------------------------------------------------
if(pwm==0xff&&yunxing==0xff) /*运行状态比例控制调整*/
{
lizhijisuan();
bilikongzhi();
tmp=(uint32)(rOut);
if(tmp<2)
{
PWM_Stop();
}
else
{
PWM_Out(fxkz,tmp);
}
pwm=0x00;
}
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -