led.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. #include "led.h"
  2. #define LIGHT_LEVEL_LOW (uint16_t)300
  3. #define LIGHT_LEVEL_HIGH (uint16_t)500
  4. uint16_t Light_Mode1_PeriodCnt = 0;
  5. uint16_t Light_Mode2_PeriodCnt = 0;
  6. uint16_t Light_Mode3_PeriodCnt = 0;
  7. uint16_t Light_Mode4_PeriodCnt = 0;
  8. uint16_t Light_Mode1_Count = 0;
  9. uint16_t Light_Mode2_Count = 0;
  10. uint16_t Light_Mode3_Count = 0;
  11. uint16_t Light_Mode4_Count = 0;
  12. uint16_t Light_ModeBreak_PeriodCnt = 0;
  13. uint16_t LedSoc_PeriodCnt = 0;
  14. uint16_t BrightlessLevel = 2;
  15. const uint16_t BrightlessLevelPulse[3] = {25, 75, 200};
  16. /*
  17. 设置亮度
  18. 0-1000
  19. 用于设置照明LED
  20. */
  21. void Light_SetBrightless(uint16_t Level)
  22. {
  23. TIM1_SetCompare1(Level);
  24. }
  25. /*
  26. 关灯模式
  27. */
  28. void Light_DisplayOff(void)
  29. {
  30. Light_SetBrightless(0);
  31. }
  32. /*
  33. 模式1:快闪,250ms亮,250ms灭,智能模式,白天熄灯,晚上亮灯,30s自动关闭
  34. 强光或静置时,只在模式切换时亮三次
  35. 函数运行周期1ms
  36. */
  37. void Light_DisplayMode1(uint16_t LightSensor, uint8_t Smart)
  38. {
  39. uint8_t OffFlag = 0;
  40. //判断是否自动关灯
  41. if(Smart == 0) //非智能模式
  42. {
  43. OffFlag = 0;
  44. }
  45. else //智能模式,根据光感强度确定是否自动关闭
  46. {
  47. if(LightSensor < LIGHT_LEVEL_LOW)
  48. OffFlag = 0;
  49. else if(LightSensor > LIGHT_LEVEL_HIGH)
  50. OffFlag = 1;
  51. }
  52. //自动关闭时在模式切换时亮三次
  53. if((OffFlag == 1)&&(Light_Mode1_Count >= 3))
  54. {
  55. Light_SetBrightless(0);
  56. }
  57. else
  58. {
  59. Light_Mode1_PeriodCnt++;
  60. if(Light_Mode1_PeriodCnt <= 150)
  61. {
  62. Light_SetBrightless(BrightlessLevelPulse[BrightlessLevel - 1]);
  63. }
  64. else if(Light_Mode1_PeriodCnt <= 300)
  65. {
  66. Light_SetBrightless(0);
  67. }
  68. else
  69. {
  70. Light_Mode1_PeriodCnt = 0;
  71. Light_Mode1_Count++;
  72. }
  73. }
  74. }
  75. /*
  76. 模式2:呼吸,800ms加到最亮,周期1s,智能模式,白天熄灯,晚上亮灯,30s自动关闭
  77. 函数运行周期1ms
  78. */
  79. void Light_DisplayMode2(uint16_t LightSensor, uint8_t Smart)
  80. {
  81. uint8_t OffFlag = 0;
  82. uint16_t LevelPluse = 0;
  83. //设定亮度
  84. if(BrightlessLevel == 1) LevelPluse = 25;
  85. else if(BrightlessLevel == 2) LevelPluse = 50;
  86. else if(BrightlessLevel == 3) LevelPluse = 100;
  87. //判断是否自动关灯
  88. if(Smart == 0) //非智能模式
  89. {
  90. OffFlag = 0;
  91. }
  92. else //智能模式,根据光感强度确定是否自动关闭
  93. {
  94. if(LightSensor < LIGHT_LEVEL_LOW)
  95. OffFlag = 0;
  96. else if(LightSensor > LIGHT_LEVEL_HIGH)
  97. OffFlag = 1;
  98. }
  99. //自动关闭时在模式切换时亮三次
  100. if((OffFlag == 1) && (Light_Mode2_Count >= 2))
  101. {
  102. Light_SetBrightless(0);
  103. }
  104. else
  105. {
  106. Light_Mode2_PeriodCnt++;
  107. if(Light_Mode2_PeriodCnt <= 750)
  108. {
  109. Light_SetBrightless((uint32_t)Light_Mode2_PeriodCnt * LevelPluse / 750 + 10);
  110. }
  111. else if(Light_Mode2_PeriodCnt <= 1500)
  112. {
  113. Light_SetBrightless((uint32_t)(1500 - Light_Mode2_PeriodCnt) * LevelPluse / 1500 + 10);
  114. }
  115. else
  116. {
  117. Light_Mode2_PeriodCnt = 0;
  118. Light_Mode2_Count++;
  119. }
  120. }
  121. }
  122. /*
  123. 模式3:爆闪,50ms亮,950ms灭,非智能
  124. 函数运行周期1ms
  125. */
  126. void Light_DisplayMode3(uint16_t LightSensor, uint8_t Smart)
  127. {
  128. uint8_t OffFlag = 0;
  129. //判断是否自动关灯
  130. if(Smart == 0) //非智能模式
  131. {
  132. OffFlag = 0;
  133. }
  134. else //智能模式,根据光感强度确定是否自动关闭
  135. {
  136. if(LightSensor < LIGHT_LEVEL_LOW)
  137. OffFlag = 0;
  138. else if(LightSensor > LIGHT_LEVEL_HIGH)
  139. OffFlag = 1;
  140. }
  141. //自动关闭时在模式切换时亮三次
  142. if((OffFlag == 1)&&(Light_Mode3_Count >= 3))
  143. {
  144. Light_SetBrightless(0);
  145. }
  146. else
  147. {
  148. Light_Mode3_PeriodCnt++;
  149. if(Light_Mode3_PeriodCnt <= 25)
  150. {
  151. Light_SetBrightless(BrightlessLevelPulse[BrightlessLevel - 1]);
  152. }
  153. else if(Light_Mode3_PeriodCnt <= 100)
  154. {
  155. Light_SetBrightless(0);
  156. }
  157. else if(Light_Mode3_PeriodCnt <= 125)
  158. {
  159. Light_SetBrightless(BrightlessLevelPulse[BrightlessLevel - 1]);
  160. }
  161. else if(Light_Mode3_PeriodCnt <= 500)
  162. {
  163. Light_SetBrightless(0);
  164. }
  165. else
  166. {
  167. Light_Mode3_PeriodCnt = 0;
  168. Light_Mode3_Count++;
  169. }
  170. }
  171. }
  172. /*
  173. 模式4:常亮
  174. 函数运行周期1ms
  175. */
  176. void Light_DisplayMode4(uint16_t LightSensor, uint8_t Smart)
  177. {
  178. uint8_t OffFlag = 0;
  179. //判断是否自动关灯
  180. if(Smart == 0) //非智能模式
  181. {
  182. OffFlag = 0;
  183. }
  184. else //智能模式,根据光感强度确定是否自动关闭
  185. {
  186. if(LightSensor < LIGHT_LEVEL_LOW)
  187. OffFlag = 0;
  188. else if(LightSensor > LIGHT_LEVEL_HIGH)
  189. OffFlag = 1;
  190. }
  191. //自动关闭时在模式切换时亮三次
  192. if((OffFlag == 1)&&(Light_Mode4_Count >= 3))
  193. {
  194. Light_SetBrightless(0);
  195. }
  196. else
  197. {
  198. Light_SetBrightless(BrightlessLevelPulse[BrightlessLevel - 1]);
  199. Light_Mode4_PeriodCnt++;
  200. if(Light_Mode4_PeriodCnt > 1000)
  201. {
  202. Light_Mode4_PeriodCnt = 0;
  203. Light_Mode4_Count++;
  204. }
  205. }
  206. }
  207. /*
  208. 刹车灯模式:高亮3s
  209. 函数运行周期1ms
  210. */
  211. void Light_DisplayBreak(uint8_t* Break)
  212. {
  213. Light_ModeBreak_PeriodCnt++;
  214. if(Light_ModeBreak_PeriodCnt <= 3000)
  215. {
  216. Light_SetBrightless(1000);
  217. }
  218. else
  219. {
  220. Light_SetBrightless(0);
  221. *Break = 0;
  222. }
  223. }
  224. /*
  225. 设置颜色
  226. 0-255
  227. 用于设置电量指示灯
  228. */
  229. void LedChg_SetColor(uint8_t Red, uint8_t Green, uint8_t Blue)
  230. {
  231. //R
  232. TIM2_SetCompare1(((uint32_t)500 * Red) >> 8);
  233. //G
  234. TIM2_SetCompare2(((uint32_t)500 * Green) >> 8);
  235. //B
  236. TIM2_SetCompare3(((uint32_t)500 * Blue) >> 8);
  237. }
  238. /*
  239. 电量指示灯关闭
  240. */
  241. void LedChg_Off(void)
  242. {
  243. TIM2_Cmd(DISABLE);
  244. }
  245. /*
  246. 电量指示灯
  247. 函数运行周期100ms
  248. ChgMode=0: 放电模式,Mode=1:充电模式
  249. Smart=0:非智能模式,Smart=1:智能模式
  250. */
  251. void Led_BatSoc_Display(uint8_t ChgMode, uint8_t Smart, uint8_t SOC)
  252. {
  253. uint8_t OnCnt1 = 0, OffCnt1, OnCnt2 = 0, OffCnt2 = 0;
  254. if((ChgMode == 1) && (SOC >= 100)) //充电状态且电量100%时,绿灯常亮
  255. {
  256. LedSoc_PeriodCnt = 0;
  257. LedChg_SetColor(0, 0xFA, 0);
  258. }
  259. else //充电状态电量低于100%,亮1s灭1s;放电状态电量低于10%快闪,电量高于10%慢闪
  260. {
  261. if(ChgMode == 1)
  262. {
  263. OnCnt1 = 10;
  264. OffCnt1 = 20;
  265. OnCnt2 = 30;
  266. OffCnt2 = 40;
  267. }
  268. else
  269. {
  270. if(Smart == 1)
  271. {
  272. if(SOC <= 10) //快闪2下
  273. {
  274. OnCnt1 = 2;
  275. OffCnt1 = 6;
  276. OnCnt2 = 8;
  277. OffCnt2 = 20;
  278. }
  279. else //慢闪2下
  280. {
  281. OnCnt1 = 2;
  282. OffCnt1 = 6;
  283. OnCnt2 = 8;
  284. OffCnt2 = 50;
  285. }
  286. }
  287. else
  288. {
  289. if(SOC <= 10) //快闪1下
  290. {
  291. OnCnt1 = 2;
  292. OffCnt1 = 20;
  293. OnCnt2 = 22;
  294. OffCnt2 = 40;
  295. }
  296. else //慢闪1下
  297. {
  298. OnCnt1 = 2;
  299. OffCnt1 = 50;
  300. OnCnt2 = 52;
  301. OffCnt2 = 100;
  302. }
  303. }
  304. }
  305. LedSoc_PeriodCnt++;
  306. if(LedSoc_PeriodCnt <= OnCnt1)
  307. {
  308. if(SOC <= 10) LedChg_SetColor(0xFA, 0, 0);
  309. else if(SOC <= 40) LedChg_SetColor(0xFA, 0xA0, 0);
  310. else if(SOC <= 80) LedChg_SetColor(0, 0xFA, 0xFA);
  311. else LedChg_SetColor(0, 0xFA, 0);
  312. }
  313. else if(LedSoc_PeriodCnt <= OffCnt1)
  314. {
  315. LedChg_SetColor(0, 0, 0);
  316. }
  317. else if(LedSoc_PeriodCnt <= OnCnt2)
  318. {
  319. if(SOC <= 10) LedChg_SetColor(0xFA, 0, 0);
  320. else if(SOC <= 40) LedChg_SetColor(0xFA, 0xA0, 0);
  321. else if(SOC <= 80) LedChg_SetColor(0, 0xFA, 0xFA);
  322. else LedChg_SetColor(0, 0xFA, 0);
  323. }
  324. else if(LedSoc_PeriodCnt <= OffCnt2)
  325. {
  326. LedChg_SetColor(0, 0, 0);
  327. }
  328. else
  329. {
  330. LedSoc_PeriodCnt = 0;
  331. }
  332. }
  333. }