Browse Source

update

master
Yuenold 3 years ago
parent
commit
6825505074
  1. 4
      APP/board.h
  2. 8
      APP/light.c
  3. 16
      APP/main.c
  4. 7
      APP/ozone_pwm_control.c
  5. 71
      APP/pwm.c
  6. 2
      Library/Source/lib_printf.c
  7. 2
      README.md
  8. BIN
      doc/markdown.assets/pwm占空比变换.assets/image-20220309112735967.png
  9. BIN
      doc/markdown.assets/pwm占空比变换.assets/image-20220309112752292.png
  10. BIN
      doc/markdown.assets/pwm占空比变换.assets/image-20220309112942077.png
  11. BIN
      doc/markdown.assets/pwm占空比变换.assets/image-20220309113314601.png
  12. 19
      doc/pwm占空比变换.md
  13. 1062
      project_ozone/Listings/project_o.map
  14. 108
      project_ozone/project_o.uvgui.admin

4
APP/board.h

@ -15,8 +15,8 @@
#define HIGH_LEVEL_PWM_FREQ 25000
#define LOW_LEVEL_PWM_FREQ 10000
// #define HIGH_LEVEL_PWM_FREQ 30000
// #define LOW_LEVEL_PWM_FREQ 10000
// #define HIGH_LEVEL_PWM_FREQ 99000
// #define LOW_LEVEL_PWM_FREQ 50000
#define MIN_PWM_FREQ 5000
#define PWM_CHANGE_INTERVAL_TIME_MS 1000

8
APP/light.c

@ -131,23 +131,23 @@ static void prv_time_light_control_schedule() {
***********************************************************************************************************************/
void light_module_set_rgb_mode(rgb_light_mode_t mode) {
printf("light_module_set_rgb_mode %d\n", mode);
// printf("light_module_set_rgb_mode %d\n", mode);
s_rgb_light_mode_config = mode;
prv_light_module_set_rgb_mode(mode);
}
void light_module_set_rgb_in_interval_working_mode(bool state) {
printf("light_module_set_rgb_in_interval_working_mode %d\n", state);
// printf("light_module_set_rgb_in_interval_working_mode %d\n", state);
s_interval_working_mode = state;
}
void light_module_set_autoshutdown_indicator_light(bool open) { s_autoshutdown_light_state = open; }
void light_module_set_error_light_mode(bool open, uint8_t error_mode) {
printf("light_module_set_error_light_mode %d\n", error_mode);
// printf("light_module_set_error_light_mode %d\n", error_mode);
s_errorlight_display_state = open;
s_errornum = error_mode;
}
void light_module_close_all_light(void) {
printf("light_module_close_all_light\n");
// printf("light_module_close_all_light\n");
light_module_set_rgb_mode(krgb_close);
light_module_set_autoshutdown_indicator_light(false);
light_module_set_rgb_in_interval_working_mode(false);

16
APP/main.c

@ -66,7 +66,7 @@ int get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
* @param gears
*/
void update_ozone_work_level(bool interval_work, work_level_t level) {
printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
// printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
rgb_light_mode_t lightmode;
int duty = 0;
uint32_t pwm_freqhz = 0;
@ -77,7 +77,7 @@ void update_ozone_work_level(bool interval_work, work_level_t level) {
lightmode = krgb_close;
} else if (level == kwork_level_low) {
pwm_freqhz = LOW_LEVEL_PWM_FREQ;
// duty = 5;
// duty = 50;
duty = get_duty_by_freq_and_valid_time(pwm_freqhz, PWM_PULSE_WIDTH_US);
lightmode = krgb_color_blue;
} else if (level == kwork_level_hight) {
@ -192,7 +192,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) {
if (g_error_num != 0) { //
if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
key->hasProcessed = true;
printf("process key[2] event\r\n");
// printf("process key[2] event\r\n");
/**
* @brief
*/
@ -206,7 +206,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) {
*********************************************************************************************************************/
if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //3s
{
printf("process key[0] event\r\n");
// printf("process key[0] event\r\n");
if (g_setting_interval_work_flag == true) { // g_setting_interval_work_flag=true现在是间歇工作
g_setting_interval_work_flag = false; //
@ -230,7 +230,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) {
/**
* @brief
*/
printf("process key[1] event\r\n");
// printf("process key[1] event\r\n");
if (g_setting_level == kwork_level_hight) {
g_setting_level = kwork_level_low;
update_ozone_work_level(g_setting_interval_work_flag, kwork_level_low);
@ -243,7 +243,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) {
* ===================================================================================================== *
*********************************************************************************************************************/
else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
printf("process key[2] event\r\n");
// printf("process key[2] event\r\n");
/**
* @brief
*/
@ -254,7 +254,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) {
g_setting_interval_work_flag = !g_setting_interval_work_flag;
update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
} else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
printf("process key[2] event\r\n");
// printf("process key[2] event\r\n");
/**
* @brief
*/
@ -301,7 +301,7 @@ int main(void) {
starting_up();
//
printf("Initialization completed\r\n");
// printf("Initialization completed\r\n");
while (true) {
/*******************************************************************************************************************

7
APP/ozone_pwm_control.c

@ -66,12 +66,12 @@ void ozone_pwm_control_module_loop(void) {
}
if (port_haspassedms(begin_ticket) % s_large_period <= s_large_period * s_large_duty / 100) {
if (!prv_pwm_is_enable()) {
printf("set work\r\n");
// printf("set work\r\n");
prv_pwm_module_set_pwm_duty(hardware_frequency, hardware_duty);
}
} else {
if (prv_pwm_is_enable()) {
printf("set rest\r\n");
// printf("set rest\r\n");
hardware_frequency = s_hardware_frequency; //
hardware_duty = s_hardware_duty; //
prv_pwm_stop();
@ -79,4 +79,5 @@ void ozone_pwm_control_module_loop(void) {
}
}
}

71
APP/pwm.c

@ -69,15 +69,15 @@ void t16_pa4_init(void) {
return;
}
void set_pwm_t16_pa4(int freqhz, float duty) {
void set_pwm_t16_pa4(uint32_t freqhz, double duty) {
double top_double = calculate_top(freqhz); //TOP
uint16_t top = (uint16_t)top_double;
uint16_t Mat2 = (uint16_t)top_double * (duty / 100.0);
uint16_t Mat3 = top;
if (Mat2 >= top) Mat2 = top - 1;
printf("Mat2:%d\r\n", Mat2);
printf("Mat3:%d\r\n", Mat3);
printf("top:%d\r\n", top);
// printf("Mat2:%d\r\n", Mat2);
// printf("Mat3:%d\r\n", Mat3);
// printf("top:%d\r\n", top);
T16Nx_SetCNT1(T16N0, 0); //
T16Nx_SetMAT2(T16N0, Mat2); //
T16Nx_SetMAT3(T16N0, Mat3); //
@ -130,61 +130,66 @@ uint32_t s_now_duty;
* @param us
*/
static int get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
uint16_t period = 1000000 / freq;
int duty = us * 100 / period;
return duty;
}
// static uint32_t get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
// uint32_t period = 1000000 / freq;
// uint32_t duty = us * 100 / period;
// return duty;
// }
// static uint32_t get_pwm_pulse_width_us_by_duty(uint32_t freq, uint32_t duty) {
// uint32_t period = 1000000 / freq;
// uint32_t pwm_pulse_width_us = period * duty / 100;
// return pwm_pulse_width_us;
// }
static uint32_t get_pwm_pulse_width_us_by_duty(uint32_t freq, uint32_t duty) {
uint16_t period = 1000000 / freq;
uint16_t pwm_pulse_width_us = period * duty / 100;
return pwm_pulse_width_us;
double get_duty(double now_duty, double target_duty, double increment_count) {
if (now_duty > target_duty) {
now_duty -= (now_duty - target_duty) / increment_count; //(now_duty-target_duty)/increment_count每次的增量
} else if (now_duty < target_duty) {
now_duty += (target_duty - now_duty) / increment_count;
}
return now_duty;
}
void set_pwm_modbul_freq_duty(uint32_t frequencyhz, uint32_t duty) {
static uint32_t now_frequencyhz;
static uint32_t now_duty;
static uint16_t pwm_pulse_width_us;
static double now_duty;
static uint32_t pwm_pulse_width_us;
uint32_t increment_conut; //PWM_CHANGE_STEP_FREQ
target_frequencyhz = frequencyhz;
target_duty = duty;
/**
* @brief pwm频率的增大
*
*/
// while (1) {
/**
* @brief 1khz
*
*/
// Delayms(1000);
if (now_frequencyhz == target_frequencyhz) {
if (now_duty == target_duty && now_frequencyhz == target_frequencyhz) {
return;
}
if (now_duty != target_duty) { //pwm输出时pwm频率为1khzPWM_PULSE_WIDTH_US00
if (now_duty != target_duty) {
now_duty = target_duty;
set_pwm_t16_pa4(now_frequencyhz, now_duty);
}
if ((uint32_t)now_duty == target_duty) {
return;
}
}
pwm_pulse_width_us = get_pwm_pulse_width_us_by_duty(target_frequencyhz, target_duty);
// pwm_pulse_width_us = get_pwm_pulse_width_us_by_duty(target_frequencyhz, target_duty);
if (now_frequencyhz < target_frequencyhz) {
now_frequencyhz = now_frequencyhz + PWM_CHANGE_STEP_FREQ;
if (now_frequencyhz >= target_frequencyhz) {
now_frequencyhz = target_frequencyhz;
}
now_duty = get_duty_by_freq_and_valid_time(now_frequencyhz, pwm_pulse_width_us);
increment_conut = (target_frequencyhz - now_frequencyhz) / PWM_CHANGE_STEP_FREQ;
// now_duty = get_duty_by_freq_and_valid_time(now_frequencyhz, pwm_pulse_width_us);
now_duty = get_duty(now_duty, target_duty, increment_conut);
set_pwm_t16_pa4(now_frequencyhz, now_duty);
printf("%d,%lf\r\n", now_frequencyhz, now_duty);
} else if (now_frequencyhz > target_frequencyhz) {
now_frequencyhz = now_frequencyhz - PWM_CHANGE_STEP_FREQ;
if (now_frequencyhz <= target_frequencyhz) {
now_frequencyhz = target_frequencyhz;
}
now_duty = get_duty_by_freq_and_valid_time(now_frequencyhz, pwm_pulse_width_us);
// now_duty = get_duty_by_freq_and_valid_time(now_frequencyhz, pwm_pulse_width_us);
increment_conut = (now_frequencyhz - target_frequencyhz) / PWM_CHANGE_STEP_FREQ;
now_duty = get_duty(now_duty, target_duty, increment_conut);
set_pwm_t16_pa4(now_frequencyhz, now_duty);
printf("%d,%lf\r\n", now_frequencyhz, now_duty);
}
}
// uint32_t get_next_value_on_step(uint32_t now, uint32_t target, uint32_t step) {
// }

2
Library/Source/lib_printf.c

@ -21,7 +21,7 @@
/*使用printf()函数需要调用微库:Use MicroLIB*/
int fputc(int ch, FILE *f)
{
// return ch;
// return ch;
uint32_t count = 0;
FlagStatus status = RESET;

2
README.md

@ -47,7 +47,7 @@
[pwm占空比变换](./doc/pwm占空比变换)
```
概述:随着pwm频率的增大,占空比不断增加
概述:随着pwm频率的变换,占空比均匀变换
```
## 项目需求

BIN
doc/markdown.assets/pwm占空比变换.assets/image-20220309112735967.png

After

Width: 778  |  Height: 744  |  Size: 93 KiB

BIN
doc/markdown.assets/pwm占空比变换.assets/image-20220309112752292.png

After

Width: 911  |  Height: 158  |  Size: 18 KiB

BIN
doc/markdown.assets/pwm占空比变换.assets/image-20220309112942077.png

After

Width: 877  |  Height: 574  |  Size: 70 KiB

BIN
doc/markdown.assets/pwm占空比变换.assets/image-20220309113314601.png

After

Width: 823  |  Height: 583  |  Size: 74 KiB

19
doc/pwm占空比变换.md

@ -1,14 +1,23 @@
# pwm占空比变换
# pwm占空比随着频率的变化,均匀增加或减少
![image-20220308192847502](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220308192847502.png)
pwm.c代码部分
![image-20220309112752292](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220309112752292.png)
![image-20220309112735967](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220309112735967.png)
main.c代码部分
![image-20220309112942077](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220309112942077.png)
```
当脉冲宽度一定时,随着pwm频率的增加,占空比不断增加
以上代码,通过档位按键测试,由频率99Khz占空比10% 变换到频率50Khz占空比50%
```
![image-20220308193048894](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220308193048894.png)
![image-20220309113314601](markdown.assets/pwm%E5%8D%A0%E7%A9%BA%E6%AF%94%E5%8F%98%E6%8D%A2.assets/image-20220309113314601.png)
```
以上代码,通过档位按键测试,由频率30Khz占空比10% 变换到频率10Khz占空比5%
以上代码,通过档位按键测试,由频率10Khz占空比8% 变换到频率25Khz占空比20%
PS:占空比是由频率和脉冲宽度求出的
```

1062
project_ozone/Listings/project_o.map
File diff suppressed because it is too large
View File

108
project_ozone/project_o.uvgui.admin
File diff suppressed because it is too large
View File

Loading…
Cancel
Save