PWM.c 4.5 KB

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