📄 waittask.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 + -