pwm_light.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include "pwm.h"
  2. #include "gpio.h"
  3. #include "gpio.h"
  4. #include "log.h"
  5. #include "pwm_light.h"
  6. const uint8_t max_pwm_light = 5;
  7. uint8_t pwm_light_len = 0;
  8. // 申请5个通道的内存
  9. pwm_t pwm_light_chann_list[max_pwm_light] = {
  10. {PWM_CH0, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
  11. {PWM_CH1, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
  12. {PWM_CH2, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
  13. {PWM_CH3, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
  14. {PWM_CH5, GPIO_DUMMY, 0, 100, 5, PWM_CLK_DIV_16},
  15. };
  16. // 刷新指定 pwm 引脚
  17. int pwm_light_reflash(int i)
  18. {
  19. // 获取 pwm
  20. pwm_t *pwm = &pwm_light_chann_list[i];
  21. // 判断 pwm 通道是否已经初始化;
  22. if(pwm->pin == GPIO_DUMMY){
  23. return -1;
  24. }
  25. LOG("pwm ch%d is reflash \n", i);
  26. hal_pwm_close_channel(pwm->pwm_ch);
  27. hal_pwm_destroy(pwm->pwm_ch);
  28. hal_pwm_stop();
  29. hal_gpio_pin_init(pwm->pin, IE);
  30. hal_gpio_pull_set(pwm->pin, WEAK_PULL_UP);
  31. hal_pwm_init(pwm->pwm_ch, pwm->div, PWM_CNT_UP, PWM_POLARITY_FALLING);
  32. hal_pwm_set_count_val(pwm->pwm_ch, pwm->val, pwm->total);
  33. hal_pwm_open_channel(pwm->pwm_ch, pwm->pin);
  34. hal_pwm_start();
  35. return 0;
  36. }
  37. void pwm_reflash_all(){
  38. // 遍历 pwm_light_chann_list
  39. for (int i = 0; i < max_pwm_light; i++)
  40. {
  41. pwm_light_reflash(i)
  42. }
  43. }
  44. int pwm_change_val(int i){
  45. // 获取 pwm
  46. pwm_t *pwm = &pwm_light_chann_list[i];
  47. // 判断 pwm 通道是否已经初始化;
  48. if(pwm->pin == GPIO_DUMMY){
  49. return -1;
  50. }
  51. // pwm值保护
  52. if(pwm->val > pwm->total){
  53. pwm->val = pwm->total;
  54. }
  55. if(pwm->val < 0){
  56. pwm->val = 0;
  57. }
  58. LOG("pwm ch%d is change val \n", i);
  59. hal_pwm_set_count_val(pwm->pwm_ch, pwm->val, pwm->total);
  60. return 0;
  61. }
  62. // 获取 pwm
  63. pwm_t *pwm_light_get(uint8_t ch)
  64. {
  65. // 判断 ch 是否合法
  66. if (ch < 0 || ch > max_pwm_light)
  67. {
  68. ch = 0;
  69. }
  70. // 获取 pwm
  71. pwm_t *pwm = &pwm_light_chann_list[ch];
  72. return pwm;
  73. }
  74. // 初始化 pwm
  75. int pwm_light_init(uint8_t ch, GPIO_Pin_e pin, int val, uint8_t total, uint8_t step, PWM_CLK_DIV_e div)
  76. {
  77. pwm_t *pwm;
  78. // 判断 ch 是否合法
  79. CHECK_PWM_CH
  80. // 判断 pin 是否合法
  81. CHECK_PWM_PIN
  82. // 获取 pwm
  83. pwm = &pwm_light_chann_list[ch];
  84. if(val > total){
  85. val = total;
  86. }
  87. // 设置 pwm
  88. pwm->pin = pin;
  89. pwm->val = val;
  90. pwm->total = total;
  91. pwm->step = step;
  92. pwm->div = div;
  93. // 刷新 pwm 引脚
  94. pwm_reflash_all();
  95. return 0;
  96. }
  97. int pwm_light_set_total(uint8_t ch, int total )
  98. {
  99. pwm_t *pwm;
  100. // 判断 ch 是否合法
  101. CHECK_PWM_CH
  102. // 获取 pwm
  103. pwm = &pwm_light_chann_list[ch];
  104. pwm->total = total;
  105. pwm_light_reflash(ch);
  106. }
  107. int pwm_light_set_pin(uint8_t ch, GPIO_Pin_e pin)
  108. {
  109. pwm_t *pwm;
  110. // 判断 ch 是否合法
  111. CHECK_PWM_CH
  112. // 判断 pin 是否合法
  113. CHECK_PWM_PIN
  114. // 获取 pwm
  115. pwm = &pwm_light_chann_list[ch];
  116. // 设置 pwm
  117. pwm->pin = pin;
  118. // 刷新 pwm 引脚
  119. pwm_light_reflash(ch);
  120. return 0;
  121. }
  122. int pwm_light_set_val(uint8_t ch , uint8_t val)
  123. {
  124. pwm_t *pwm;
  125. // 判断 ch 是否合法
  126. CHECK_PWM_CH
  127. // 获取 pwm
  128. pwm = &pwm_light_chann_list[ch];
  129. if(val > pwm->total){
  130. val = pwm->total;
  131. }
  132. LOG("light val %d --->> %d \n", pwm->val, val);
  133. // 设置 pwm
  134. pwm->val = val;
  135. // 设置 pwm 引脚值
  136. pwm_change_val(ch);
  137. return 0;
  138. }
  139. int pwm_light_set_div(uint8_t ch, PWM_CLK_DIV_e div)
  140. {
  141. pwm_t *pwm;
  142. // 判断 ch 是否合法
  143. CHECK_PWM_CH
  144. // 判断 div 是否合法
  145. if (div < PWM_CLK_DIV_2 || div > PWM_CLK_DIV_128)
  146. {
  147. return -2;
  148. }
  149. // 获取 pwm
  150. pwm = &pwm_light_chann_list[ch];
  151. // 设置 pwm
  152. pwm->div = div;
  153. // 刷新 pwm 引脚
  154. pwm_light_reflash(ch);
  155. return 0;
  156. }