提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
此前做过的小项目代码都是比较简单,简单的流水线似的逻辑就可以囊括所需要的功能;最近接触的电源项目,在正常的控制pwm输出之外,还需要各种辅助功能,比如过压保护,短路保护功能,温度监控,风扇控制等,就不能按照简单的顺序逻辑了;在该项目中就接触到了有限状态机的概念,虽然以往课堂上也接触过状态机,但都是仅存于认识,并没有深入理解,进到一线干活才会发现这些理论的实用性,所以本文将记录一下此次项目中有限状态机的c语言实现框架,方便以后取用。
一、有限状态机
有限状态机(Finite-state machine,FSM),是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。通俗理解就是当前有有限个状态,但对于单核单线程而言,当前的工作状态只有一种,每一次工作状态的转移都需要一定的触发条件。
四、转态切换示意图
三、代码
1.使用枚举定义状态
代码如下:
/**********************系统任务**************************************/
typedef enum
{
Task_0_Initial_state, //初始状态
Task_1_SelfLock_detc, //自锁开关
Task_2_Vin_detc, //检测输入电压
Task_3_Iin_detc, //检测输入电流
Task_4_Temprature_detc, //温度监测
Task_5_Vout_detc, //输出监控
Task_6_Soft_start, //开始缓启动
Task_TxRx_state, //通讯状态
//......//可以继续定义其他状态
}System_Task;
首先定义好各种需要的状态,比如电源需要初始化状态,开关检测状态等;
2.swicth进行状态机的切换
代码如下:
void state_machine(void) //状态机
{
Next_State=Current_State=Task_0_Initial_state;
while(1)
{
Current_State=Next_State;
switch(Current_State)
{
case Task_0_Initial_state:
{
Reset_VAR(); //复位初始化各种变量与标志
Next_State=Task_TxRx_state; //下一状态:与上位机进行通讯
} break;
case Task_TxRx_state://与上位机进行通讯
{
Next_State=Task_1_SelfLock_detc;//下一状态:检测自锁开关
} break;
case Task_1_SelfLock_detc://检测自锁开关
{
Next_State=Task_2_Vin_detc; //下一状态:检测电压
}
break;
case Task_2_Vin_detc://检测输入电压
{
if()//电压不正常
Next_State=Task_0_Initial_state;//切换到初始化状态
Next_State=Task_3_Iin_detc;//下一转态 :检测电流输入
} break;
case Task_3_Iin_detc : //检测输入过流保护,有待测试
{
if()//电流不正常
Next_State=Task_0_Initial_state;切换到初始化状态
Next_State=Task_4_Temprature_detc;
} break;
case Task_4_Temprature_detc : //检测温度过高保护
{
if()//温度不正常
Next_State=Task_0_Initial_state;切换到初始化状态
Next_State=Task_5_Vout_detc;//下一转态 :检测电压输出
} break;
case Task_5_Vout_detc : //检测输出
{
if()//输出电压不正常
Next_State=Task_0_Initial_state;切换到初始化状态
Next_State=Task_6_Soft_start;//下一转态 :缓启动
} break;
case Task_6_Soft_start ://缓启动
{
Next_State=Task_TxRx_state;//下一转态 :与上位机通讯
} break;
default: break;
}
}
}
这一段代码框架就是状态的切换过程,只要修改Next_State变量就可以实现下一个转态的切换,大概的逻辑流程首先进入初始化状态,初始化各种参数,比如PID参数等,然后就是检测开关是否开启,之后就是启动前的电压,电流,温度检测,只有当这些都正常才开启软启动开机,不然都会在出问题的那个状态态切换到初始化转态,重新进行各种判断,直到正常启动,此后就一直在正常工作的状态与通讯状态、电压电流检测状态之间进行切换。当然具体的状态切换可根据自己的项目进行修改。
总结
由于这是项目中第一次接触到的有限状态机概念,以前都是在课本上学习理论知识,对于其优点没有多大的体会,使用有限状态机思想编程的思想带来的体会就是:编程逻辑清晰了,改需求也容易多,只需要增删对应的状态就能达到增删项目的功能。本文也只是简单地记录了项目中使用过的有限状态机的基本框架,便于自己日后的使用