📄 motor.c
字号:
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);
change_time_dcmotor();
change_time_dcmotor();
change_time_dcmotor();
}
}
void SystemInit(void)
{
WSGR = 0x1ff;
*WDCR = 0x68;
*SCSR1 = 0x0204;
*MCRA = 0x04;
*XINT1CR = 0x01;
}
void PHANTOM(void)
{
}
void init_UART(void)
{
UARTA_LCR = (data_w8+data_s1+LC_1_DLAB); /*8位数据 1停止位 不校验 开启除数转换*/
UARTA_DLL = buad_19k2_l; /*9.6K波特率*/
UARTA_DLH = buad_19k2_h;
UARTA_LCR = (data_w8+data_s1+LC_0_DLAB); /*8位数据 1停止位 不校验 关闭其余寄存器转换*/
UARTA_MCR = UartLoop;
UARTA_FCR = fifo_reset;
UARTA_FCR = fifo_enable+fifo_txdip8+fifo_rxdip8;//TRIGLE level =8
UARTA_IER = uartint_rhr;
for(i= 0; i<0x104;i++)
{
uart[i] = 0;
uarts[i] = 0;
}
for(i=0;i<32;i++)
{
sys_statbuff[i]=0;//系统标志buff清0
}
}
interrupt void c_int1(void)//串口接收中断
{
int i;
DINT;
if((*PIVR & 0x01) == 0x01)//xint1中断
{
if((INT1_RD & 0x02) == 0x02)//uarta中断
{
temp=UARTA_LSR;//读一次lsr,第一次读有可能有误。
temp=UARTA_LSR;
for(i=0;i<8;i++)//fifo有8个字节等待读。
{
if (((temp&0x1e)==0)&&((temp&0x01)==1))//无串口接收错误
{
uarta_recbuff[sys_statbuff[RECAADDR]]=UARTA_RHR&0xff;//接收数据
sys_statbuff[RECAADDR]++;
}
else
{
sys_statbuff[UARTAERR]=1;//错误标志为1
sys_statbuff[RECAADDR]=0;//缓冲区接收位置清0
break;//中止循环
}
}//for(i=0;i<8;i++)//fifo有8个字节等待读
UARTA_FCR = fifo_rreset;//3rest r fifo,enable fifo
if(sys_statbuff[RECAADDR]==FRAMLONGTH*2)//满帧
{
if (sys_statbuff[RECANEW]==1)//上一帧新帧标志仍未清除
{
sys_statbuff[UARTIMEA]=1;//超时错误置一
}
sys_statbuff[RECANEW]=1;//新帧标志置一
sys_statbuff[RECAADDR]=0;//缓冲区接收位置清0
//转移到uart[]。
for(i=0;i<FRAMLONGTH;i++)
{
uart[i]=(uarta_recbuff[i*2]<<8)+uarta_recbuff[i*2+1];
}
}
if(sys_statbuff[RECAADDR]>FRAMLONGTH*2)//超帧
{
sys_statbuff[UARTAERR]=1;//错误标志为1
sys_statbuff[RECAADDR]=0;//缓冲区接收位置清0
}
}//if((INT1_RD & 0x02) == 0x02)//uarta中断
} //if((*PIVR & 0x01) == 0x01)//xint1中断
*XINT1CR = *XINT1CR | 0x8000;
*IFR = *IFR & 0x01;
EINT;
}
void stepdelay(unsigned int dcmotorrun)
{
int k = 0;
for(k= 0; k<0x18; k++)
{
dcmotor_out(dcmotorrun);
}
}
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* -1:串口接受错误 */
/* 2:中断超时错误 */
/* 3: 较验出错 */
int uart_recive(void)
{
int check;
/*判断串口是否故障*/
if(sys_statbuff[UARTAERR] != 0)
{
sys_statbuff[UARTAERR]=0;
return -1;
}
/*判断超时是否故障*/
// if(sys_statbuff[UARTIMEA] != 0)
// {
// return 2;
// }
/*数据未准备好*/
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;
}
unsigned 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++)
{
for(;;)
{
timeout--;
temp=UARTA_LSR;
/*上一次发送是否完成*/
if(UARTA_LSR & 0x40)
{
/*发送数据的高8位*/
send_datah = uarts[i];
check = check ^ (send_datah);
UARTA_THR = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(UARTA_LSR & 0x40)
{
/*发送数据的低8位*/
UARTA_THR = uarts[i];
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
}
/*发送校验结果*/
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(UARTA_LSR & 0x40)
{
/*发送数据的高8位*/
send_datah = (check>>8);
UARTA_THR = send_datah;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(UARTA_LSR & 0x40)
{
/*发送数据的低8位*/
UARTA_THR = check;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
uarts[FRAMLONGTH-1]=check;
return 0;
}
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 sys_reset(void)
{
WSGR = 0;
*WDCR = 0x08;
for(;;){};
}
void dcmotor_out(unsigned int data)
{
if(data==0)
{
CNTLREG=0;//cntl0=0
}
else
{
if(motorstatus[MOTORPWMZ]==0)
{
CNTLREG=3;//cntl0=1
}
else
{
CNTLREG=0;//cntl0=0
}
}
}
void stepmotor_set(unsigned int data)
{
write_data=data;
CEPAGESELECT = SELECTCE3;
*p_stepportaddr=write_data;
CEPAGESELECT = SELECTSRAM;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -