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.

167 lines
4.5 KiB

4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
  1. #include "pwm.h"
  2. #define TIMING_TICK 1800000
  3. #define INTERVAL_TICK 30000
  4. #define CLCK 48
  5. pwm_message_t pwm_message={.s_hardware_frequency=1};
  6. // uint32_t s_hardware_frequency; //��λms���������ڵ�PWMƵ��
  7. // uint32_t s_hardware_duty; //��λms���������ڵ�PWMռ�ձ�
  8. // uint32_t s_large_period; //��λms���������ڵĶ�ʱ����
  9. // uint32_t s_large_duty = 100; //��λms���������ڵĶ�ʱռ�ձ�
  10. /**
  11. * @brief s_large_dutys_large_periodINTERVAL_TIME
  12. * s_large_duty = INTERVAL_TIME/s_large_period
  13. * s_large_period=1800000
  14. * s_large_duty = (30000/1800000)*100
  15. *
  16. */
  17. uint32_t begin_ticket;
  18. uint8_t update_large_period_count;
  19. bool enableFlag = false;
  20. void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty) {
  21. ozone_pwm_control_set_pwm_duty(frequency, duty);
  22. }
  23. void HOOK_pwm_stop(void) {
  24. HOOK_pwm_module_set_pwm_duty(0, 0); //�ر�PWM����
  25. port_fan_set(false); //���Ƚ�������
  26. }
  27. bool HOOK_pwm_is_enable(void) { return enableFlag; }
  28. /**
  29. * @brief ºʱ
  30. *
  31. */
  32. void update_large_period(void) {
  33. uint32_t large_period;
  34. update_large_period_count++;
  35. switch (update_large_period_count) {
  36. case 1:
  37. large_period = 1 * TIMING_TICK;
  38. break;
  39. case 2:
  40. large_period = 2 * TIMING_TICK;
  41. break;
  42. case 3:
  43. large_period = 3 * TIMING_TICK;
  44. break;
  45. case 4:
  46. large_period = 4 * TIMING_TICK;
  47. break;
  48. case 5:
  49. update_large_period_count = 0;
  50. large_period = 0 * TIMING_TICK;
  51. break;
  52. }
  53. pwm_module_set_pwm_output_1(
  54. large_period, pwm_message.s_large_duty); //�����º��������Լ����ڵ�ռ�ձȣ���������
  55. }
  56. /**
  57. * @brief һֱʱʱռձΪ100
  58. * Ъʱ300000
  59. * @param freq
  60. * @param duty
  61. */
  62. void pwm_module_set_pwm_output_1(uint32_t large_period, uint32_t large_duty) {
  63. pwm_module_set_pwm_output_2(pwm_message.s_hardware_frequency, pwm_message.s_hardware_duty, large_period,
  64. large_duty);
  65. }
  66. /**
  67. * @brief ʱPWM
  68. *
  69. * @param hardware_period pwmƵ
  70. * @param hardware_duty pwmռձ
  71. * @param large_period ʱ
  72. * @param large_duty ʱռձ
  73. */
  74. void pwm_module_set_pwm_output_2(uint32_t hardware_period,
  75. uint32_t hardware_duty, uint32_t large_period,
  76. uint32_t large_duty) {
  77. pwm_message.s_hardware_frequency = hardware_period;
  78. pwm_message.s_hardware_duty = hardware_duty;
  79. pwm_message.s_large_period = large_period;
  80. pwm_message.s_large_duty = large_duty;
  81. begin_ticket = get_sys_ticket();
  82. enableFlag = true;
  83. HOOK_pwm_module_set_pwm_duty(pwm_message.s_hardware_frequency, pwm_message.s_hardware_duty);
  84. }
  85. void pwm_module_stop_pwm(void) { enableFlag = false; }
  86. void pwm_module_loop(void) {
  87. if (!enableFlag) {
  88. HOOK_pwm_stop();
  89. return;
  90. }
  91. if (port_haspassedms(begin_ticket) % pwm_message.s_large_period <=
  92. pwm_message.s_large_period * pwm_message.s_large_duty / 100) {
  93. if (!HOOK_pwm_is_enable()) {
  94. HOOK_pwm_module_set_pwm_duty(pwm_message.s_hardware_frequency, pwm_message.s_hardware_duty);
  95. }
  96. } else {
  97. enableFlag = false;
  98. HOOK_pwm_stop();
  99. }
  100. }
  101. //######################################################
  102. double calculate_top(double target_frequency) {
  103. int clck = 0;
  104. int target_frequency_hz = 0;
  105. int top = 0;
  106. clck = CLCK * 1000 * 1000;
  107. target_frequency_hz = (int)target_frequency * 1000;
  108. // printf("target_frequency_hz%d\n", target_frequency_hz);
  109. top = clck / target_frequency_hz;
  110. // printf("top%d\t\n", top);
  111. return top;
  112. }
  113. double calculate_MAT2(double top, double duty) {
  114. double percentage_duty = 0;
  115. double Mat2 = 0;
  116. percentage_duty = duty / 100;
  117. Mat2 = top * percentage_duty;
  118. return Mat2;
  119. }
  120. void ozone_pwm_control_set_pwm_duty(uint32_t frequency, uint32_t duty) {
  121. double top = 0;
  122. double Mat2 = 0;
  123. if (frequency > CLCK * 1000) {
  124. printf("out of range\n");
  125. return;
  126. }
  127. top = calculate_top(frequency); //������Ҫ��Ƶ�ʼ�����TOP���Զ���װ��ֵ��
  128. if (top == 0) {
  129. return;
  130. }
  131. Mat2 = calculate_MAT2(top, duty);
  132. printf("top:\t%2.lf\n", top);
  133. printf("MAT2:\t%2.lf\n", Mat2);
  134. printf("MAT3:\t%2.lf\n", top);
  135. T16Nx_Disable(T16N0);
  136. t16n0_1_init();
  137. T16Nx_SetMAT2(T16N0, Mat2);
  138. if (duty == 100) {
  139. T16Nx_SetMAT3(T16N0, top - 1);
  140. } else {
  141. T16Nx_SetMAT3(T16N0, top);
  142. }
  143. T16Nx_SetTOP1(T16N0, top);
  144. }
  145. //######################################################