📄 dtk_bpd_motor.c
字号:
/*步进电机运行*/
case STPMTRRUN:
stepruncode = STPMTRRUN;
/*确定是旋转还是定位*/
if(pmotor->StpMode == ROTATE )
{
/*确定是全长还是半长*/
if(pmotor->StpHlfStp == HALFSTEP)
{
steplong = 96;
}
else
{
steplong = 48;
}
stepspeed = pmotor->StpSpdDgr;
stepspeedsave = pmotor->StpSpdDgr;
stepnumber = 0;
localstep = 0;
}
else
{
/*定位*/
steplong = pmotor->StpSpdDgr;
stepspeed = 10;
stepspeedsave = 10;
stepnumber = 0;
localstep = 1;
}
steplongsave = steplong;
precieve->Data[0] = 0;
break;
/*步进电机反向*/
case STPMTRRVS:
if(pmotor->StpDir ==1)
{
pmotor->StpDir = 0;
}
else
{
pmotor->StpDir = 1;
}
stepnumber = 0;
precieve->Data[0] = STPMTRRUN;
break;
/*步进电机停止*/
case STPMTRHALT:
precieve->Data[0] = 0;
steplong = 0;
stepruncode = 0;
break;
/*系统复位*/
case SYSRESET:
write_data=DCMOTORBRAKE;
*p_ceselect = SELECTCE3;//打开ce3空间
*p_cntlbaseaddr=write_data;
dcmotorrun = 0;
dcruncode =0;
precieve->Data[0] = 0;
steplong = 0;
stepruncode = 0;
sys_reset();
break;
default:
break;
}
/*驱动电机运转*/
if(steplong > 0 )
{
/*确定是使用半长还是全长数组*/
if(pmotor->StpHlfStp == HALFSTEP)
{
/*当为半长时,确定正转还是反转*/
if(pmotor->StpDir == CLOCKWISE)
{
/*正转*/
step = motorstephalfn[stepnumber];
}
else
{
/*反转*/
step = motorstephalf[stepnumber];
}
}
else
{
/*当为全长时,确定正转还是反转*/
if(pmotor->StpDir == CLOCKWISE)
{
/*正转*/
step = motorstepalln[stepnumber];
}
else
{
/*反转*/
step = motorstepall[stepnumber];
}
}
if(stepspeed--)
{
stepdelay(dcmotorrun);
}
else
{
stepmotor_set(step);
stepspeed = stepspeedsave;
stepnumber++;
steplong = steplong -1;
}
if( (localstep == 1) && (steplong == 0) )
{
stepnumber = 0;
}
if( (localstep == 0) && (steplong ==0) )
{
stepnumber = 0;
steplong = steplongsave;
}
}///*驱动电机运转*/ if(steplong > 0 )
/*电机输出*/
dcmotor_out(dcmotorrun);
// DcMotorChangeConv++;
// if((DcMotorChangeConv%2)==0)
// change_time_dcmotor();
change_time_dcmotor();
// change_time_dcmotor();
}
}
int uart_send(void)
{
unsigned int i;
unsigned int send_datah;
unsigned int timeout = 0x4000;
unsigned int check = 0;
for(i = 0; i<FRAMLONGTH-1; i++)
{
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = uarts[i];
check = check ^ (send_datah);
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = uarts[i];
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
}
/*发送校验结果*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = check;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = check;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*发送冗余*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = 0xabcd;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = 0xabcd;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*reset sci */
SciaRegs.SCICTL1.all = 0x03;
SciaRegs.SCICTL1.all = 0x23;
uarts[FRAMLONGTH-1]=check;
return 0;
}
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* 3: 较验出错 */
int uart_recive(void)
{
unsigned int check;
/*数据未准备好*/
if(sys_statbuff[RECANEW] != 1)
{
return 1;
}
sys_statbuff[RECANEW]=0;//新帧标志位清零
check=0;
for(i=0;i<FRAMLONGTH-1;i++)
{
check=check ^ uart[i];
}
if(check!=uart[FRAMLONGTH-1])//校验不正确
{
return 3;
}
return 0;
}
void sys_reset(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0;
EDIS;
for(;;){};
}
void stepdelay(unsigned int dcmotorrun)
{
int k = 0;
for(k= 0; k<2000; k++)
{
dcmotor_out(dcmotorrun);
if((k%100)==0)
change_time_dcmotor();
}
}
void change_time_dcmotor(void)
{
//直流电机调速开始
if(dcmotorrun==1)
{
motorstatus[3]--;
if(motorstatus[3]==0)
{
motorstatus[6]=1;
}
motorstatus[5]--;
if(motorstatus[5]==0)
{
motorstatus[3]=motorstatus[2];
motorstatus[5]=motorstatus[4];
motorstatus[6]=0;
}
}
//直流电机调速over
}
void dcmotor_out(unsigned int data)
{
if(data==0)
{
*p_cntlreg=0;//cntl0=0
}
else
{
if(motorstatus[MOTORPWMZ]==0)
{
*p_cntlreg=3;//cntl0=1
}
else
{
*p_cntlreg=0;//cntl0=0
}
}
}
void stepmotor_set(unsigned int data)
{
write_data=data;
*p_ceselect = SELECTCE3;//打开ce3空间
*p_stepportaddr=write_data;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -