light_driver.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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, TrueOrFalse_Flag_Struct_t OnFlag)
  16. {
  17. uint8_t i;
  18. if(OnFlag == TRUE)//开灯时,仅打开配置的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(uint8_t Light_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, FALSE);
  64. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  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. switch(Light_Mode & 0xF0)
  116. {
  117. case MC_FRONT_LIGHT_MODE1: //常亮
  118. {
  119. LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, TRUE);
  120. break;
  121. }
  122. case MC_FRONT_LIGHT_MODE2: default: //仪表控制开关
  123. {
  124. LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, (LightSwitchCode & 0x01) ? TRUE : FALSE);
  125. break;
  126. }
  127. }
  128. //控制尾灯
  129. static uint16_t FlashTimeCnt = 0;
  130. switch(Light_Mode & 0x0F)
  131. {
  132. case MC_TAIL_LIGHT_MODE1://连接尾灯,开灯时低亮,刹车时高亮
  133. {
  134. if(IsBreakFlag == TRUE)//刹车时,高亮
  135. {
  136. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  137. FlashTimeCnt = 0;
  138. }
  139. else//无刹车时,开灯低亮
  140. {
  141. if(LightSwitchCode & 0x01)
  142. {
  143. if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal) //尾灯亮起有效值
  144. {
  145. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  146. }
  147. else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) //控制周期:15K / Period 尾灯亮起的频率
  148. {
  149. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  150. }
  151. else
  152. {
  153. FlashTimeCnt = 0;
  154. }
  155. FlashTimeCnt++;
  156. }
  157. else
  158. {
  159. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  160. FlashTimeCnt = 0;
  161. }
  162. }
  163. break;
  164. }
  165. case MC_TAIL_LIGHT_MODE2: default://连接尾灯,开灯时高亮,刹车时闪烁
  166. {
  167. if(IsBreakFlag == TRUE)//刹车时,快闪
  168. {
  169. if(FlashTimeCnt < 600)
  170. {
  171. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  172. }
  173. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  174. {
  175. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  176. }
  177. else
  178. {
  179. FlashTimeCnt = 0;
  180. }
  181. FlashTimeCnt++;
  182. }
  183. else//无刹车时,开灯亮
  184. {
  185. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (LightSwitchCode & 0x01) ? TRUE : FALSE);
  186. FlashTimeCnt = 0;
  187. }
  188. break;
  189. }
  190. case MC_TAIL_LIGHT_MODE3://连接刹车灯,刹车高亮
  191. {
  192. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (IsBreakFlag == TRUE) ? TRUE : FALSE);
  193. break;
  194. }
  195. case MC_TAIL_LIGHT_MODE4://连接刹车灯,刹车闪烁
  196. {
  197. if(IsBreakFlag == TRUE)//刹车时,快闪
  198. {
  199. if(FlashTimeCnt < 600)
  200. {
  201. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  202. }
  203. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  204. {
  205. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  206. }
  207. else
  208. {
  209. FlashTimeCnt = 0;
  210. }
  211. FlashTimeCnt++;
  212. }
  213. else//无刹车时,关闭
  214. {
  215. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  216. FlashTimeCnt = 0;
  217. }
  218. break;
  219. }
  220. case MC_TAIL_LIGHT_MODE5://模式5,常亮
  221. {
  222. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  223. break;
  224. }
  225. case MC_TAIL_LIGHT_MODE6://模式6,超速报警
  226. {
  227. if(MC_SpeedSensorData.Speed_Data >= MC_ConfigParam2.u16OverspeedWarnVal)
  228. {
  229. if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal)
  230. {
  231. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  232. }
  233. else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv)
  234. {
  235. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  236. }
  237. else
  238. {
  239. FlashTimeCnt = 0;
  240. }
  241. FlashTimeCnt++;
  242. }
  243. else
  244. {
  245. FlashTimeCnt = 0;
  246. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  247. }
  248. break;
  249. }
  250. case MC_TAIL_LIGHT_MODE7://模式7,开机自动低亮,刹车高亮
  251. {
  252. if(IsBreakFlag == TRUE)//刹车时,高亮
  253. {
  254. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  255. FlashTimeCnt = 0;
  256. }
  257. else//无刹车时,低亮
  258. {
  259. if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal) //尾灯亮起有效值
  260. {
  261. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, TRUE);
  262. }
  263. else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) //控制周期:15K / Period 尾灯亮起的频率
  264. {
  265. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, FALSE);
  266. }
  267. else
  268. {
  269. FlashTimeCnt = 0;
  270. }
  271. FlashTimeCnt++;
  272. }
  273. break;
  274. }
  275. case MC_TAIL_LIGHT_MODE8://模式8,仅开灯高亮,与前灯指令一致
  276. {
  277. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (LightSwitchCode & 0x01) ? TRUE : FALSE);
  278. break;
  279. }
  280. case MC_TAIL_LIGHT_MODE9://模式9,仅开灯高亮,与前灯指令不同
  281. {
  282. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, (LightSwitchCode & 0x02) ? TRUE : FALSE);
  283. break;
  284. }
  285. }
  286. }