📄 common.c
字号:
#include <reg52.h>
#include "inc/EXT_PUBLIC_VARIABLE.H"
#include "inc/CPUIO_DEF.H"
#include "inc/timer_pwm.h"
#include "inc/candul.H"
void Delay(uchar timer)
{
uchar i;;
for(;timer>0;timer--)
{
for(i=0;i<250;i++);
}
}
/**************************************************************************************
;;函数原型: void Mot(uchar ucWay,uchar ucSpeed)
;;函数功能: 电机底层驱动程序(电机正转,电机反转,电机停止转动,电机转速,)
;;函数输入: ucWay,POSITIVE电机正转,NEGATIVE电机反转,STOPTIVE电机停止. ucSpeed ,电机转速
;; SP100-SP10(10-1)
;;函数输出: 无
;;函数返回值: 无
;;被调用函数: 任意
***************************************************************************************/
uchar Mot(uchar ucWay,uchar ucSpeed)
{
switch (ucWay)
{
case STOPTIVE:
MOTONOFF = 1;
break;
case POSITIVE:
PwmTime0_int(500,ucSpeed);//1khz的PWM信号
MOTDIR = 0;
MOTONOFF = 0;
break;
case NEGATIVE:
PwmTime0_int(500,ucSpeed);
MOTDIR = 1;
MOTONOFF = 0;
break;
default:
return (FAILED);
}
return (SUCCEED);
}
/**************************************************************************************
;;函数原型: void MotControl()
;;函数功能: 电机控制程序
;;函数输入: 无
;;函数输出: 无
;;函数返回值: 无
;;被调用函数: main
***************************************************************************************/
void MotControl(void)
{ uchar ucTxdBuf[8];
if( bitSysAllowWork )
{
if((StopCar.sta == START)||(StopCar.sta == RUN))
{
switch( StopCar.cmd )
{
case MS_REST_STOP_CAR:
if(HUOER_REST)//判断是否在复位霍尔位置
{
if(StopCar.sta == START)//首次执行
{
StopCar.sta = RUN;
Mot(NEGATIVE,P10WM); //执行复位操作电机反转
bitRstFlg = 1; //标记复位操作电机启动
TimerNo[7] = CVERTIME;//启动超时定时器
fTimer &= ~(0x01<<7);
}
else
{
if(fTimer&(0x01<<7))//判断超时
{
ucTxdBuf[0] = 0x03;//00000011回复相应结果(电机故障或者复位霍尔故障)
CAN_TXD( MADDRESS,SM_REST_STOP_CAR,UN_ACK,1,ucTxdBuf );
StopCar.sta = STOP;
}
}
}
else
{
ucTxdBuf[0] = 0;//回复复位成功
CAN_TXD( MADDRESS,SM_REST_STOP_CAR,UN_ACK,1,ucTxdBuf );
StopCar.sta = STOP;
}
break;
case MS_STOP_CAR50_SLOW:
case MS_STOP_CAR50_FAST:
if(HUOER_MIDO)//判断中卫霍尔位置
{
if(StopCar.sta == START)//首次执行
{
if( HUOER_REST )//判断不在复位霍尔位置
{
Mot(NEGATIVE,P10WM); //执行复位操作电机快反转
bitRstFlg = 1; //标记复位操作电机启动
//电机慢速反转复位
}
else //判断在复位霍尔位置
{
if(StopCar.cmd == MS_STOP_CAR50_FAST)
Mot(POSITIVE,P10WM); //执行电机快正转
else
Mot(POSITIVE,P7WM); //执行电机快正转
bitMidoFlg = 1; //标记中位操作电机启动
}
StopCar.sta = RUN;
TimerNo[7] = CVERTIME;//启动超时定时器
fTimer &= ~(0x01<<7);
//启动超时定时器
}
else
{
if(!HUOER_REST)//在复位位置
{//电机调整为正传
if(StopCar.cmd == MS_STOP_CAR50_FAST)
Mot(POSITIVE,P10WM); //执行电机快正转
else
Mot(POSITIVE,P7WM); //执行电机快正转
bitMidoFlg = 1; //标记中位操作电机启动
}
if(fTimer&(0x01<<7))//判断超时
{
ucTxdBuf[0] = 0x05;//00000101回复相应结果(电机故障或者中卫霍尔故障)
CAN_TXD( MADDRESS,StopCar.cmd,UN_ACK,1,ucTxdBuf );
//刹车强制复位
StopCar.sta = STOP;
}
}
}
else
{
if( !bitRstFlg )
{
ucTxdBuf[0] = 0;//回复成功
CAN_TXD( MADDRESS,StopCar.cmd,UN_ACK,1,ucTxdBuf );
StopCar.sta = STOP;
}
}
break;
case MS_STOP_CAR100_SLOW:
case MS_STOP_CAR100_FAST:
if(HUOER_LAST)//判断结尾霍尔位置
{
if(StopCar.sta == START)//首次执行
{
//电机慢速正转
if(StopCar.cmd == MS_STOP_CAR100_FAST)
Mot(POSITIVE,P10WM); //执行电机快正转
else
Mot(POSITIVE,P7WM); //执行电机快正转
bitLastFlg = 1; //标记结位操作电机启动
StopCar.sta = RUN;
//启动超时定时器
TimerNo[7] = CVERTIME;//启动超时定时器
fTimer &= ~(0x01<<7);
}
}
else
{
StopCar.sta = STOP;
if(fTimer&(0x01<<7))//判断超时
{
ucTxdBuf[0] = 0x09;//00001001回复相应结果(电机故障或者中卫霍尔故障)
CAN_TXD( MADDRESS,StopCar.cmd,UN_ACK,1,ucTxdBuf );
//刹车强制复位
}
else
{
ucTxdBuf[0] = 0;//回复成功
CAN_TXD( MADDRESS,StopCar.cmd,UN_ACK,1,ucTxdBuf );
StopCar.sta = STOP;
}
}
break;
default:
break;
}
}
}
}
/***********************************************************************************************************
;;函数原型: uchar SelfTest()
;;函数功能: 自检
;;函数输入: 无
;;函数输出: 无
;;函数返回值: 00 自检通过
8位 7位 6位 5位 4位 3位 2位 1位
代表 超时故障 结尾霍尔 中卫霍尔 复位霍尔 电机故障
;;被调用函数: main
*********************************************************************************************************/
uchar SelfTest()
{
uchar tmpchar,ucResults=0;
if( bitHuoerRest ) //复位测试
{
TimerNo[7] = CVERTIME;//启动超时定时器 25s
fTimer &= ~(0x01<<7);
Mot(NEGATIVE,P10WM); //执行复位操作电机反转
bitRstFlg = 1; //标记复位操作电机启动
do
{
tmpchar = fTimer&(0x01<<7);
if( !bitHuoerRest )
{
// MOTONOFF = 1;
// TR1 = 0;
break;
}
}
while(!tmpchar);
if( bitHuoerRest )
{
ucResults |= 0x03; //电机故障或者复位霍尔故障
return ( ucResults );
}
}
//适当延时
Delay(200);
if( bitHuoerMido ) //中卫位测试
{
TimerNo[7] = CVERTIME;//启动超时定时器 25s
fTimer &= ~(0x01<<7);
Mot(POSITIVE,P10WM); //执行电机快正转
bitMidoFlg = 1; //标记中位操作电机启动
do
{
tmpchar = fTimer&(0x01<<7);
if( !bitHuoerMido )
{
// MOTONOFF = 1;
// TR1 = 0;
break;
}
}
while(!tmpchar);
if( bitHuoerMido )
{
ucResults |= 0x04; //中卫霍尔故障
}
}
//适当延时
Delay(200);
if( bitHuoerLast ) //后位测试
{
TimerNo[7] = CVERTIME;//启动超时定时器 25s
fTimer &= ~(0x01<<7);
Mot(POSITIVE,P10WM); //执行电机快正转
bitLastFlg = 1; //标记结位操作电机启动
do
{
tmpchar = fTimer&(0x01<<7);
if( !bitHuoerLast )
{
// MOTONOFF = 1;
// TR1 = 0;
break;
}
}
while(!tmpchar);
if( bitHuoerLast )
{
ucResults |= 0x08; //末尾霍尔故障
}
}
//适当延时
Delay(200);
if( bitHuoerRest ) //复位测试
{
TimerNo[7] = CVERTIME;//启动超时定时器 25s
fTimer &= ~(0x01<<7);
Mot(NEGATIVE,P10WM); //执行复位操作电机反转
bitRstFlg = 1; //标记复位操作电机启动
do
{
tmpchar = fTimer&(0x01<<7);
if( !bitHuoerRest )
{
// MOTONOFF = 1;
// TR1 = 0;
break;
}
}
while(!tmpchar);
if( bitHuoerRest )
ucResults |= 0x03;
}
return ( ucResults );
}
/**************************************************************************************
;;函数原型: SysInit()
;;函数功能: 系统准备初始化阶段
;;函数输入: 无
;;函数输出: 无
;;函数返回值: 无
;;被调用函数: main
************************************************************************************/
void SysReadyInit()
{ uchar tmpchar,ucTxdBuf[1];
//启动延时1等待自检命令
TimerNo[7] = SELF_TEST_CVERTIME;//启动超时定时器 5s
fTimer &= ~(0x01<<7);
do
{
if( (CanRx.farmeSta == FULL)&&(CanRx.farmeType == MS_SELF_TEST) )
{
//做出接收应答进入自检状态
ucTxdBuf[0] = 0x00;//000000回复相应结果
CAN_TXD( MADDRESS,SM_RECEV_OK,UN_ACK,1,ucTxdBuf );
//上传自检结果
ucTxdBuf[0] = SelfTest();//开始自检
CAN_TXD( MADDRESS,SM_SELF_TEST,UN_ACK,1,ucTxdBuf );
CanRx.farmeSta = NULL;
break;
}
tmpchar = (fTimer&(0x01<<7));
}
while(!tmpchar);
//无自检命令,电机复位申请准备命令
//规定时间内收到请求工作命令 1分钟
TimerNo[7] = 240;//启动超时定时器 2分钟
fTimer &= ~(0x01<<7);
do
{
if(CanRx.farmeSta == FULL)
{
if( CanRx.farmeType == MS_ALLOW_IN_WORKING )
{
//应答
ucTxdBuf[0] = 0x00;//000000回复相应结果
CAN_TXD( MADDRESS,SM_RECEV_OK,UN_ACK,1,ucTxdBuf );
bitSysAllowWork = 1;//进入工作状态标记置一
CAN_TXD( MADDRESS,MS_ALLOW_IN_WORKING,UN_ACK,1,ucTxdBuf );
return;
}
CanRx.farmeSta = NULL;
}
else
tmpchar = (fTimer&(0x01<<7));
}
while(!tmpchar);
//进入休眠模式
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -