📄 chuguomain080105.c
字号:
if((fdb0-tmp0)>80) //100
{
ldata[0]=0x05C0;
ExBusWR16(0x04,1,ldata);
}
if((fdb0-tmp0)<-80) //100
{
ldata[0]=0x0970;
ExBusWR16(0x04,1,ldata);
}
}
while(((fdb0-tmp0)>60) || ((fdb0-tmp0)<-60)); //80 -80
ldata[0]=U0;
ExBusWR16(0x04,1,ldata); //2#驱动器控制电压输出0。
OSTimeDly(OS_TICKS_PER_SEC/20);
do //等待上位机向控制器发送握手帧
{
ExBusRD16(0x0A,1,ldata); //读2 code
fdb0=ldata[0];
if((fdb0-tmp0)>80)
{
ldata[0]=0x06C0;
ExBusWR16(0x04,1,ldata);
}
if((fdb0-tmp0)<-80)
{
ldata[0]=0x08F0;
ExBusWR16(0x04,1,ldata);
}
}
while(((fdb0-tmp0)>60) || ((fdb0-tmp0)<-60)); //80 -80
ldata[0]=U0;
ExBusWR16(0x04,1,ldata); //2#驱动器控制电压输出0。
gpio_set(GPIOA1);
gpio_set(GPIOA9);
gpio_clr(GPIOA9);
gpio_clr(GPIOA1); //enable2
gpio_set(BUZZER); //鸣叫BEEP
OSTimeDly(OS_TICKS_PER_SEC/10); //注意PWM输出引脚与蜂鸣器是同一引脚
gpio_clr(BUZZER);
OSTimeDly(OS_TICKS_PER_SEC/2);
//3-----------------------------------------------------------------------------
gpio_clr(GPIOA2); //打开3通道使能enable3
gpio_set(GPIOB1); //codezero3
gpio_clr(GPIOB1); //codezero3
ldata[0]=0x0970; //给通道3的max502写初值转动找0位。
ExBusWR16(0x06,1,ldata); //3#驱动器控制电压输出碰到正方向线位。
OSTimeDly(OS_TICKS_PER_SEC);
ExBusRD16(0x0C,1,ldata); //读3碰到线位时的编码器数据 code
tmp0=ldata[0] - 0x2609; //假设碰到线位的编码器读数离寻0位置的编码器相差0X2910
ldata[0]=0x0680;
ExBusWR16(0x06,1,ldata); //3#驱动器控制电压输出反方向。
do //等待上位机向控制器发送握手帧
{
ExBusRD16(0x0C,1,ldata); //读3 反方向编码器碰到线位的编码器读数code
fdb0=ldata[0];
if((fdb0-tmp0)>80) //80 //如果反方向的编码器读数比0位时编码器大800就反向转继续找0
{
ldata[0]=0x0781; //680 781hao
ExBusWR16(0x06,1,ldata);
}
if((fdb0-tmp0)<-80) //-80
{
ldata[0]=0x0890; //08B0
ExBusWR16(0x06,1,ldata);
}
}
while(((fdb0-tmp0)>80) || ((fdb0-tmp0)<-80));
ldata[0]=U0;
ExBusWR16(0x06,1,ldata);
OSTimeDly(OS_TICKS_PER_SEC/20);
do //等待上位机向控制器发送握手帧
{
ExBusRD16(0x0C,1,ldata); //读3 反方向编码器碰到线位的编码器读数code
fdb0=ldata[0];
if((fdb0-tmp0)>30) //如果反方向的编码器读数比0位时编码器大800就反向转继续找0
{
ldata[0]=0x0780 ; //780
ExBusWR16(0x06,1,ldata);
}
if((fdb0-tmp0)<-30)
{
ldata[0]=0x0890;
ExBusWR16(0x06,1,ldata);
}
}
while(((fdb0-tmp0)>30) || ((fdb0-tmp0)<-30));
ldata[0]=U0;
ExBusWR16(0x06,1,ldata); //3#驱动器控制电压输出0。
gpio_set(GPIOA2);
gpio_set(GPIOB1);
gpio_clr(GPIOB1);
gpio_clr(GPIOA2);
gpio_set(BUZZER); //鸣叫BEEP
OSTimeDly(OS_TICKS_PER_SEC/10); //注意PWM输出引脚与蜂鸣器是同一引脚
gpio_clr(BUZZER);
while(0)
{
ExBusRD16(0x08,1,ldata); //读1 code
fdb0=ldata[0];
ExBusRD16(0x0A,1,ldata); //读2 code
fdb0=ldata[0];
ExBusRD16(0x0C,1,ldata); //读3 code //读3 反方向编码器碰到线位的编码器读数code
fdb0=ldata[0];
}
gpio_set(GPIOA7);
gpio_clr(GPIOA7);
gpio_set(GPIOA9);
gpio_clr(GPIOA9);
gpio_set(GPIOB1);
gpio_clr(GPIOB1);
zerofinished=1;
/*----------------------------------------------------------------------------------------*/
OSTaskCreateExt(TASK0,
(void *)0,
&TASK0_STACK[TASK0_STACK_SIZE-1],
TASK0_PRIO,
TASK0_ID,
&TASK0_STACK[0],
TASK0_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK1,
(void *)0,
&TASK1_STACK[TASK1_STACK_SIZE-1],
TASK1_PRIO,
TASK1_ID,
&TASK1_STACK[0],
TASK1_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK2,
(void *)0,
&TASK2_STACK[TASK2_STACK_SIZE-1],
TASK2_PRIO,
TASK2_ID,
&TASK2_STACK[0],
TASK2_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK3,
(void *)0,
&TASK3_STACK[TASK3_STACK_SIZE-1],
TASK3_PRIO,
TASK3_ID,
&TASK3_STACK[0],
TASK3_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK4,
(void *)0,
&TASK4_STACK[TASK4_STACK_SIZE-1],
TASK4_PRIO,
TASK4_ID,
&TASK4_STACK[0],
TASK4_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TASK5,
(void *)0,
&TASK5_STACK[TASK5_STACK_SIZE-1],
TASK5_PRIO,
TASK5_ID,
&TASK5_STACK[0],
TASK5_STACK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK0
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK0(void *pdata)
{
pdata = pdata;
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK1
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK1(void *pdata)
{
uint8 tmp4;
pdata = pdata;
pCAN1 = CAN_Create(CAN_CH1,10,BTR_500K,NULL);//CAN控制器创建,波特率:500K
SetDefIRQAddr((void*)IntEnty); //设定CAN的中断函数为非向量中断
can.ch1_cmd = U0;
can.ch2_cmd = U0;
can.ch3_cmd = U0;
do //等待上位机向控制器发送握手帧
{
Read(pCAN1,&CANTxBuf1);
tmp4=CANTxBuf1.Buf[6]; //读该帧的第6个字节,如为1则上位机准备完成
OSTimeDly(OS_TICKS_PER_SEC/10);
}
while(tmp4!=1);
gpio_set(BUZZER); //鸣叫BEEP
OSTimeDly(OS_TICKS_PER_SEC/10); //注意PWM输出引脚与蜂鸣器是同一引脚
gpio_clr(BUZZER);
do
{
Read(pCAN1,&CANRxBuf1);
tmp4=CANRxBuf1.Buf[6]; //读该帧的第6个字节,如为1则上位机准备完成
if(tmp4==1)
{
CANTxBuf1.Buf[0]=0x07;
CANTxBuf1.Buf[1]=0xFC;
CANTxBuf1.Buf[2]=0x07;
CANTxBuf1.Buf[3]=0xFC;
CANTxBuf1.Buf[4]=0x07;
CANTxBuf1.Buf[5]=0xFC;
CANTxBuf1.Buf[6]=0; //电机归位完成标志存到发送寄存器
CANTxBuf1.Buf[7]=0;
Write(pCAN1, &CANTxBuf1, CANTxCMD_NOR); //发送can数据
}
OSTimeDly(OS_TICKS_PER_SEC/10);
}
while(zerofinished!=1);
if(zerofinished==1)
{
CANTxBuf1.Buf[0]=0x07;
CANTxBuf1.Buf[1]=0xFC;
CANTxBuf1.Buf[2]=0x07;
CANTxBuf1.Buf[3]=0xFC;
CANTxBuf1.Buf[4]=0x07;
CANTxBuf1.Buf[5]=0xFC;
CANTxBuf1.Buf[6]=1; //电机归位完成标志存到发送寄存器
CANTxBuf1.Buf[7]=0;
Write(pCAN1, &CANTxBuf1, CANTxCMD_NOR); //发送can数据
}
while (1)
{
do //等待上位机向控制器发送数据
{
CANTxBuf1.Buf[7] = 0;
tmp4=Read(pCAN1,&CANTxBuf1);
}
while(tmp4==0);
//tmp4=CANRxBuf1.Buf[4]; //读该帧的第四个字节,如为0则上位机急停,不改变位置
//if(tmp4!=0)
{
can.ch1_cmd=CANTxBuf1.Buf[0]; //通道1命令
can.ch1_cmd=can.ch1_cmd<<8;
can.ch1_cmd=can.ch1_cmd+CANTxBuf1.Buf[1];//
can.ch2_cmd=CANTxBuf1.Buf[2]; //通道2命令
can.ch2_cmd=can.ch2_cmd<<8;
can.ch2_cmd=can.ch2_cmd+CANTxBuf1.Buf[3];//
can.ch3_cmd=CANTxBuf1.Buf[4]; //通道2命令
can.ch3_cmd=can.ch3_cmd<<8;
can.ch3_cmd=can.ch3_cmd+CANTxBuf1.Buf[5];//
can.ctl = CANTxBuf1.Buf[7]; //reset1、stop2、zero3、working4
CANTxBuf1.Buf[0]=can.ch1_fdb>>8; //将通道1实际位置存到发送寄存器
CANTxBuf1.Buf[1]=can.ch1_fdb;
CANTxBuf1.Buf[2]=can.ch2_fdb>>8; //将通道2实际位置存到发送寄存器
CANTxBuf1.Buf[3]=can.ch2_fdb;
CANTxBuf1.Buf[4]=can.ch3_fdb>>8; //将通道2实际位置存到发送寄存器
CANTxBuf1.Buf[5]=can.ch3_fdb;
CANTxBuf1.Buf[6]=1;
CANTxBuf1.Buf[7]=0;
tmp4=Write(pCAN1, &CANTxBuf1, CANTxCMD_NOR); //发送can数据
}
}
while (1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
/*******************************************************************************************
** Function name: TASK2
** Descriptions :
** Input : 无
** Output : 无
*******************************************************************************************/
void TASK2(void *pdata)
{
int32 Timer_Handles = 0;
pdata = pdata;
/*Timer_Handles = dopen("TIMER1", O_RDWR, OCCUPY); // 以独占方式打开定时器1
if( Timer_Handles < 0 ) // Open成功,句柄将大于0
{
Err = getlasterr(Timer_Handles); // 查看错误状态
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
diocontrol(Timer_Handles, TIMERONLY, (void *)50); // 设置成定时方式,定时时间:50=5mS
ClrIntFlag(IRQ_TC1); // 清除中断标志
SetIRQinterrupt(IRQ_TC1, 6, (void *)Timer1_Exception); // 设置IRQ
*/
OSTimeDly(OS_TICKS_PER_SEC/1000);
ExBusConfig(16,10,10,15); //外部总线配置成16位宽度,插入10 个读等待周期,10 个写等待周期,15 个读、写访问切换等待周期
ch1_outdata[0]=U0;
ch2_outdata[0]=U0;
ch3_outdata[0]=U0;
ExBusWR16(0x02,1,ch1_outdata); //1#驱动器控制电压0V输出。
ExBusWR16(0x04,1,ch2_outdata); //2#驱动器控制电压0V输出。
ExBusWR16(0x06,1,ch3_outdata); //3#驱动器控制电压0V输出
gpio_clr(GPIOA0);
gpio_clr(GPIOA1);
gpio_clr(GPIOA2);
do
{
OSTimeDly(OS_TICKS_PER_SEC/10);
}
while(zerofinished!=1);
//*******************************************************************************
//
//
//如果上位机归位0完成,则接收上位机数据写入max502
//
//
//*******************************************************************************
while(1)
{
if(can.ctl == 1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -