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

📄 common.c

📁 51单片机基于CAN总线通信程序
💻 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 + -