light_driver.c 7.5 KB

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