#include "ozone_pwm_control.h" uint32_t s_hardware_frequency; //单位ms,保存现在的PWM频率 uint32_t s_hardware_duty; //单位ms,保存现在的PWM占空比 uint32_t s_large_period; //单位ms,保存现在的定时周期 uint32_t s_large_duty = 100; //单位ms,保存现在的定时占空比 uint32_t begin_ticket; bool ozone_pwm_control_enable_falg = false; void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty); void HOOK_pwm_stop(void); bool HOOK_pwm_is_enable(void); static void prv_update_begin_ticket(void) { begin_ticket = get_sys_ticket(); //更新大周期的开始时间(间歇时间的开始的时间) } void ozone_pwm_control_enable(void) { ozone_pwm_control_enable_falg = true; } void ozone_pwm_control_disable(void) { ozone_pwm_control_enable_falg = false; } bool ozone_pwm_control_is_enable(void) { return ozone_pwm_control_enable_falg; } /** * @brief 一直工作的时间定时的占空比为100, * 间歇时间设置300000 * @param freq * @param duty */ void ozone_pwm_control_module_set_pwm_output_1(uint32_t large_period, uint8_t large_duty) { s_large_period = large_period; s_large_duty = large_duty; prv_update_begin_ticket(); ozone_pwm_control_enable(); if (large_duty == 100) { ozone_pwm_control_disable(); } } /** * @brief 定时和PWM * * @param hardware_period pwm频率 * @param hardware_duty pwm占空比 * @param large_period 定时周期 * @param large_duty 定时占空比 */ void ozone_pwm_control_module_set_pwm_output_2(uint32_t hardware_period, uint8_t hardware_duty, uint32_t large_period, uint8_t large_duty) { s_hardware_frequency = hardware_period; s_hardware_duty = hardware_duty; s_large_period = large_period; s_large_duty = large_duty; prv_update_begin_ticket(); ozone_pwm_control_enable(); HOOK_pwm_module_set_pwm_duty(hardware_period, hardware_duty); if (large_duty == 100) { ozone_pwm_control_disable(); } } void ozone_pwm_control_module_stop_pwm(void) {} void ozone_pwm_control_module_loop(void) { static uint32_t hardware_frequency; static uint32_t hardware_duty; if (ozone_pwm_control_is_enable() == false) { //没有使能直接退出 HOOK_pwm_stop(); return; } if (port_haspassedms(begin_ticket) % s_large_period <= s_large_period * s_large_duty / 100) { if (!HOOK_pwm_is_enable()) { printf("set work\r\n"); HOOK_pwm_module_set_pwm_duty(hardware_frequency, hardware_duty); } } else { if (HOOK_pwm_is_enable()) { printf("set rest\r\n"); hardware_frequency = s_hardware_frequency; //将关闭之前的频率进行保存 hardware_duty = s_hardware_duty; //将关闭之前的占空比进行保存 HOOK_pwm_stop(); } } }