You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

143 lines
3.7 KiB

#include "ozone_control_service.h"
#include "../zes8p5066lib/systicket.h"
#include "frequency_sweep_service.h"
#include "state_machine.h"
/**
* @brief
*
* 状态机:
* 不工作 ------> 扫描频率 --扫描频率完成--> 工作
* ^ |
* |---------切换等级---------|
*
*
* 不工作 -----> 设备自检 --> 扫描频率 --扫描频率完成--> 工作
*
**/
typedef enum {
kIdleState,
kBeforeWorkingStateSweepFrequency,
kWorkingState,
} StateId_t;
state_machine_state_t states[] = {
[kIdleState] =
{
.name = "kIdleState",
.stateId = kIdleState,
.duration = 0,
},
[kBeforeWorkingStateSweepFrequency] =
{
.name = "kBeforeWorkingStateSweepFrequency",
.stateId = kBeforeWorkingStateSweepFrequency,
.duration = 0,
},
[kWorkingState] = //
{
.name = "kWorkingState",
.stateId = kWorkingState,
.duration = 0,
}
//
};
state_machine_t statemachine = {
.states = states,
.nstate = sizeof(states) / sizeof(states[0]),
.nowstate = &states[kIdleState],
.process_event = NULL,
.nextstate = NULL,
.laststate = NULL,
};
typedef struct {
float resonant_frequency;
} Context_t;
static Context_t context;
static float const_level1_expect_power;
static uint16_t get_resonant_frequency(uint16_t startfreq, uint16_t step, uint16_t endfreq) {
/**
* @brief
*/
float minpower = 0;
uint16_t retfreq = 0;
bool inited = false;
for (uint16_t freq = startfreq; freq <= endfreq; freq += step) {
float power = frequency_sweep_get_power(freq);
if (inited) {
minpower = power;
retfreq = freq;
inited = false;
continue;
}
if (power < minpower) {
minpower = power;
retfreq = freq;
}
}
return retfreq;
}
static state_machine_state_t* processBeforeWorkingStateSweepFrequency(state_machine_t* machine, state_machine_state_t* nowstate, int event) {
/**
* @brief 扫频
*/
if (event == ENTER_STATE) {
frequency_sweep_start(20000, 100, 40000, 3000);
} else if (event == TIME_EVENT) {
if (frequency_sweep_is_done()) {
context.resonant_frequency = get_resonant_frequency(25000, 100, 35000);
printf("----------Summarize--------\n");
printf("-resonant_frequency: %f\n", context.resonant_frequency);
return &states[kWorkingState];
}
} else if (event == EXIT_STATE) {
frequency_sweep_stop();
}
}
static float mf_get_ozone_power() {
float powersum = 0;
for (size_t i = 0; i < 10; i++) {
powersum += port_adc_get_ozone_generator_power();
}
return powersum / 10;
}
static state_machine_state_t* state_machine_process_event(state_machine_t* machine, state_machine_state_t* nowstate, int event) {
if /* */ (nowstate == &states[kIdleState]) {
} else if (nowstate == &states[kBeforeWorkingStateSweepFrequency]) {
processBeforeWorkingStateSweepFrequency(machine, nowstate, event);
} else if (nowstate == &states[kWorkingState]) {
if (event == ENTER_STATE) {
/**
* @brief 在谐振点启动,此时臭氧功率最小
*/
port_ozone_pwm_set_duty(context.resonant_frequency, 5000);
port_ozone_pwm_start();
} else if (event == TIME_EVENT) {
/**
* @brief 实时获取当前功率,并调整频率到指定功率
*/
static uint32_t last_ticket = 0;
if (systicket_haspassedms(last_ticket) > 10) {
last_ticket = systicket_getms();
float power = mf_get_ozone_power();
}
} else if (event == EXIT_STATE) {
port_ozone_pwm_stop();
}
}
}
/**
* @brief
* 风扇加板子静态功率1.6W
*/