📄 chuguomain080105.c
字号:
/****************************************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 + -