PWM.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /*
  2. * PWM.c
  3. *
  4. * Created on: 14 janv. 2019
  5. * Author: e_rcluze
  6. */
  7. #include "PWM.h"
  8. #include "tim.h"
  9. #include "gpio.h"
  10. void PWMSetDutyCycle(uint8_t sortie, uint8_t pourcentage) {
  11. TIM_OC_InitTypeDef sConfigOC;
  12. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  13. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  14. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  15. sConfigOC.Pulse = PourcentageToValue(pourcentage);
  16. HAL_Delay(1);
  17. switch (sortie) {
  18. case S1:
  19. HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3);
  20. break;
  21. case S2:
  22. HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4);
  23. break;
  24. case S3:
  25. HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
  26. break;
  27. case S4:
  28. HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);
  29. break;
  30. case S5:
  31. HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
  32. break;
  33. case S6:
  34. HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);
  35. break;
  36. case S7:
  37. HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
  38. break;
  39. case S8:
  40. HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2);
  41. break;
  42. case S9:
  43. HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3);
  44. break;
  45. case S10:
  46. HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4);
  47. break;
  48. }
  49. }
  50. void PWMStart(uint8_t sortie) {
  51. switch (sortie) {
  52. case S1:
  53. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
  54. break;
  55. case S2:
  56. HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
  57. break;
  58. case S3:
  59. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  60. break;
  61. case S4:
  62. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
  63. break;
  64. case S5:
  65. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
  66. break;
  67. case S6:
  68. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
  69. break;
  70. case S7:
  71. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
  72. break;
  73. case S8:
  74. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
  75. break;
  76. case S9:
  77. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
  78. break;
  79. case S10:
  80. HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
  81. break;
  82. }
  83. }
  84. void PWMStop(uint8_t sortie) {
  85. switch (sortie) {
  86. case S1:
  87. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_3);
  88. break;
  89. case S2:
  90. HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
  91. break;
  92. case S3:
  93. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
  94. break;
  95. case S4:
  96. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_2);
  97. break;
  98. case S5:
  99. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3);
  100. break;
  101. case S6:
  102. HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_4);
  103. break;
  104. case S7:
  105. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
  106. break;
  107. case S8:
  108. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_2);
  109. break;
  110. case S9:
  111. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_3);
  112. break;
  113. case S10:
  114. HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_4);
  115. break;
  116. }
  117. }
  118. uint16_t PourcentageToValue(uint8_t val) {
  119. float t = (val * PWM_MAX) / 100;
  120. return (uint16_t) t;
  121. }
  122. void GerePWM(uint16_t listeSortie, uint8_t pourcentage) {
  123. if (listeSortie & MASKS1) {
  124. if (pourcentage != 0) {
  125. PWMSetDutyCycle(S1, pourcentage);
  126. PWMStart(S1);
  127. } else
  128. PWMStop(S1);
  129. }
  130. if (listeSortie & MASKS2) {
  131. if (pourcentage != 0) {
  132. PWMSetDutyCycle(S2, pourcentage);
  133. PWMStart(S2);
  134. } else
  135. PWMStop(S2);
  136. }
  137. if (listeSortie & MASKS3) {
  138. if (pourcentage != 0) {
  139. PWMSetDutyCycle(S3, pourcentage);
  140. PWMStart(S3);
  141. } else
  142. PWMStop(S3);
  143. }
  144. if (listeSortie & MASKS4) {
  145. if (pourcentage != 0) {
  146. PWMSetDutyCycle(S4, pourcentage);
  147. PWMStart(S4);
  148. } else
  149. PWMStop(S4);
  150. }
  151. if (listeSortie & MASKS5) {
  152. if (pourcentage != 0) {
  153. PWMSetDutyCycle(S5, pourcentage);
  154. PWMStart(S5);
  155. } else
  156. PWMStop(S5);
  157. }
  158. if (listeSortie & MASKS6) {
  159. if (pourcentage != 0) {
  160. PWMSetDutyCycle(S6, pourcentage);
  161. PWMStart(S6);
  162. } else
  163. PWMStop(S6);
  164. }
  165. if (listeSortie & MASKS7) {
  166. if (pourcentage != 0) {
  167. PWMSetDutyCycle(S7, pourcentage);
  168. PWMStart(S7);
  169. } else
  170. PWMStop(S7);
  171. }
  172. if (listeSortie & MASKS8) {
  173. if (pourcentage != 0) {
  174. PWMSetDutyCycle(S8, pourcentage);
  175. PWMStart(S8);
  176. } else
  177. PWMStop(S8);
  178. }
  179. if (listeSortie & MASKS9) {
  180. if (pourcentage != 0) {
  181. PWMSetDutyCycle(S9, pourcentage);
  182. PWMStart(S9);
  183. } else
  184. PWMStop(S9);
  185. }
  186. if (listeSortie & MASKS10) {
  187. if (pourcentage != 0) {
  188. PWMSetDutyCycle(S10, pourcentage);
  189. PWMStart(S10);
  190. } else {
  191. PWMStop(S10);
  192. }
  193. }
  194. }
  195. uint8_t PWMPourcentage(Sortie *s, uint16_t heure) {
  196. if (s->Status == ENALLUME) {
  197. int r = (float)s->PuissanceMax / ((float)s->Pente / (float)(heure - s->Demmarage));
  198. return r;
  199. } else {
  200. return s->PuissanceMax / (s->Pente / (s->Extinxtion - heure));
  201. }
  202. }