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
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
|
|
*/
|