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

📄 waittask.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
字号:
#include "CGJ.H"                // 包含项目头文件
#include <math.h>               // 包含算术运算头文件
#include "control.h"            // 包含控制任务所共有的头文件
#include "DataBuffer.h"         // 包含数据缓冲头文件
#include "i2c.h"

/*****************************************************************************************************************
* 待机状态任务
*****************************************************************************************************************/
void WaitTask(void *pdata)
{
    FP32        copy_speed_real_value;
    INT8U       l, time, err;
    OS_FLAGS    flag;
    FP32        FirstSpeed, CurrSpeed;
    INT32U      AccelTick;
        
    mcs         = 0;                                                    // 计算速度的参数清0,
    mczq        = 0;
    sc_t1cr0    = T1TC;                                                 // 得到实时的T1TC值
    sc_t1cr1    = T1TC;
    
    OSTimeDly(TASK_DELAY_TIME * 4);                                     // 将任务挂起几个节拍,
                                                                        // 这样做,是为了在第一次计算时,得到正确的
    
    FirstSpeed = 0;
    CurrSpeed  = 0;

    AccelTick  = 0;
    
     
    while(1){
        flag = OSFlagAccept(task_status, 
                            WAIT_FLAG,
                            OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,
                            &err);
        switch(flag){
            case LIFT_UP:                                       // 举升上升
                CountSpeed();
                OSTimeDly(COUNT_SPEED_TIME);
                CountSpeed();
                if(parameter[SPEED] < 2){
                    IOCLR = ZSXJ;                          // 如果当前测功机速度小于2Km/h,举升上升
                    IOSET = ZSSS;
                    OSTimeDlyHMSM(0, 0, 2, 0);
                    IOCLR = ZSSS;
                    SendProgramRunStatus(LIFT_UP_ACTION);       // 向上位机送出相关信息
                }else{
                    SendProgramRunStatus(SPEED_BEYOND_WRONG);   // 当前速度大于2Km/h,举升不能上升,向上位机送出相关信息
                }
                break;
            case LIFT_DOWN:                                     // 举升下降
                CountSpeed();
                OSTimeDly(COUNT_SPEED_TIME);
                CountSpeed(); 
                if(parameter[SPEED] < 2){
                    IOCLR = ZSSS;
                    IOSET = ZSXJ;
                    OSTimeDlyHMSM(0, 0, 2, 0);
                    IOCLR = ZSXJ;
                    SendProgramRunStatus(LIFT_DOWN_ACTION);
                }else{
                    SendProgramRunStatus(SPEED_BEYOND_WRONG);
                }
                break;
            case OPEN_MOTOR:
                CountSpeed();
                OSTimeDly(COUNT_SPEED_TIME);
                CountSpeed();
                if(parameter[SPEED] < 2) {
                    IOSET = TRANS_MOTOR;
                    SendProgramRunStatus(MOTOR_START);
                }else {
                    SendProgramRunStatus(SPEED_BEYOND_WRONG);
                }
                                
                break;
            case CLOSE_MOTOR:
                IOCLR = TRANS_MOTOR;
                SendProgramRunStatus(MOTOR_STOP);               
                break;
            case DEMA_SPEED:
                CountSpeedParameter();
                SendProgramRunStatus(WriteSpeedSetParameter());
                break;
            case START_CONTROL_SI:
                igbt_value = 0;
                IGBT_SetPeriodCount(0);
                IGBT_Enable();                
                SendProgramRunStatus(ENTER_CONTROL_IGBT);
                
                break;
            case STOP_CONTROL_SI:
                igbt_value = 0;
                IGBT_SetPeriodCount(0);
                IGBT_Disable();
                
                SendProgramRunStatus(EXIT_CONTROL_IGBT);
                
                break;
            case SI_VALUE:
                IGBT_SetPeriodCount(igbt_value);             
                SendProgramRunStatus(IGBT_SET_SUCCESS);
                break;
            
            default:
                break;
        }
        
                        
        copy_speed_real_value = parameter[SPEED];
                
        if(copy_speed_real_value > 10){
            CountSpeed();
            time = 0;
        }else if(++time >= COUNT_SPEED_TIME){
            CountSpeed();                                               // 计算速度
            time = 0;
        }
        
        CountForce();                                                   // 计算力和功率

        InsertSpeedPoint(parameter[SPEED]);
        InsertForcePoint(parameter[FORCE]);
        
        if(++l == SEND_DELAY_TIME){                                     // 向上位机送出检测到的数据, 每2个时钟周期发一次
            l = 0;                                                      // 向上位机送数据计时器清0  
            OS_ENTER_CRITICAL();

            parameter[SPEED] = GetAdverOfSpeed();
            parameter[FORCE] = GetAdverOfForce();
            parameter[POWER] = parameter[SPEED] * parameter[FORCE] / 360 / 10;
            
            // 计算加速度
            CurrSpeed = parameter[SPEED];
                                    
            OS_EXIT_CRITICAL();

            SendRealParaToComputer();
        }

        if(++AccelTick == 100) {
            AccelTick = 0;
        
            OS_ENTER_CRITICAL();

            if(CurrSpeed > 5) {
                parameter[JSD] = (CurrSpeed - FirstSpeed) * 1000 / 3600;
            }else {
                parameter[JSD] = 0;
            }

            OS_EXIT_CRITICAL();

            FirstSpeed = CurrSpeed;

        }

        OSTimeDly(TASK_DELAY_TIME);                                     // 将任务挂起2个节拍
    }
}

⌨️ 快捷键说明

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