hal_battery_NoPowerEnPin.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. /*********************************************************************
  2. * INCLUDES
  3. */
  4. #include "usr_config.h"
  5. #include "hal_battery.h"
  6. #include "cli.h"
  7. #include "hal_charge.h"
  8. #include "fml_adc.h"
  9. #include "app_chargerpin_conn_detect.h"
  10. #define PRINTBLE 0
  11. #define IIDUAN 1
  12. #include "ble_comm.h"
  13. #include "exception.h"
  14. #include "ringframe.h"
  15. RINGFRAME_DEF(battlog, ringframe_size_4096);
  16. char logbuftemp[50];
  17. int logbuftemp_len = 0;
  18. #define log(...) {logbuftemp_len = sprintf(logbuftemp,__VA_ARGS__); while(ringframe_in(&battlog,logbuftemp,logbuftemp_len)!=0){ringframe_throw(&battlog);}}
  19. #include "hal_ble_client.h"
  20. char print_log = 0;
  21. void cb_BLE_Client_ERR(void* handle)
  22. {
  23. DEBUG_LOG("cb_BLE_Client_ERR:%d,%d\n", 1, 1);
  24. print_log = 1;
  25. }
  26. battercb_t* battercb = NULL;
  27. void printbatter_cb(battercb_t* c, battercb_t* C_flash)
  28. {
  29. // char bytes[256];
  30. // int len = 0;
  31. // len = sprintf(bytes, "%f,%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d\r\n",
  32. // c->preBestResult_Voltage2power,
  33. // c->preBestResult_chargeV2P_f,
  34. // c->P_mAh,
  35. // c->kg,
  36. // c->P2,
  37. // c->P1,
  38. // c->Battery_capacity_mAh,
  39. // c->adc_tp4056_power,
  40. // c->init,
  41. // c->sta,
  42. // c->chargeV2P_f_init,
  43. // c->Voltage2power_init);
  44. // SEGGER_RTT_Write(0, bytes, len);
  45. // len = sprintf(bytes, "%f,%f,%f,%f,%f,%f,%f,%f,%d,%d,%d,%d\r\n",
  46. // C_flash->preBestResult_Voltage2power,
  47. // C_flash->preBestResult_chargeV2P_f,
  48. // C_flash->P_mAh,
  49. // C_flash->kg,
  50. // C_flash->P2,
  51. // C_flash->P1,
  52. // C_flash->Battery_capacity_mAh,
  53. // C_flash->adc_tp4056_power,
  54. // C_flash->init,
  55. // C_flash->sta,
  56. // C_flash->chargeV2P_f_init,
  57. // C_flash->Voltage2power_init);
  58. // SEGGER_RTT_Write(0, bytes, len);
  59. // DEBUG_LOG("\r\n");
  60. }
  61. void cb_init(void)
  62. {
  63. battercb = Except_Get_Battery_Record_Buff();
  64. if (battercb->init != 3)
  65. {
  66. battercb->init = 3;
  67. battercb->P1 = 100.0f;
  68. battercb->adc_tp4056_power = 0;
  69. battercb->Battery_capacity_mAh = 0;
  70. battercb->kg = 1;
  71. battercb->P2 = 0;
  72. battercb->preBestResult_chargeV2P_f = 0;
  73. battercb->preBestResult_Voltage2power = 0;
  74. battercb->sta = 0;
  75. battercb->P_mAh = 0;
  76. battercb->Voltage2power_init = 1;
  77. battercb->chargeV2P_f_init = 1;
  78. }
  79. }
  80. //返回5V信号,有5V的话返回1,没有的话返回0
  81. static char charge_in(void)
  82. {
  83. if (nrf_gpio_pin_read(PIN_CHARGING))
  84. {
  85. return 1;
  86. }
  87. else
  88. {
  89. return 0;
  90. }
  91. }
  92. static float filter(float value, float kg, float* preBestResult)
  93. {
  94. float new_v = value;
  95. new_v = *preBestResult * (1.0f - kg) + value * kg;
  96. *preBestResult = new_v;
  97. return new_v;
  98. }
  99. #if IIDUAN == 0
  100. //鞋子ADC
  101. static const float poo1o[] = { 0, 0, 0.0279893723606430, 0.174605323652602, 0.325796538285416, 0.495164949358988, 0.661918800578876, 0.829024800123971, 1.00225498989324, 1.17936073685608, 1.37258677752597, 1.56525700069634, 1.78680072433224, 2.00361106262195, 2.24466616203811, 2.46699160701705, 2.77834696254638, 3.12186809827754, 3.58442625993982, 4.15025435558636, 4.75855743544068, 5.51189718744822, 6.35834306864975, 7.38461196888009, 8.48997478633724, 9.43096936165977, 10.3817319764220, 11.4116388420216, 12.3939372566211, 13.5048186806524, 14.5904959858255, 15.5237940825920, 16.4790857938893, 17.8137595522187, 18.9982251103467, 20.3392608271850, 21.5817542329461, 22.7218253119165, 23.9444316340532, 25.2939077624602, 26.6264082603126, 27.6802415218000, 29.0022881606974, 30.1783424265851, 31.1179209268523, 32.2887764986448, 33.3732790985050, 34.2380544358441, 35.2041112278740, 36.0163848326001, 36.8624779801428, 37.6634899287154, 38.5186413495501, 39.4878256764553, 40.2471232681709, 41.2081417271725, 42.3322924899204, 43.7047997876243, 44.9058976548061, 46.5044971286874, 47.8927266715832, 49.8558978793141, 51.9022338412845, 54.2586141300707, 56.3903798469888, 58.7696803719223, 60.8764981712366, 62.2358527791606, 63.8383633243999, 65.5021323737117, 67.1556090613014, 69.0159229136298, 70.1420773342446, 71.2282683025524, 72.4548338447843, 73.6556507850819, 74.8128040906371, 75.8695501837768, 77.1323517287879, 78.6365237973046, 80.3752005495001, 82.8468947240450, 86.6163997907370, 91.2910588313494, 93.9702969410882, 95.4930183746766, 96.9114001488224, 97.8493292727541, 98.7169169431273, 99.3270162091455, 99.6869018017068, 99.9917942993789, 99.9689500363163, 99.97, 99.98, 99.98, 99.98, 99.98, 99.99, 99.99, 99.99 };
  102. static float interp1(float x)
  103. {
  104. int absx = (int)x - 320;
  105. float max = poo1o[absx + 1];
  106. float min = poo1o[absx];
  107. float temp = x - (float)absx - 320.0f;
  108. return (max - min) * temp + min;
  109. }
  110. #else
  111. #define BAT_100_P 401.073951f
  112. #define BAT_90_P 395.453010f
  113. #define BAT_80_P 389.242398f
  114. #define BAT_70_P 382.361362f
  115. #define BAT_60_P 376.311623f
  116. #define BAT_50_P 369.299206f
  117. #define BAT_40_P 363.746813f
  118. #define BAT_30_P 358.456566f
  119. #define BAT_20_P 353.006251f
  120. #define BAT_10_P 346.644176f
  121. #define BAT_0_P 322.992736f
  122. //#define BAT_100_P 405.533003f
  123. //#define BAT_90_P 400.213597f
  124. //#define BAT_80_P 393.844613f
  125. //#define BAT_70_P 386.347668f
  126. //#define BAT_60_P 379.609008f
  127. //#define BAT_50_P 372.386100f
  128. //#define BAT_40_P 365.633721f
  129. //#define BAT_30_P 359.847035f
  130. //#define BAT_20_P 353.966445f
  131. //#define BAT_10_P 347.139688f
  132. //#define BAT_0_P 322.992736f
  133. //#define BAT_100_P 408.5f
  134. //#define BAT_90_P 402.6f
  135. //#define BAT_80_P 393.4f
  136. //#define BAT_70_P 388.0f
  137. //#define BAT_60_P 382.0f
  138. //#define BAT_50_P 372.0f
  139. //#define BAT_40_P 365.0f
  140. //#define BAT_30_P 361.0f
  141. //#define BAT_20_P 354.0f
  142. //#define BAT_10_P 345.0f
  143. //#define BAT_0_P 320.0f
  144. #define CHA_100_P 415.0f //408
  145. #define CHA_90_P 412.0f //402
  146. #define CHA_80_P 408.0f //393
  147. #define CHA_70_P 403.0f //388
  148. #define CHA_60_P 397.0f //382
  149. #define CHA_50_P 387.0f //372
  150. #define CHA_40_P 380.0f //365
  151. #define CHA_30_P 377.0f //361
  152. #define CHA_20_P 369.0f //354
  153. #define CHA_10_P 360.0f //345
  154. #define CHA_0_P 335.0f
  155. static float interp1(float x)
  156. {
  157. if (x > BAT_100_P)
  158. {
  159. return 100.0f;
  160. }
  161. else if ((x <= BAT_100_P) && (x > BAT_90_P))
  162. {
  163. return (x - BAT_90_P) / (BAT_100_P - BAT_90_P) * 10.0f + 90.0f;
  164. }
  165. else if ((x <= BAT_90_P) && (x > BAT_80_P))
  166. {
  167. return (x - BAT_80_P) / (BAT_90_P - BAT_80_P) * 10.0f + 80.0f;
  168. }
  169. else if ((x <= BAT_80_P) && (x > BAT_70_P))
  170. {
  171. return (x - BAT_70_P) / (BAT_80_P - BAT_70_P) * 10.0f + 70.0f;
  172. }
  173. else if ((x <= BAT_70_P) && (x > BAT_60_P))
  174. {
  175. return (x - BAT_60_P) / (BAT_70_P - BAT_60_P) * 10.0f + 60.0f;
  176. }
  177. else if ((x <= BAT_60_P) && (x > BAT_50_P))
  178. {
  179. return (x - BAT_50_P) / (BAT_60_P - BAT_50_P) * 10.0f + 50.0f;
  180. }
  181. else if ((x <= BAT_50_P) && (x > BAT_40_P))
  182. {
  183. return (x - BAT_40_P) / (BAT_50_P - BAT_40_P) * 10.0f + 40.0f;
  184. }
  185. else if ((x <= BAT_40_P) && (x > BAT_30_P))
  186. {
  187. return (x - BAT_30_P) / (BAT_40_P - BAT_30_P) * 10.0f + 30.0f;
  188. }
  189. else if ((x <= BAT_30_P) && (x > BAT_20_P))
  190. {
  191. return (x - BAT_20_P) / (BAT_30_P - BAT_20_P) * 10.0f + 20.0f;
  192. }
  193. else if ((x <= BAT_20_P) && (x > BAT_10_P))
  194. {
  195. return (x - BAT_10_P) / (BAT_20_P - BAT_10_P) * 10.0f + 10.0f;
  196. }
  197. else if ((x <= BAT_10_P) && (x > BAT_0_P))
  198. {
  199. return (x - BAT_0_P) / (BAT_10_P - BAT_0_P) * 10.0f + 00.0f;
  200. }
  201. else
  202. {
  203. return 0.0f;
  204. }
  205. }
  206. #endif
  207. //返回电压百分比
  208. static float Voltage2power(float mV)
  209. {
  210. float rev = 0;
  211. float k = 0;
  212. if (battercb->Voltage2power_init)
  213. {
  214. battercb->preBestResult_Voltage2power = mV / 10;
  215. battercb->Voltage2power_init = 0;
  216. }
  217. k = filter(mV / 10, 0.01, &battercb->preBestResult_Voltage2power);
  218. if (k < 320.0f)
  219. {
  220. rev = 0;
  221. }
  222. else if (k > 420.0f)
  223. {
  224. rev = 100;
  225. }
  226. else
  227. {
  228. rev = interp1(k);
  229. }
  230. return rev;
  231. }
  232. #if IIDUAN == 0
  233. static const float chargeV2P[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.606184684199367, 0.938307744774148, 1.30769659743727, 1.87378869014097, 2.39210582883903, 2.92471759425620, 3.79782257541779, 4.54241638183623, 5.09886597521223, 5.98930945903392, 6.49613916536905, 7.57967916311061, 8.42757721701290, 9.26589943580526, 10.3408809248851, 11.4278317273525, 12.3098089504989, 13.8095299712012, 15.4373756551577, 16.8805115746597, 18.4871688551768, 20.0578462608782, 21.6336381358003, 22.9916066660508, 24.4652374859292, 25.6565902258290, 26.8453581267414, 27.9070922567514, 28.9713295466563, 30.0209078713242, 30.9380166385130, 32.0419258329631, 33.1827748787620, 33.8691297160915, 34.8949274023278, 35.8840553861847, 36.9638277084030, 37.8687458690322, 38.9939274175310, 40.4336758333268, 41.1114865403869, 42.6160733592240, 44.2493873543177, 45.6026105469954, 47.4664557187522, 49.0734043728910, 51.2998758679562, 52.8880367841713, 54.7587352342972, 57.0178625862682, 58.8608281071146, 60.3657347075748, 62.4281274954232, 64.3086188700345, 65.8044424890286, 68.6475622104224, 72.7352289117192, 76.9893033499930, 84.0930819869950, 92.2923770276700, 96.3286261252036, 99.7542287364423 };
  234. static float interp1_chargeV2P(float x)
  235. {
  236. int absx = (int)x - 350;
  237. float max = chargeV2P[absx + 1];
  238. float min = chargeV2P[absx];
  239. float temp = x - (float)absx - 350.0f;
  240. return (max - min) * temp + min;
  241. }
  242. #else
  243. static float interp1_chargeV2P(float x)
  244. {
  245. if (x > CHA_100_P)
  246. {
  247. return 100.0f;
  248. }
  249. else if ((x <= CHA_100_P) && (x > CHA_90_P))
  250. {
  251. return (x - CHA_90_P) / (CHA_100_P - CHA_90_P) * 10.0f + 90.0f;
  252. }
  253. else if ((x <= CHA_90_P) && (x > CHA_80_P))
  254. {
  255. return (x - CHA_80_P) / (CHA_90_P - CHA_80_P) * 10.0f + 80.0f;
  256. }
  257. else if ((x <= CHA_80_P) && (x > CHA_70_P))
  258. {
  259. return (x - CHA_70_P) / (CHA_80_P - CHA_70_P) * 10.0f + 70.0f;
  260. }
  261. else if ((x <= CHA_70_P) && (x > CHA_60_P))
  262. {
  263. return (x - CHA_60_P) / (CHA_70_P - CHA_60_P) * 10.0f + 60.0f;
  264. }
  265. else if ((x <= CHA_60_P) && (x > CHA_50_P))
  266. {
  267. return (x - CHA_50_P) / (CHA_60_P - CHA_50_P) * 10.0f + 50.0f;
  268. }
  269. else if ((x <= CHA_50_P) && (x > CHA_40_P))
  270. {
  271. return (x - CHA_40_P) / (CHA_50_P - CHA_40_P) * 10.0f + 40.0f;
  272. }
  273. else if ((x <= CHA_40_P) && (x > CHA_30_P))
  274. {
  275. return (x - CHA_30_P) / (CHA_40_P - CHA_30_P) * 10.0f + 30.0f;
  276. }
  277. else if ((x <= CHA_30_P) && (x > CHA_20_P))
  278. {
  279. return (x - CHA_20_P) / (CHA_30_P - CHA_20_P) * 10.0f + 20.0f;
  280. }
  281. else if ((x <= CHA_20_P) && (x > CHA_10_P))
  282. {
  283. return (x - CHA_10_P) / (CHA_20_P - CHA_10_P) * 10.0f + 10.0f;
  284. }
  285. else if ((x <= CHA_10_P) && (x > CHA_0_P))
  286. {
  287. return (x - CHA_0_P) / (BAT_10_P - CHA_0_P) * 10.0f + 0.0f;
  288. }
  289. else
  290. {
  291. return 0.0f;
  292. }
  293. }
  294. #endif
  295. //返回电压百分比
  296. static float chargeV2P_f(float mV)
  297. {
  298. float rev = 0;
  299. float k = 0;
  300. if (battercb->chargeV2P_f_init)
  301. {
  302. battercb->preBestResult_chargeV2P_f = mV / 10;
  303. battercb->chargeV2P_f_init = 0;
  304. }
  305. k = filter(mV / 10, 0.05, &battercb->preBestResult_chargeV2P_f);
  306. if (k < 350.0f)
  307. {
  308. rev = 0;
  309. }
  310. else if (k > 415.0f)
  311. {
  312. rev = 100;
  313. }
  314. else
  315. {
  316. rev = interp1_chargeV2P(k);
  317. }
  318. return rev;
  319. }
  320. //返回电量百分比
  321. static float Voltage2mah(float mah, float storage_capacity)
  322. {
  323. return mah / storage_capacity * 100.0f;
  324. }
  325. //返回电压剩余绝对容量
  326. static float mah2Voltage(float P, float storage_capacity)
  327. {
  328. return storage_capacity * P / 100.0f;
  329. }
  330. static void Charge(float mV, float* mAh, float interval_s)
  331. {
  332. float A = mV / 3000.0f * 1.1f;
  333. float dmAh = A * 1000.0f * interval_s / 3600.0f;
  334. *mAh = *mAh + dmAh;
  335. }
  336. static float Power_management(float mV_Battery, float mV_Charge)
  337. {
  338. float storage_capacity = 350;
  339. switch (battercb->sta)
  340. {
  341. case 0:
  342. if (mV_Charge > 20)
  343. {
  344. battercb->sta = 2; //充电过程
  345. battercb->P1 = chargeV2P_f(mV_Battery);
  346. battercb->Battery_capacity_mAh = mah2Voltage(battercb->P1, storage_capacity);
  347. }
  348. else
  349. {
  350. battercb->P1 = Voltage2power(mV_Battery);
  351. battercb->sta = 1; //放电过程
  352. if ((interp1(mV_Battery / 10.0f) - battercb->P1 > 15.0f) || (interp1(mV_Battery / 10.0f) - battercb->P1 < -15.0f))
  353. {
  354. battercb->P1 = interp1(mV_Battery / 10.0f);
  355. }
  356. }
  357. break;
  358. case 1://放电
  359. if (mV_Charge > 20)
  360. {
  361. battercb->sta = 2; //充电过程
  362. battercb->kg = 0;
  363. battercb->Battery_capacity_mAh = mah2Voltage(battercb->P1, storage_capacity);
  364. log("in %f\r\n",battercb->P1);
  365. }
  366. else
  367. {
  368. battercb->P2 = Voltage2power(mV_Battery);
  369. if ((battercb->P2 - battercb->P1 > 15.0f) || (battercb->P2 - battercb->P1 < -15.0f))
  370. {
  371. battercb->P1 = battercb->P2;
  372. }
  373. else
  374. {
  375. if (battercb->P1 > battercb->P2)
  376. {
  377. battercb->P1 = battercb->P2;
  378. }
  379. }
  380. }
  381. break;
  382. case 2://充电
  383. if (mV_Charge < 20)
  384. {
  385. log("out %f\r\n",battercb->P1);
  386. battercb->sta = 1; //放电过程
  387. //初始化滤波器波器
  388. battercb->preBestResult_Voltage2power = mV_Battery / 10;
  389. // #ifdef PIN_BATFULL
  390. // if ((battercb->P1 > 99.1f) && (charge_in()) && (nrf_gpio_pin_read(PIN_BATFULL) == 0))
  391. // #else
  392. if ((battercb->P1 > 99.1f) && (charge_in()))
  393. // #endif
  394. {
  395. battercb->P1 = 100.0f;
  396. log("full %f\r\n",battercb->P1);
  397. }
  398. }
  399. else
  400. {
  401. if ((battercb->P1 > 99.9f))
  402. {
  403. DEBUG_LOG("((battercb->P1 == 100.0f)&&( mV_Charge < 200.0f))()\r\n");
  404. break;
  405. }
  406. //---------------------------------------------------
  407. Charge(mV_Charge, &battercb->Battery_capacity_mAh, 1);
  408. battercb->P_mAh = Voltage2mah(battercb->Battery_capacity_mAh, storage_capacity);
  409. //---------------------------------------------------
  410. battercb->P2 = chargeV2P_f(mV_Battery);
  411. battercb->kg = mV_Charge / 1000.0f;
  412. if (battercb->kg > 1.0f)
  413. {
  414. battercb->kg = 1.0f;
  415. }
  416. battercb->P2 = (1.0f - battercb->kg) * battercb->P2 + battercb->kg * battercb->P_mAh;
  417. if (battercb->P1 < battercb->P2) //过滤刚插上充电线时候的虚低
  418. {
  419. battercb->P1 = battercb->P2;
  420. }
  421. if (battercb->P1 >= 100.0f)
  422. {
  423. battercb->P1 = 99.9;
  424. }
  425. }
  426. break;
  427. }
  428. return battercb->P1;
  429. }
  430. static int16_t BatadcVal = 0;
  431. int16_t hal_GetBatttery_Adc(void)
  432. {
  433. return ADC_RESULT_IN_MILLI_VOLTS(BatadcVal) * 5 / 3;
  434. }
  435. static void hal_battery_Process(void)
  436. {
  437. static int count = 0;
  438. static int adc_midal = 0;
  439. static int cprign = 0;
  440. #if PRINTBLE
  441. char buff[256];
  442. unsigned char len = 0;
  443. #endif
  444. int16_t CHARGMEASURE;
  445. int16_t volTemp;
  446. int16_t volTemp_CHARGMEASURE;
  447. if (-1 == fml_adc_get_value(PIN_ADC_BAT_CHANNEL, &BatadcVal))
  448. {
  449. return;
  450. }
  451. else if (0 == BatadcVal)
  452. {
  453. return;
  454. }
  455. // DEBUG_LOG("hal_GetBatttery_Adc:%d\n", BatadcVal);
  456. volTemp = ADC_RESULT_IN_MILLI_VOLTS(BatadcVal) * 5 / 3; // 电池电压转换计算
  457. if (-1 == fml_adc_get_value(PIN_ADC_CHARGMEASURE_CHANNEL, &CHARGMEASURE))
  458. {
  459. return;
  460. }
  461. volTemp_CHARGMEASURE = ADC_RESULT_IN_MILLI_VOLTS(CHARGMEASURE);// 电池电压转换计算
  462. if (count < 10)
  463. {
  464. adc_midal += volTemp;
  465. DEBUG_LOG(0, "N %d %5d battery %d mV\r\n", count, adc_midal, volTemp);
  466. count++;
  467. return;
  468. }
  469. else if (count == 10)
  470. {
  471. Process_UpdatePeroid(hal_battery_Process, 1000);
  472. volTemp = adc_midal / count;
  473. DEBUG_LOG(0, "average battery %d mV %d\r\n", volTemp, count);
  474. count++;
  475. }
  476. battercb->adc_tp4056_power = Power_management((float)volTemp, (float)volTemp_CHARGMEASURE);
  477. #if PRINTBLE
  478. len = sprintf(buff, "%4d ,%4d ,%4d,%f\r\n", TIME_GetTicks(), volTemp, volTemp_CHARGMEASURE, battercb->adc_tp4056_power);
  479. send_bytes_client((unsigned char*)buff, len);
  480. #endif
  481. if (cprign % 600 == 0)//600
  482. {
  483. log("%4d,%4d,%4d,%2.1f,%d,%2.1f,%2.1f,%2.1f\n", TIME_GetTicks(), volTemp, volTemp_CHARGMEASURE, battercb->adc_tp4056_power, battercb->sta, battercb->P_mAh, battercb->P2, battercb->kg);
  484. logbuftemp[logbuftemp_len] = 0;
  485. // SEGGER_RTT_Write(0,logbuftemp,logbuftemp_len);
  486. Except_TxError(EXCEPT_DATA_BATTERY, logbuftemp);
  487. }
  488. cprign++;
  489. if (print_log == 1)
  490. {
  491. log("%4d,%4d,%4d,%2.1f,%d,%2.1f,%2.1f,%2.1f\n", TIME_GetTicks(), volTemp, volTemp_CHARGMEASURE, battercb->adc_tp4056_power, battercb->sta, battercb->P_mAh, battercb->P2, battercb->kg);
  492. logbuftemp[logbuftemp_len] = 0;
  493. Except_TxError(EXCEPT_DATA_BATTERY, logbuftemp);
  494. print_log = 2;
  495. }
  496. if (print_log == 2)
  497. {
  498. unsigned char length = 0;
  499. while (ringframe_peek(&battlog, logbuftemp, &length) == 0)
  500. {
  501. if (send_bytes_client((unsigned char*)logbuftemp, length) != 0)
  502. {
  503. return;
  504. }
  505. ringframe_throw(&battlog);
  506. }
  507. print_log = 0;
  508. }
  509. }
  510. //返回的电量范围: 0~100 表示电量百分比
  511. uint8_t GetBatteryPersent(void)
  512. {
  513. uint8_t persent = 0;
  514. persent = (uint8_t)(battercb->adc_tp4056_power);
  515. if (persent > 10)
  516. {
  517. persent = persent / 10;
  518. persent = persent * 10;
  519. }
  520. if (persent > 100)
  521. {
  522. persent = 100;
  523. }
  524. else if (persent <= 0)
  525. {
  526. persent = 0;
  527. }
  528. return persent;
  529. }
  530. void hal_battery_init(void)
  531. {
  532. cb_init();
  533. #ifdef PIN_BATFULL
  534. nrf_gpio_cfg_input(PIN_BATFULL, NRF_GPIO_PIN_PULLUP);
  535. #endif
  536. BLE_Client_Rx_Regist(BLE_ERR, cb_BLE_Client_ERR);
  537. Process_Start(10, "hal_battery", hal_battery_Process);
  538. }