⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chuguomain080105.c

📁 通过迷你开发板m9020-fnu201实现对伺服电机的控制。运用力矩的方式对伺服电机控制而且运用力反馈的方式对伺服电机精确控制
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -