light_driver.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. //根据配置选择对应的IO
  61. switch(HeadLightVol)
  62. {
  63. case MC_LIGHT_VOL_6V:
  64. {
  65. HeadLightIO_Groups_ID = 0;
  66. break;
  67. }
  68. case MC_LIGHT_VOL_12V:
  69. {
  70. HeadLightIO_Groups_ID = 1;
  71. break;
  72. }
  73. case MC_LIGHT_VOL_BATTERY:
  74. {
  75. HeadLightIO_Groups_ID = 2;
  76. break;
  77. }
  78. default://无配置时,控制PB4,兼容旧主控板
  79. {
  80. HeadLightIO_Groups_ID = 0;
  81. break;
  82. }
  83. }
  84. switch(TailLightVol)
  85. {
  86. case MC_LIGHT_VOL_6V:
  87. {
  88. TailLightIO_Groups_ID = 0;
  89. break;
  90. }
  91. case MC_LIGHT_VOL_12V:
  92. {
  93. TailLightIO_Groups_ID = 1;
  94. break;
  95. }
  96. case MC_LIGHT_VOL_BATTERY:
  97. {
  98. TailLightIO_Groups_ID = 2;
  99. break;
  100. }
  101. default://无配置时,控制PA6,兼容旧主控板
  102. {
  103. TailLightIO_Groups_ID = 2;
  104. break;
  105. }
  106. }
  107. //控制前灯
  108. LightDriver_IO_Control(HeadLightIO_Groups, sizeof(HeadLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), HeadLightIO_Groups_ID, LightSwitchCode);
  109. //控制尾灯
  110. static uint16_t FlashTimeCnt = 0;
  111. // uint16_t OnTime = 8;
  112. // uint16_t Period = 15;
  113. switch(TailLight_Mode)
  114. {
  115. case MC_TAIL_LIGHT_MODE1://连接尾灯,开灯时低亮,刹车时高亮
  116. {
  117. if(IsBreakFlag == TRUE)//刹车时,高亮
  118. {
  119. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  120. FlashTimeCnt = 0;
  121. }
  122. else//无刹车时,开灯低亮
  123. {
  124. if(LightSwitchCode == MC_LightSwitch_ON)
  125. {
  126. if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal)//尾灯亮起有效值
  127. {
  128. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  129. }
  130. else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) //控制周期:15K / Period 尾灯亮起的频率
  131. {
  132. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  133. }
  134. else
  135. {
  136. FlashTimeCnt = 0;
  137. }
  138. FlashTimeCnt++;
  139. }
  140. else if(LightSwitchCode == MC_LightSwitch_OFF)
  141. {
  142. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  143. FlashTimeCnt = 0;
  144. }
  145. }
  146. break;
  147. }
  148. case MC_TAIL_LIGHT_MODE2: default://连接尾灯,开灯时高亮,刹车时闪烁
  149. {
  150. if(IsBreakFlag == TRUE)//刹车时,快闪
  151. {
  152. if(FlashTimeCnt < 600)
  153. {
  154. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  155. }
  156. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  157. {
  158. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  159. }
  160. else
  161. {
  162. FlashTimeCnt = 0;
  163. }
  164. FlashTimeCnt++;
  165. }
  166. else//无刹车时,开灯亮
  167. {
  168. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, LightSwitchCode);
  169. FlashTimeCnt = 0;
  170. }
  171. break;
  172. }
  173. case MC_TAIL_LIGHT_MODE3://连接刹车灯,刹车高亮
  174. {
  175. 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);
  176. break;
  177. }
  178. case MC_TAIL_LIGHT_MODE4://连接刹车灯,刹车闪烁
  179. {
  180. if(IsBreakFlag == TRUE)//刹车时,快闪
  181. {
  182. if(FlashTimeCnt < 600)
  183. {
  184. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  185. }
  186. else if(FlashTimeCnt < 1200) //闪烁频率:15K / 1200 = 12.5Hz
  187. {
  188. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  189. }
  190. else
  191. {
  192. FlashTimeCnt = 0;
  193. }
  194. FlashTimeCnt++;
  195. }
  196. else//无刹车时,关闭
  197. {
  198. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  199. FlashTimeCnt = 0;
  200. }
  201. break;
  202. }
  203. case MC_TAIL_LIGHT_MODE5://模式5,常亮
  204. {
  205. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  206. break;
  207. }
  208. case MC_TAIL_LIGHT_MODE6://超速报警
  209. {
  210. if(MC_SpeedSensorData.Speed_Data >= MC_ConfigParam2.u16OverspeedWarnVal)//速度超了 车速放了100倍 6S响1S:7500/45000
  211. {
  212. if(FlashTimeCnt < MC_ConfigParam2.u16EffectVal)//响声执行
  213. {
  214. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_ON);
  215. }
  216. else if(FlashTimeCnt < MC_ConfigParam2.u16Prediv) // 响声周期
  217. {
  218. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  219. }
  220. else
  221. {
  222. FlashTimeCnt = 0;
  223. }
  224. FlashTimeCnt++;
  225. }
  226. else
  227. {
  228. FlashTimeCnt = 0;
  229. LightDriver_IO_Control(TailLightIO_Groups, sizeof(TailLightIO_Groups)/sizeof(MC_LightDriver_IO_Struct_t), TailLightIO_Groups_ID, MC_LightSwitch_OFF);
  230. }
  231. break;
  232. }
  233. }
  234. }