15 changed files with 1558 additions and 658 deletions
-
5.vscode/settings.json
-
18APP/key.c
-
196APP/light.c
-
63APP/light.h
-
57APP/main.c
-
3APP/main.h
-
156APP/ozone_pwm_control.c
-
42APP/ozone_pwm_control.h
-
6APP/ozone_work.h
-
152APP/pwm.c
-
35APP/pwm.h
-
1228project_ozone/Listings/project_o.map
-
193project_ozone/project_o.uvgui.admin
-
52project_ozone/project_o.uvopt
-
10project_ozone/project_o.uvproj
@ -0,0 +1,196 @@ |
|||||
|
#include "light.h" |
||||
|
rgb_message_t rgb_message; |
||||
|
TIMING_MODE_T timing_mode; |
||||
|
ERROR_MODE_T error_mode; |
||||
|
timing_message_t timing_message; |
||||
|
|
||||
|
/** |
||||
|
* @brief 设置灯的模式,高低中分别亮不同颜色的灯 |
||||
|
* |
||||
|
*/ |
||||
|
void light_module_set_rgb_mode(RGB_MODE_T mode) { |
||||
|
if (mode == OPEN_RED_LIGHT) { |
||||
|
port_led_r_set(true); |
||||
|
port_led_g_set(false); |
||||
|
port_led_b_set(false); |
||||
|
rgb_message.turn_off_the_mode_before_rgb = OPEN_RED_LIGHT; |
||||
|
} else if (mode == OPEN_GREEN_LIGHT) { |
||||
|
port_led_r_set(false); |
||||
|
port_led_g_set(true); |
||||
|
port_led_b_set(false); |
||||
|
rgb_message.turn_off_the_mode_before_rgb = OPEN_GREEN_LIGHT; |
||||
|
} else if (mode == OPEN_BLUE_LIGHT) { |
||||
|
port_led_r_set(false); |
||||
|
port_led_g_set(false); |
||||
|
port_led_b_set(true); |
||||
|
rgb_message.turn_off_the_mode_before_rgb = OPEN_BLUE_LIGHT; |
||||
|
} else if (mode == CLOSE_RGB_LIGHT) { |
||||
|
rgb_message.turn_off_the_mode_before_rgb = OPEN_BLUE_LIGHT; |
||||
|
port_led_r_set(false); |
||||
|
port_led_g_set(false); |
||||
|
port_led_b_set(false); |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* @brief 设置rgb闪烁或者不闪烁 |
||||
|
* |
||||
|
* @param mode |
||||
|
*/ |
||||
|
void light_module_set_rgb_flicker_mode(bool state) { |
||||
|
if (state == false) { |
||||
|
rgb_message.rgb_flicker_mode = false; |
||||
|
} else if (state == true) { |
||||
|
rgb_message.rgb_flicker_mode = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void process_rgb_flicker_mode() { |
||||
|
static uint32_t rgb_flicker_ticket = 0; |
||||
|
static uint8_t rgb_ticket_count = 0; |
||||
|
if (port_haspassedms(rgb_flicker_ticket) > 1000) { |
||||
|
rgb_flicker_ticket = get_sys_ticket(); |
||||
|
if (rgb_ticket_count < 3) { |
||||
|
// turn_off_the_mode_before_rgb保存了关闭之前的RGB亮灯的模式 |
||||
|
light_module_set_rgb_mode(rgb_message.turn_off_the_mode_before_rgb); |
||||
|
} else { |
||||
|
light_module_set_rgb_mode(CLOSE_RGB_LIGHT); |
||||
|
rgb_ticket_count = 0; |
||||
|
} |
||||
|
rgb_ticket_count++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 定时30min 60min 90min 120min分别打开led3 led2 led1 led0灯 |
||||
|
* |
||||
|
* @param mode |
||||
|
*/ |
||||
|
void light_module_set_timing_light_mode(TIMING_MODE_T mode) { |
||||
|
if (mode == OPEN_ONE_LED) { |
||||
|
port_led0_set(true); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == OPEN_TWO_LED) { |
||||
|
port_led0_set(true); |
||||
|
port_led1_set(true); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == OPEN_THREE_LED) { |
||||
|
port_led0_set(true); |
||||
|
port_led1_set(true); |
||||
|
port_led2_set(true); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == OPEN_FOUR_LED) { |
||||
|
port_led0_set(true); |
||||
|
port_led1_set(true); |
||||
|
port_led2_set(true); |
||||
|
port_led3_set(true); |
||||
|
} else if (mode == CLOSE_ALL_LED) { |
||||
|
port_led0_set(false); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} |
||||
|
timing_message.now_timing_mode=mode; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 不同错误状态下灯的闪烁状态 |
||||
|
* |
||||
|
* @param mode |
||||
|
*/ |
||||
|
void light_module_set_error_light_mode(uint8_t mode) { |
||||
|
if (mode == ERROR_MODE0) { |
||||
|
port_led0_set(false); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == ERROR_MODE1) { |
||||
|
port_led0_set(false); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == ERROR_MODE2) { |
||||
|
port_led0_set(false); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} else if (mode == ERROR_MODE3) { |
||||
|
port_led0_set(false); |
||||
|
port_led1_set(false); |
||||
|
port_led2_set(false); |
||||
|
port_led3_set(false); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 关闭rgb,关闭led0~led3 |
||||
|
* |
||||
|
*/ |
||||
|
void light_module_close_all_light(void) { |
||||
|
light_module_set_rgb_mode(CLOSE_RGB_LIGHT); |
||||
|
light_module_set_timing_light_mode(CLOSE_ALL_LED); |
||||
|
light_module_set_rgb_flicker_mode(false); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 测试按键控制RGB的亮灭 |
||||
|
* |
||||
|
*/ |
||||
|
void test_set_rgb_mode(void) { |
||||
|
printf("try_test_set_rgb_mode\r\n"); |
||||
|
static int i = 0; |
||||
|
if (i == 0) { |
||||
|
i = 1; |
||||
|
light_module_set_rgb_mode(OPEN_RED_LIGHT); |
||||
|
} else if (i == 1) { |
||||
|
i = 2; |
||||
|
light_module_set_rgb_mode(OPEN_GREEN_LIGHT); |
||||
|
} else if (i == 2) { |
||||
|
i = 3; |
||||
|
light_module_set_rgb_mode(OPEN_BLUE_LIGHT); |
||||
|
} else if (i == 3) { |
||||
|
i = 0; |
||||
|
light_module_set_rgb_mode(CLOSE_RGB_LIGHT); |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* @brief 测试按键控制led0~led3的亮灭 |
||||
|
* |
||||
|
*/ |
||||
|
void test_set_led_mode(void) { |
||||
|
printf("try_test_set_led_mode\r\n"); |
||||
|
static int j = 0; |
||||
|
if (j == 0) { |
||||
|
j = 1; |
||||
|
light_module_set_timing_light_mode(OPEN_ONE_LED); |
||||
|
} else if (j == 1) { |
||||
|
j = 2; |
||||
|
light_module_set_timing_light_mode(OPEN_TWO_LED); |
||||
|
} else if (j == 2) { |
||||
|
j = 3; |
||||
|
light_module_set_timing_light_mode(OPEN_THREE_LED); |
||||
|
} else if (j == 3) { |
||||
|
j = 4; |
||||
|
light_module_set_timing_light_mode(OPEN_FOUR_LED); |
||||
|
} else if (j == 4) { |
||||
|
j = 0; |
||||
|
light_module_set_timing_light_mode(CLOSE_ALL_LED); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 测试按键控制rgb闪烁或者不闪烁 |
||||
|
* |
||||
|
*/ |
||||
|
void test_set_rgb_flicker_mode(void) { |
||||
|
printf("test_light_module_set_rgb_flicker_mode\r\n"); |
||||
|
static bool m = false; |
||||
|
if (m == 0) { |
||||
|
light_module_set_rgb_flicker_mode(true); |
||||
|
} else if (m == 1) { |
||||
|
light_module_set_rgb_flicker_mode(false); |
||||
|
} |
||||
|
m = !m; |
||||
|
} |
@ -0,0 +1,63 @@ |
|||||
|
#ifndef _LIGHT_H_ |
||||
|
#define _LIGHT_H_ |
||||
|
|
||||
|
#include "lib_config.h" |
||||
|
#include "port.h" |
||||
|
#include "system_ES8P5066.h" |
||||
|
#include "systick.h" |
||||
|
|
||||
|
|
||||
|
typedef enum { |
||||
|
OPEN_RED_LIGHT = 0, /*打开红灯*/ |
||||
|
OPEN_GREEN_LIGHT = 1, /*打开绿灯*/ |
||||
|
OPEN_BLUE_LIGHT = 2, /*打开蓝灯*/ |
||||
|
CLOSE_RGB_LIGHT = 3, /*关闭灯*/ |
||||
|
} RGB_MODE_T; |
||||
|
|
||||
|
|
||||
|
|
||||
|
typedef struct { |
||||
|
RGB_MODE_T turn_off_the_mode_before_rgb; |
||||
|
bool rgb_flicker_mode; |
||||
|
bool already_set_rgb_mode; |
||||
|
} rgb_message_t; |
||||
|
|
||||
|
|
||||
|
typedef enum { |
||||
|
OPEN_ONE_LED = 0, /*打开LED0*/ |
||||
|
OPEN_TWO_LED = 1, /*打开LED0 打开LED1*/ |
||||
|
OPEN_THREE_LED = 2, /*打开LED0 打开LED1 打开LED2*/ |
||||
|
OPEN_FOUR_LED = 3, /*打开LED0 打开LED1 打开LED2 打开LED3*/ |
||||
|
CLOSE_ALL_LED = 4, /*关闭LED0 LED1 LED2 LED3*/ |
||||
|
} TIMING_MODE_T; |
||||
|
|
||||
|
typedef struct { |
||||
|
TIMING_MODE_T now_timing_mode; |
||||
|
} timing_message_t; |
||||
|
|
||||
|
typedef enum { |
||||
|
ERROR_MODE0 = 0, /*打开LED0*/ |
||||
|
ERROR_MODE1 = 1, /*打开LED1*/ |
||||
|
ERROR_MODE2 = 2, /*打开LED2*/ |
||||
|
ERROR_MODE3 = 3, /*打开LED3*/ |
||||
|
} ERROR_MODE_T; |
||||
|
|
||||
|
|
||||
|
|
||||
|
void light_module_set_rgb_mode(RGB_MODE_T mode); |
||||
|
//void light_module_set_rgb_flicker_mode(RGB_FLICKER_MODE_T mode); |
||||
|
void light_module_set_timing_light_mode(TIMING_MODE_T mode); |
||||
|
void light_module_set_error_light_mode(uint8_t error_mode); |
||||
|
void light_module_close_all_light(void); |
||||
|
void process_rgb_flicker_mode(void); |
||||
|
// light_module_processs(){ |
||||
|
// process_rgb_flicker_mode(); |
||||
|
// }; |
||||
|
|
||||
|
void light_module_schedule(void); |
||||
|
|
||||
|
|
||||
|
void test_set_rgb_mode(void); |
||||
|
void test_set_led_mode(void); |
||||
|
void test_set_rgb_flicker_mode(void); |
||||
|
#endif |
@ -0,0 +1,156 @@ |
|||||
|
// #include "ozone_pwm_control.h" |
||||
|
// #define TIMINT_TIM 1800000 |
||||
|
// #define INTERVAL_TIM 300000 |
||||
|
|
||||
|
// #define CLCK 48 |
||||
|
|
||||
|
// ozone_messages_t ozone_messages; |
||||
|
// extern timing_message_t timing_message; |
||||
|
|
||||
|
// extern uint32_t g_duty[4]; // PWMd的占空比 |
||||
|
// extern uint32_t g_frequency; |
||||
|
// extern ozone_message_t ozone_message; |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 定时周期 |
||||
|
// * * |
||||
|
|
||||
|
// * @brief 设置间歇工作的周期 |
||||
|
// * |
||||
|
// * @param ozone_interval_period |
||||
|
// * @param ozone_interval_duty |
||||
|
// */ |
||||
|
// void ozone_pwm_control_set_pwm2(uint32_t ozone_interval_period,uint32_t ozone_interval_duty){ |
||||
|
|
||||
|
// } |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 设置臭氧PWM工作时间的模式,一直工作,定时工作,间歇工作,不工作 |
||||
|
// * |
||||
|
// * @param mode |
||||
|
// */ |
||||
|
// void set_ozone_work_mode(OZONE_WOEK_MODE_T mode) { |
||||
|
// if (mode == HAS_BEEN_WORKING) { |
||||
|
// set_ozone_work_gears(ozone_messages.will_be_set_work_gears); |
||||
|
// } else if (mode == TIMING_WORK) { |
||||
|
// ozone_pwm_control_set_pwm_output_1(ozone_messages.ozone_timing_duty); |
||||
|
// } else if (mode == TIMING_INTERVAL_WORK) { |
||||
|
// ozone_pwm_control_set_pwm_output_2(ozone_messages.ozone_timing_duty, |
||||
|
// ozone_messages.ozone_interval_duty); |
||||
|
// } else if (mode == STOP_PWM_WORK) { |
||||
|
// ozone_pwm_control_stop_pwm(); |
||||
|
// } |
||||
|
// ozone_messages.now_ozone_woek_mode = mode; |
||||
|
// } |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 设置臭氧PWM工作档位 |
||||
|
// * |
||||
|
// * @param mode |
||||
|
// */ |
||||
|
// void set_ozone_work_gears(OZONE_WOEK_GEARS_T gears) { |
||||
|
// if (gears == LOW_END) { |
||||
|
// ozone_pwm_control_set_pwm_duty(ozone_messages.ozone_pwm_frequency, |
||||
|
// ozone_messages.ozone_pwm_duty); |
||||
|
// } else if (gears == MIDDLE_GRADE) { |
||||
|
// ozone_pwm_control_set_pwm_duty(ozone_messages.ozone_pwm_frequency, |
||||
|
// ozone_messages.ozone_pwm_duty); |
||||
|
// } else if (gears == SLAP_UP) { |
||||
|
// ozone_pwm_control_set_pwm_duty(ozone_messages.ozone_pwm_frequency, |
||||
|
// ozone_messages.ozone_pwm_duty); |
||||
|
// } |
||||
|
// ozone_messages.now_ozone_woek_gears = gears; |
||||
|
// } |
||||
|
// //###################################################### |
||||
|
// double calculate_top(double target_frequency) { |
||||
|
// int clck = 0; |
||||
|
// int target_frequency_hz = 0; |
||||
|
// int top = 0; |
||||
|
// clck = CLCK * 1000 * 1000; |
||||
|
// target_frequency_hz = (int)target_frequency * 1000; |
||||
|
// // printf("target_frequency_hz%d\n", target_frequency_hz); |
||||
|
// top = clck / target_frequency_hz; |
||||
|
// // printf("top%d\t\n", top); |
||||
|
// return top; |
||||
|
// } |
||||
|
// double calculate_MAT2(double top, double duty) { |
||||
|
// double percentage_duty = 0; |
||||
|
// double Mat2 = 0; |
||||
|
// percentage_duty = duty / 100; |
||||
|
// Mat2 = top * percentage_duty; |
||||
|
// return Mat2; |
||||
|
// } |
||||
|
|
||||
|
// void ozone_pwm_control_set_pwm_duty(uint32_t set_frequency, uint32_t set_duty) { |
||||
|
// double top = 0; |
||||
|
// double Mat2 = 0; |
||||
|
// if (set_frequency > CLCK * 1000) { |
||||
|
// printf("out of range\n"); |
||||
|
// return; |
||||
|
// } |
||||
|
// top = calculate_top(set_frequency); //根据需要的频率计算出TOP(自动重装载值) |
||||
|
// if (top == 0) { |
||||
|
// return; |
||||
|
// } |
||||
|
// Mat2 = calculate_MAT2(top, set_duty); |
||||
|
// // printf("top:\t%2.lf\n", top); |
||||
|
// // printf("MAT2:\t%2.lf\n", Mat2); |
||||
|
// // printf("MAT3:\t%2.lf\n", top); |
||||
|
// T16Nx_Disable(T16N0); |
||||
|
// t16n0_1_init(); |
||||
|
// T16Nx_SetMAT2(T16N0, Mat2); |
||||
|
// T16Nx_SetMAT3(T16N0, top); |
||||
|
// T16Nx_SetTOP1(T16N0, top); |
||||
|
// } |
||||
|
// //###################################################### |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 有定时,无间歇 |
||||
|
// * |
||||
|
// * @param pwm_timing_duty |
||||
|
// */ |
||||
|
// void ozone_pwm_control_set_pwm_output_1(uint32_t pwm_timing_duty) {} |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 有定时,有间歇 |
||||
|
// * |
||||
|
// * @param pwm_duty |
||||
|
// * @param pwm_interval_duty |
||||
|
// */ |
||||
|
// void ozone_pwm_control_set_pwm_output_2(uint32_t pwm_timing_duty, |
||||
|
// uint32_t pwm_interval_duty) {} |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 停止pwm输出 |
||||
|
// * |
||||
|
// */ |
||||
|
// void ozone_pwm_control_stop_pwm(void) { stop_ozone_work(); } |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 定时时间到了以后关机 |
||||
|
// * |
||||
|
// */ |
||||
|
// void try_shutdown(void) { |
||||
|
// if (port_haspassedms(ozone_message.count_down_begin_sys_time) >= TIMINT_TIM) { |
||||
|
// ozone_message.count_down_begin_sys_time = get_sys_ticket(); |
||||
|
// if (ozone_message.timing_rank == 1) { //定时时间到 |
||||
|
// set_timing_light_mode(CLOSE_ALL_LED); |
||||
|
// printf("time over\r\n"); |
||||
|
// } else { //定时时间减30min,每减30min关闭一个led |
||||
|
// printf("time minus 30min\r\n"); |
||||
|
// set_timing_light_mode(timing_message.now_timing_mode - 1); |
||||
|
// } |
||||
|
// } |
||||
|
// } |
||||
|
|
||||
|
// /** |
||||
|
// * @brief 关闭pwm输出 |
||||
|
// * |
||||
|
// */ |
||||
|
// void stop_ozone_work(void) { |
||||
|
// set_ozone_work_mode(STOP_PWM_WORK); //关闭PWM输出 |
||||
|
// port_fan_set(false); //风扇结束工作 |
||||
|
// close_all_light(); //关闭rgb,关闭led0~led3 |
||||
|
// } |
||||
|
|
||||
|
|
@ -0,0 +1,42 @@ |
|||||
|
// #ifndef _OZONE_PWM_CONTROL_H_ |
||||
|
// #define _OZONE_PWM_CONTROL_H_ |
||||
|
|
||||
|
// #include "lib_config.h" |
||||
|
// #include "light.h" |
||||
|
// #include "ozone_work.h" |
||||
|
// #include "port.h" |
||||
|
// #include "system_ES8P5066.h" |
||||
|
|
||||
|
// typedef enum { |
||||
|
// HAS_BEEN_WORKING = 0, /*一直工作*/ |
||||
|
// TIMING_WORK = 1, /*定时工作*/ |
||||
|
// TIMING_INTERVAL_WORK = 2, /*在定时期间,间歇工作*/ |
||||
|
// STOP_PWM_WORK = 3, /*停止工作*/ |
||||
|
// } OZONE_WOEK_MODE_T; |
||||
|
|
||||
|
// typedef enum { |
||||
|
// LOW_END = 1, /*低档工作*/ |
||||
|
// MIDDLE_GRADE = 2, /*中档工作*/ |
||||
|
// SLAP_UP = 3, /*高档工作*/ |
||||
|
// } OZONE_WOEK_GEARS_T; |
||||
|
|
||||
|
// typedef struct { |
||||
|
// OZONE_WOEK_MODE_T now_ozone_woek_mode; /*现在的工作模式*/ |
||||
|
// OZONE_WOEK_GEARS_T will_be_set_work_gears; /*将要的工作档位*/ |
||||
|
// OZONE_WOEK_GEARS_T now_ozone_woek_gears; /*现在的工作档位*/ |
||||
|
// uint32_t ozone_pwm_duty; |
||||
|
// uint32_t ozone_pwm_frequency; |
||||
|
// uint32_t ozone_timing_duty; |
||||
|
// uint32_t ozone_interval_duty; |
||||
|
// } ozone_messages_t; |
||||
|
|
||||
|
// void set_ozone_work_mode(OZONE_WOEK_MODE_T mode); |
||||
|
// void set_ozone_work_gears(OZONE_WOEK_GEARS_T gears); |
||||
|
// void ozone_pwm_control_set_pwm_duty(uint32_t frequency, uint32_t duty) ; |
||||
|
// void ozone_pwm_control_set_pwm_output_1(uint32_t pwm_timing_duty); |
||||
|
// void ozone_pwm_control_set_pwm_output_2(uint32_t pwm_timing_duty, |
||||
|
// uint32_t pwm_interval_duty); |
||||
|
// void ozone_pwm_control_stop_pwm(void); |
||||
|
// void try_shutdown(void); |
||||
|
// void stop_ozone_work(void); |
||||
|
// #endif |
@ -0,0 +1,152 @@ |
|||||
|
#include "pwm.h" |
||||
|
#define TIMING_TICK 1800000 |
||||
|
#define INTERVAL_TICK 30000 |
||||
|
#define CLCK 48 |
||||
|
uint32_t s_hardware_period; //单位ms |
||||
|
uint32_t s_hardware_duty; //单位ms |
||||
|
|
||||
|
/** |
||||
|
* @brief s_large_duty是由s_large_period与INTERVAL_TIME决定 |
||||
|
* s_large_duty = INTERVAL_TIME/s_large_period |
||||
|
* 例如:s_large_period=1800000 |
||||
|
* s_large_duty = (30000/1800000)*100 |
||||
|
* |
||||
|
*/ |
||||
|
uint32_t s_large_period; //单位ms |
||||
|
uint32_t s_large_duty = 100; //单位ms |
||||
|
uint32_t begin_ticket; |
||||
|
uint8_t update_large_period_count; |
||||
|
bool enableFlag = false; |
||||
|
|
||||
|
void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty) { |
||||
|
ozone_pwm_control_set_pwm_duty(frequency, duty); |
||||
|
} |
||||
|
|
||||
|
void HOOK_pwm_stop(void) { |
||||
|
HOOK_pwm_module_set_pwm_duty(0, 0); //关闭PWM输出 |
||||
|
port_fan_set(false); //风扇结束工作 |
||||
|
} |
||||
|
|
||||
|
bool HOOK_pwm_is_enable(void) { return enableFlag; } |
||||
|
|
||||
|
void update_large_period(void) { |
||||
|
uint32_t large_period; |
||||
|
update_large_period_count++; |
||||
|
switch (update_large_period_count) { |
||||
|
case 1: |
||||
|
large_period = 1 * TIMING_TICK; |
||||
|
break; |
||||
|
case 2: |
||||
|
large_period = 2 * TIMING_TICK; |
||||
|
break; |
||||
|
case 3: |
||||
|
large_period = 3 * TIMING_TICK; |
||||
|
break; |
||||
|
case 4: |
||||
|
large_period = 4 * TIMING_TICK; |
||||
|
break; |
||||
|
case 5: |
||||
|
update_large_period_count = 0; |
||||
|
large_period = 0 * TIMING_TICK; |
||||
|
break; |
||||
|
} |
||||
|
pwm_module_set_pwm_output_1( |
||||
|
large_period, s_large_duty); //将更新后的周期以及现在的占空比传进去 |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 一直工作的时间定时的占空比为100, |
||||
|
* 间歇时间设置300000 |
||||
|
* @param freq |
||||
|
* @param duty |
||||
|
*/ |
||||
|
void pwm_module_set_pwm_output_1(uint32_t large_period, uint32_t large_duty) { |
||||
|
pwm_module_set_pwm_output_2(s_hardware_period, s_hardware_duty, large_period, |
||||
|
large_duty); |
||||
|
} |
||||
|
/** |
||||
|
* @brief 定时和PWM |
||||
|
* |
||||
|
* @param hardware_period pwm频率 |
||||
|
* @param hardware_duty pwm占空比 |
||||
|
* @param large_period 定时周期 |
||||
|
* @param large_duty 定时占空比 |
||||
|
*/ |
||||
|
void pwm_module_set_pwm_output_2(uint32_t hardware_period, |
||||
|
uint32_t hardware_duty, uint32_t large_period, |
||||
|
uint32_t large_duty) { |
||||
|
s_hardware_period = hardware_period; |
||||
|
s_hardware_duty = hardware_duty; |
||||
|
s_large_period = large_period; |
||||
|
s_large_duty = large_duty; |
||||
|
|
||||
|
begin_ticket = get_sys_ticket(); |
||||
|
|
||||
|
enableFlag = true; |
||||
|
HOOK_pwm_module_set_pwm_duty(s_hardware_period, s_hardware_duty); |
||||
|
} |
||||
|
|
||||
|
void pwm_module_stop_pwm(void) { enableFlag = false; } |
||||
|
|
||||
|
void pwm_module_loop(void) { |
||||
|
if (!enableFlag) { |
||||
|
HOOK_pwm_stop(); |
||||
|
return; |
||||
|
} |
||||
|
if (port_haspassedms(begin_ticket) % s_large_period <= |
||||
|
s_large_period * s_large_duty / 100) { |
||||
|
if (!HOOK_pwm_is_enable()) { |
||||
|
HOOK_pwm_module_set_pwm_duty(s_hardware_period, s_hardware_duty); |
||||
|
} |
||||
|
} else { |
||||
|
enableFlag = false; |
||||
|
HOOK_pwm_stop(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//###################################################### |
||||
|
double calculate_top(double target_frequency) { |
||||
|
int clck = 0; |
||||
|
int target_frequency_hz = 0; |
||||
|
int top = 0; |
||||
|
clck = CLCK * 1000 * 1000; |
||||
|
target_frequency_hz = (int)target_frequency * 1000; |
||||
|
// printf("target_frequency_hz%d\n", target_frequency_hz); |
||||
|
top = clck / target_frequency_hz; |
||||
|
// printf("top%d\t\n", top); |
||||
|
return top; |
||||
|
} |
||||
|
double calculate_MAT2(double top, double duty) { |
||||
|
double percentage_duty = 0; |
||||
|
double Mat2 = 0; |
||||
|
percentage_duty = duty / 100; |
||||
|
Mat2 = top * percentage_duty; |
||||
|
return Mat2; |
||||
|
} |
||||
|
|
||||
|
void ozone_pwm_control_set_pwm_duty(uint32_t frequency, uint32_t duty) { |
||||
|
double top = 0; |
||||
|
double Mat2 = 0; |
||||
|
if (frequency > CLCK * 1000) { |
||||
|
printf("out of range\n"); |
||||
|
return; |
||||
|
} |
||||
|
top = calculate_top(frequency); //根据需要的频率计算出TOP(自动重装载值) |
||||
|
if (top == 0) { |
||||
|
return; |
||||
|
} |
||||
|
Mat2 = calculate_MAT2(top, duty); |
||||
|
printf("top:\t%2.lf\n", top); |
||||
|
printf("MAT2:\t%2.lf\n", Mat2); |
||||
|
printf("MAT3:\t%2.lf\n", top); |
||||
|
T16Nx_Disable(T16N0); |
||||
|
t16n0_1_init(); |
||||
|
T16Nx_SetMAT2(T16N0, Mat2); |
||||
|
if (duty == 100) { |
||||
|
T16Nx_SetMAT3(T16N0, top - 1); |
||||
|
} else { |
||||
|
T16Nx_SetMAT3(T16N0, top); |
||||
|
} |
||||
|
T16Nx_SetTOP1(T16N0, top); |
||||
|
} |
||||
|
//###################################################### |
@ -0,0 +1,35 @@ |
|||||
|
#ifndef _pwm_module_H_ |
||||
|
#define _pwm_module_H_ |
||||
|
|
||||
|
#include "lib_config.h" |
||||
|
#include "light.h" |
||||
|
#include "ozone_work.h" |
||||
|
#include "port.h" |
||||
|
#include "system_ES8P5066.h" |
||||
|
|
||||
|
void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty); |
||||
|
void HOOK_pwm_stop(void); |
||||
|
bool HOOK_pwm_is_enable(void); |
||||
|
void pwm_module_set_pwm_output_1(uint32_t large_period, uint32_t large_duty); |
||||
|
void pwm_module_set_pwm_output_2(uint32_t hardware_period, |
||||
|
uint32_t hardware_duty, uint32_t large_period, |
||||
|
uint32_t large_duty); |
||||
|
|
||||
|
void ozone_pwm_control_set_pwm_duty(uint32_t frequency, uint32_t duty); |
||||
|
void pwm_module_stop_pwm(void); |
||||
|
void update_large_period(void); |
||||
|
void pwm_module_loop(void); |
||||
|
#endif |
||||
|
|
||||
|
// 2Сʱ |
||||
|
// 50 |
||||
|
|
||||
|
// 80 |
||||
|
// 3Сʱ |
||||
|
|
||||
|
// 1Сʱ |
||||
|
// if(haspassed(beigin)/Сʱ%2<=1){ |
||||
|
// ¹Ø |
||||
|
// }else{ |
||||
|
|
||||
|
// } |
1228
project_ozone/Listings/project_o.map
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
193
project_ozone/project_o.uvgui.admin
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue