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

📄 chuguomain080105.c

📁 通过迷你开发板m9020-fnu201实现对伺服电机的控制。运用力矩的方式对伺服电机控制而且运用力反馈的方式对伺服电机精确控制
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************Copyright (c) *************************************
**                         Guangzhou ZHIYUAN electronics Co.,LTD.                                              
**                               http://www.embedtools.com
**
**------------ File Info -------------------------------------------------------------------
**  File name          :main.c
**  Last modified Date :
**  Last Version       :V1.0
**  Descriptions       :用户主程序
**
**------------------------------------------------------------------------------------------
** Created by:			Lijianming
** Created date:		2007-05-21
** Version:				V1.20
** Descriptions:		M9020-FNU20 的工程模板(带有LED、BEEP演示)
**
**------------------------------------------------------------------------------------------
** Modified by  :       Lijianming
** Modified date:       2007-08-12
** Version      :       
** Descriptions :       配合新固件,修改System.h中固件版本说明
**
*********************************************************************************************/
#include "main.h"

#define TASK0_PRIO          17       		// 任务的优先级
#define TASK0_ID            TASK0_PRIO      // 任务的ID
#define TASK0_STACK_SIZE    1024    		// 定义用户堆栈长度   

#define TASK1_PRIO          18       		// 任务的优先级
#define TASK1_ID            TASK1_PRIO      // 任务的ID
#define TASK1_STACK_SIZE    512     		// 定义用户堆栈长度
   
#define TASK2_PRIO          19       		// 任务的优先级
#define TASK2_ID            TASK2_PRIO      // 任务的ID
#define TASK2_STACK_SIZE    512     		// 定义用户堆栈长度

#define TASK3_PRIO          20       		// 任务的优先级
#define TASK3_ID            TASK3_PRIO      // 任务的ID
#define TASK3_STACK_SIZE    512    		    // 定义用户堆栈长度

#define TASK4_PRIO          21       		// 任务的优先级
#define TASK4_ID            TASK4_PRIO   	// 任务的ID
#define TASK4_STACK_SIZE    512    	 		// 定义用户堆栈长度

#define TASK5_PRIO          22       		// 任务的优先级
#define TASK5_ID            TASK5_PRIO 		// 任务的ID
#define TASK5_STACK_SIZE    512     		// 定义用户堆栈长度

OS_STK  TASK0_STACK[TASK0_STACK_SIZE];
OS_STK  TASK1_STACK[TASK1_STACK_SIZE];
OS_STK  TASK2_STACK[TASK2_STACK_SIZE];
OS_STK  TASK3_STACK[TASK3_STACK_SIZE];
OS_STK  TASK4_STACK[TASK4_STACK_SIZE];
OS_STK  TASK5_STACK[TASK5_STACK_SIZE];

void TASK0(void *pdata);
void TASK1(void *pdata);
void TASK2(void *pdata);
void TASK3(void *pdata);
void TASK4(void *pdata);
void TASK5(void *pdata);
//                        定义系统任务间的传递信息的结构                                  //
struct err_str                    //错误处理数据
	{
		uint8    flag;           //错误标志,55正常,AA有错误。
		uint8    other;          //通讯错误,11。
						          	   //AD、DA错误,22。
						               //IO错误,33。
						               //驱动器错误,44。
						               //编码器错误,55。
					  	               //其他类型错误,66。
	}err;


struct control_str                    //控制任务所属结构
	{
		uint8     flag;           //控制任务启动标志,55为启动,AA为停止。
		uint16    ch1_cmd;        //通道1命令位置。
		uint16    ch2_cmd;        //通道2命令位置。
		//uint16    ch3_cmd=0x00;     //通道3力数据或通道3位置。
		//uint16    force_feedback1=0x00; //通道1力反馈数据。
		//uint16    force_feedback2=0x00; //通道2力反馈数据。
		//uint16    force_feedback3=0x00; //通道3力反馈数据。
		uint16    ch1_fdb;     //通道1反馈数据。
		uint16    ch2_fdb;     //通道2反馈数据。
		//uint16    ch3_fdb=0x00;   //通道3编码器数据。

	}control;



/******************************************************************************************/
//                                   定义系统常用地址                                     //
const ad=0x000000;      //ad地址
const da1=0x000000;     //da1通道地址
const da2=0x000000;     //da2通道地址
const da3=0x000000;     //da3通道地址
const ed1=0x000000;     //编码器1通道地址
const ed2=0x000000;     //编码器2通道地址
const ed3=0x000000;     //编码器3通道地址

/******************************************************************************************/
//                                   定义系统常用变量                                     //
uint8 wdata[8];         //系统临时变量数组,单字节
uint16 ldata[8];        //系统临时变量数组,两字节

uint8 tmp;              //task0临时变量
uint16 tmp0;             //task0临时变量
uint8 tmp1;             //task1临时变量
uint8 tmp2;             //task2临时变量
uint8 tmp3;             //task3临时变量
uint8 tmp4;             //task4临时变量
uint8 tmp5;             //task5临时变量
uint8 canflag;          //设置一个can收发标志
uint8 ch1_clear0_flag=0;
uint8 ch1_clear0_num=0;

uint16  ldata[8];				//编码器数据最低位。
uint16  loutdata[8];
uint16  oldcmd1;               	//命令数据1历史值	
uint16  U0 = 0x7FC;
//uint16  U0 = 0x7E0;				//ch1 0 zero max502
uint8   tmp1=0;
int32	Err = 0;
int32   ch1_err=0;            	//通道1误差
int32   ch1_err1=0;           	//通道1误差1
int32   ch1_err2=0;           	//通道1误差2
int32   ch1_erri=0;	
uint8   ch1_POT	;				//通道1正方向制动。
uint8   ch1_NOT;				//通道1负正方向制动
uint8   ch2_POT	;				//通道2正方向制动。
uint8   ch2_NOT;				//通道2负正方向制动
uint8   ch3_POT	;				//通道3正方向制动。
uint8   ch3_NOT;				//通道3负正方向制动
uint16	ch1_p_max;				//通道1正方向最大值
uint16	ch1_n_mix;				//通道1负方向最大值
uint8	ch1_clear0=0;				//通道1编码器清零标志
uint16 	ch_Number0;
uint16 	ch_Number1;
uint16 	ch_Number2;
uint8 	count=0;
uint8	ch1_clear0_num;
uint8	flag_direct=0;		//0 正传 1 反转
uint8   zerofinished=0;

uint16 ch1_outdata[8];
uint16 ch2_outdata[8];
uint16 ch3_outdata[8];
uint16 MAXVOUT = 0x0E80;
uint16 MINVOUT = 0x01C0;

uint16	ch1_er;
uint16	ch2_er;
uint16	ch3_er;
/******************************************************************************************/

uint8  MCU_IP[4]      = {192,168, 0 ,178};      //设置MCU的IP地址等信息
uint8  MCU_Mark[4]    = {255,255,255, 0 };
uint8  MCU_GateWay[4] = {192,168, 0 , 1 };   
uint8  MCU_MAC[6];  							//MAC地址
uint16 MCU_Port       = 8000;

uint8  PC_IP[4]       = {192,168, 0 ,100};      //设置PC机的IP地址等信息
uint16 PC_Port        = 2000;

uint8	CFSel =0;								//CF卡主从机选择
stcCAN *pCAN1;			//定义CAN控制器结构体指针
//定义CAN发送结构,数据扩展帧,数据长度8,数据
stcCANFrame CANTxBuf1 = {FALSE, TRUE, 0x08, 0x00, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};

stcCANFrame CANRxBuf1 = {FALSE, TRUE, 0x08, 0x00, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
struct can_str
	{
		uint8     flag;            //通讯任务启动标志,55为启动,AA为停止。
		uint8     ctl;             //控制通道命令,0停止,1启动
		uint8     sent;            //发送状态计数
		uint8     recieve;         //接收状态计数,用于给程序判断数据的时效性
		uint16    ch1_cmd;         //通道1命令数据。
		uint16    ch2_cmd;         //通道2命令数据。
		uint16    ch3_cmd;         //通道2命令数据
		
		//uint16    force_ch3=0x00;    //通道3数据。
		uint16    ch1_fdb;         //通道1反馈数据。
		uint16    ch2_fdb;         //通道2反馈数据。
		uint16    ch3_fdb;         //通道2反馈数据		
		//uint16    encoder_ch3=0x00;  //通道3编码器数据。
		uint8     err;             //系统错误代码。
	}can;
	
uint16  fdb0;   

/******************************************************************************************
** Function name: main
** Descriptions : 主函数
** Input        : 无
** Output       : 无 
*******************************************************************************************/
int main (void)
{
    #if OS_CRITICAL_METHOD == 3				      	//Allocate storage for CPU status register
    OS_CPU_SR  cpu_sr;
	#endif
	
/*---------------------- 系统初始化代码 ------------------------------------------------*/
	TargetInit ();      					     	//系统初始化,版本号验证
											     	//验证不通过函数不会返回!!!
    DevDriveIni();								 	//驱动库初始化

#if 1
	GetIpSet(MCU_IP);								//读取出厂IP
	GetMarkSet(MCU_Mark);
	GetGateWaySet(MCU_GateWay);
	MCU_Port = GetPortSet();
    ZlgipInitial(MCU_IP, MCU_GateWay, MCU_Mark);	//设置系统IP参数
	GetMac(MCU_MAC);								//读取MAC地址(该函数必须在ZlgipInitial后调用)
//	getlocalip(MCU_IP,0);							//读取本地IP
#endif

#if 0
    File_init();
    USB_Host_init();
    MassDriverIni();
#endif

#if 0
//	OSAddFileDriver(GetFFSCommand(), Get16MDriverInfo());	// 安装16M  (512byte扇区)电子盘文件系统驱动
	OSAddFileDriver(GetLFFSCommand(), Get256MDriverInfo());	// 安装256M ( 2Kbyte扇区)电子盘文件系统驱动
#endif

/*----------------------------------------------------------------------------------------*/
/*************************************系统初始化过程***************************************/


/*----------------------------------------------------------------------------------------*/  
		err.flag=0x55;
//		control.flag=0xAA;
		can.flag=0x55;
		gpio_set(BUZZER);                            	//鸣叫BEEP,LED闪烁
	    OSTimeDly(OS_TICKS_PER_SEC/10);             	
	    gpio_clr(BUZZER); 
	    OSTimeDly(OS_TICKS_PER_SEC/100);
	

	ExBusConfig(16,10,10,15);
	gpio_set(GPIOA6);			//MAX193 MR0
   	gpio_clr(GPIOA7);			//MAX193 PL0
   	gpio_set(GPIOA8);			//MAX193 MR0
   	gpio_clr(GPIOA9);			//MAX193 PL0
   	gpio_set(GPIOA10);			//MAX193 MR0
   	gpio_clr(GPIOB1);			//MAX193 PL0

	
//---------------------------------驱动器错误处理 ----------------------------

	OSTimeDly(OS_TICKS_PER_SEC*2);	//等待驱动器有点否则开机启动变压器有延时控制板会一直检测控制板没电。	 
	ch1_er=gpio_get(GPIOA11);		//司服ALM脚位等H时有报警
	ch2_er=gpio_get(GPIOA12);
	ch3_er=gpio_get(GPIOA13);		
 	do
	{
		gpio_set(GPIOA0);
		gpio_set(GPIOA1);
		gpio_set(GPIOA2);
		gpio_set(BUZZER);
		OSTimeDly(OS_TICKS_PER_SEC);
		gpio_clr(BUZZER);		
		gpio_set(BUZZER);
		OSTimeDly(OS_TICKS_PER_SEC);
		gpio_clr(BUZZER);
	}
	while((ch1_er==1)||(ch2_er==1)||(ch3_er==1));
		
//---------------------------------编码器错误处理---------------------------------
		ExBusRD16(0x08,1,ldata); //读1 code 
		ch1_er=ldata[0];
		ExBusRD16(0x0A,1,ldata); //读2 code 
		ch2_er=ldata[0];
		ExBusRD16(0x0C,1,ldata); //读3 code 
		ch3_er=ldata[0];			
	do
	{
		gpio_set(GPIOA0);
		gpio_set(GPIOA1);
		gpio_set(GPIOA2);
		
		gpio_set(BUZZER);
	}
	while((ch1_er==0)||(ch2_er==0)||(ch3_er==0));
	
	//gpio_clr(BUZZER);
	//1-----------------------------------------------------------------------------
	gpio_clr(GPIOA0);   //enable1	
    gpio_set(GPIOA7);	//codezero1
    gpio_clr(GPIOA7);	//codezero1
    	
	ldata[0]=0x0920;//0x08B0;
	ExBusWR16(0x02,1,ldata);  	    //1#驱动器控制电压输出0。
	OSTimeDly(OS_TICKS_PER_SEC);
	
	ExBusRD16(0x08,1,ldata); //读1 code 
	tmp0=ldata[0] - 0x1804;
			
	ldata[0]=0x0680;	
	ExBusWR16(0x02,1,ldata);  	    //1#驱动器控制电压输出0。
 	
 	do                                       //等待上位机向控制器发送握手帧
	{
		ExBusRD16(0x08,1,ldata); //读1 code 
		fdb0=ldata[0];	
		if((fdb0-tmp0)>10) 
		{
			ldata[0]=0x0750;	
			ExBusWR16(0x02,1,ldata);
		}
		if((fdb0-tmp0)<-10) 
		{
			ldata[0]=0x0900;	
			ExBusWR16(0x02,1,ldata);
		}	
				
	}
	while(((fdb0-tmp0)>30) || ((fdb0-tmp0)<-10));

	ldata[0]=U0;//0x08B0;
	ExBusWR16(0x02,1,ldata);  	    //1#驱动器控制电压输出0。
	OSTimeDly(OS_TICKS_PER_SEC/20);
 	do                                       //等待上位机向控制器发送握手帧
	{
		ExBusRD16(0x08,1,ldata); //读1 code 
		fdb0=ldata[0];	
		if((fdb0-tmp0)>10) 
		{
			ldata[0]=0x07E0;	
			ExBusWR16(0x02,1,ldata);
		}
		if((fdb0-tmp0)<-10) 
		{
			ldata[0]=0x08E0;	
			ExBusWR16(0x02,1,ldata);
		}	
				
	}
	while(((fdb0-tmp0)>10) || ((fdb0-tmp0)<-10));
		
	ldata[0]=U0;		
	ExBusWR16(0x02,1,ldata);  	    //1#驱动器控制电压输出0。
		
	gpio_set(GPIOA0);
	gpio_set(GPIOA7);
	gpio_clr(GPIOA7);
	gpio_clr(GPIOA0);   //enable1
	
	gpio_set(BUZZER);                            	//鸣叫BEEP
    OSTimeDly(OS_TICKS_PER_SEC/10);             	//注意PWM输出引脚与蜂鸣器是同一引脚
	gpio_clr(BUZZER);
		
	OSTimeDly(OS_TICKS_PER_SEC/2);	
	
	//2-----------------------------------------------------------------------------
	gpio_clr(GPIOA1); //enable2	
	gpio_set(GPIOA9); //codezero1
	gpio_clr(GPIOA9); //codezero1	
   	
	ldata[0]=0x0970;
	ExBusWR16(0x04,1,ldata);  	    //2#驱动器控制电压输出0。
	OSTimeDly(OS_TICKS_PER_SEC);
	
	ExBusRD16(0x0A,1,ldata); //读2 code 
	tmp0=ldata[0] - 0x1780;	//1740
		
	ldata[0]=0x05C0;	
	ExBusWR16(0x04,1,ldata);  	    //2#驱动器控制电压输出0。
 	
 	do                                       //等待上位机向控制器发送握手帧
	{
		ExBusRD16(0x0A,1,ldata); //读2 code 
		fdb0=ldata[0];	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -