light_driver.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "light_driver.h"
  2. MC_LightDriver_IO_Struct_t HeadLightIO_Groups[3] =
  3. {
  4. {GPIOB, GPIO_PIN_4}, //前灯6V
  5. {GPIOB, GPIO_PIN_6}, //前灯12V
  6. {GPIOB, GPIO_PIN_7}, //前灯随电池电压
  7. };
  8. MC_LightDriver_IO_Struct_t TailLightIO_Groups[3] =
  9. {
  10. {GPIOB, GPIO_PIN_2}, //尾灯6V
  11. {GPIOB, GPIO_PIN_0}, //尾灯12V
  12. {GPIOA, GPIO_PIN_6} //尾灯随电池电压
  13. };
  14. static void LightDriver_IO_Control(MC_LightDriver_IO_Struct_t* IO_Groups, uint8_t Len, uint8_t ID, MC_LightSwitch_Struct_t SwitchCode)
  15. {
  16. uint8_t i;
  17. if(SwitchCode == MC_LightSwitch_ON)//开灯时,仅打开配置的IO
  18. {
  19. for(i=0; i<Len; i++)
  20. {
  21. HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, (i == ID) ? GPIO_PIN_SET: GPIO_PIN_RESET);
  22. }
  23. }
  24. else//关灯时,关闭所有控制IO
  25. {
  26. for(i=0; i<Len; i++)
  27. {
  28. HAL_GPIO_WritePin(IO_Groups[i].Port, IO_Groups[i].Pin, GPIO_PIN_RESET);
  29. }
  30. }
  31. }
  32. void LightDriver_Init(void)
  33. {
  34. GPIO_InitTypeDef GPIO_InitStruct;
  35. uint8_t i;
  36. /* GPIO Ports Clock Enable */
  37. __HAL_RCC_GPIOA_CLK_ENABLE();
  38. __HAL_RCC_GPIOB_CLK_ENABLE();
  39. /*Configure GPIO pin Output Level */
  40. for(i=0; i< 3; i++)
  41. {
  42. //前灯组
  43. HAL_GPIO_WritePin(HeadLightIO_Groups[i].Port, HeadLightIO_Groups[i].Pin, GPIO_PIN_RESET);
  44. GPIO_InitStruct.Pin = HeadLightIO_Groups[i].Pin;
  45. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  46. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  47. HAL_GPIO_Init(HeadLightIO_Groups[i].Port, &GPIO_InitStruct);
  48. //尾灯组
  49. HAL_GPIO_WritePin(TailLightIO_Groups[i].Port, TailLightIO_Groups[i].Pin, GPIO_PIN_RESET);
  50. GPIO_InitStruct.Pin = TailLightIO_Groups[i].Pin;
  51. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  52. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  53. HAL_GPIO_Init(TailLightIO_Groups[i].Port, &GPIO_InitStruct);
  54. }
  55. }
  56. void LightDriver_Process(MC_TailLight_Mode_Struct_t TailLight_Mode, MC_LightVoltage_Struct_t HeadLightVol, MC_LightVoltage_Struct_t TailLightVol, TrueOrFalse_Flag_Struct_t IsBreakFlag, MC_LightSwitch_Struct_t LightSwitchCode)
  57. {
  58. uint8_t HeadLightIO_Groups_ID, TailLightIO_Groups_ID;
  59. //根据配置选择对应的IO
  60. switch(HeadLightVol)
  61. {
  62. case MC_LIGHT_VOL_6V:
  63. {
  64. HeadLightIO_Groups_ID = 0;
  65. break;
  66. }
  67. case MC_LIGHT_VOL_12V:
  68. {
  69. HeadLightIO_Groups_ID = 1;
  70. break;
  71. }
  72. case MC_LIGHT_VOL_BATTERY:
  73. {
  74. HeadLightIO_Groups_ID = 2;
  75. break;
  76. }
  77. default://无配置时,控制PB4,兼容旧主控板
  78. {
  79. HeadLightIO_Groups_ID = 0;
  80. break;
  81. }
  82. }
  83. switch(TailLightVol)
  84. {
  85. case MC_LIGHT_VOL_6V:
  86. {
  87. TailLightIO_Groups_ID = 0;
  88. break;
  89. }
  90. case MC_LIGHT_VOL_12V:
  91. {
  92. TailLightIO_Groups_ID = 1;
  93. break;
  94. }
  95. case MC_LIGHT_VOL_BATTERY:
  96. {
  97. TailLightIO_Groups_ID = 2;
  98. break;
  99. }
  100. default://无配置时,控制PA6,兼容旧主控板
  101. {
  102. TailLightIO_Groups_ID = 2;
  103. break;
  104. }
  105. }
  106. //控制前灯
  107. LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, LightSwitchCode);
  108. //控制尾灯
  109. static uint16_t FlashTimeCnt = 0;
  110. uint16_t OnTime = 8;
  111. uint16_t Period = 15;
  112. switch(TailLight_Mode)
  113. {
  114. case MC_TAIL_LIGHT_MODE1://连接尾灯,开灯时低亮,刹车时高亮
  115. {
  116. if(IsBreakFlag == TRUE)//刹车时,高亮
  117. {
  118. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  119. FlashTimeCnt = 0;
  120. }
  121. else//无刹车时,开灯低亮
  122. {
  123. if(LightSwitchCode == MC_LightSwitch_ON)
  124. {
  125. if(FlashTimeCnt < OnTime)
  126. {
  127. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  128. }
  129. else if(FlashTimeCnt < Period) //控制周期:15K / Period
  130. {
  131. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  132. }
  133. else
  134. {
  135. FlashTimeCnt = 0;
  136. }
  137. FlashTimeCnt++;
  138. }
  139. else if(LightSwitchCode == MC_LightSwitch_OFF)
  140. {
  141. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  142. FlashTimeCnt = 0;
  143. }
  144. }
  145. break;
  146. }
  147. case MC_TAIL_LIGHT_MODE2: default://连接尾灯,开灯时高亮,刹车时闪烁
  148. {
  149. if(IsBreakFlag == TRUE)//刹车时,快闪
  150. {
  151. if(FlashTimeCnt < 600)
  152. {
  153. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  154. }
  155. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  156. {
  157. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  158. }
  159. else
  160. {
  161. FlashTimeCnt = 0;
  162. }
  163. FlashTimeCnt++;
  164. }
  165. else//无刹车时,开灯亮
  166. {
  167. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, LightSwitchCode);
  168. FlashTimeCnt = 0;
  169. }
  170. break;
  171. }
  172. case MC_TAIL_LIGHT_MODE3://连接刹车灯,刹车高亮
  173. {
  174. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (IsBreakFlag == TRUE) ? MC_LightSwitch_ON : MC_LightSwitch_OFF);
  175. break;
  176. }
  177. case MC_TAIL_LIGHT_MODE4://连接刹车灯,刹车闪烁
  178. {
  179. if(IsBreakFlag == TRUE)//刹车时,快闪
  180. {
  181. if(FlashTimeCnt < 600)
  182. {
  183. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  184. }
  185. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  186. {
  187. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  188. }
  189. else
  190. {
  191. FlashTimeCnt = 0;
  192. }
  193. FlashTimeCnt++;
  194. }
  195. else//无刹车时,关闭
  196. {
  197. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  198. FlashTimeCnt = 0;
  199. }
  200. break;
  201. }
  202. }
  203. }