[AIROC™ 蓝牙] 【英飞凌CYW20829测评】第4篇 ADC滤波实验

[复制链接]
 楼主| 小宏121 发表于 2024-7-17 23:42 | 显示全部楼层 |阅读模式
<
本帖最后由 小宏121 于 2024-7-17 23:44 编辑

我这里直接拿一节7号电池做实验,电池正极接到P3.5引脚,负极接到开发板的GND


首先先看看官方例程 “DC_Monitoring” 的采样效果
可以看到没有经过滤波的程序,得到的结果有很轻微的波动

  1. ****************************** DC Monitoring example started *****************************

  2. batt_level_mv = 1400
  3. batt_level_mv = 1399
  4. batt_level_mv = 1400
  5. batt_level_mv = 1400
  6. batt_level_mv = 1400
  7. batt_level_mv = 1400
  8. batt_level_mv = 1400
  9. batt_level_mv = 1399
  10. batt_level_mv = 1400
  11. batt_level_mv = 1400
  12. batt_level_mv = 1400
  13. batt_level_mv = 1400
  14. batt_level_mv = 1400
  15. batt_level_mv = 1400
  16. batt_level_mv = 1400
  17. batt_level_mv = 1400
  18. batt_level_mv = 1399
  19. batt_level_mv = 1400
  20. batt_level_mv = 1400
  21. batt_level_mv = 1400
  22. batt_level_mv = 1400
  23. batt_level_mv = 1400


下面看看经过滤波后的效果

先复制一个官方例程 “DC_Monitoring”,改名为"my_adc_test"





下面是卡尔曼滤波算法的程序

  1. static float kalman_adc_old;
  2. static float kalman_P1;
  3. static float kalman_Q = 0.05;
  4. static float kalman_R = 5;
  5. static float kalman_Kg = 0;
  6. static float kalman_P = 1;

  7. /**
  8. * [url=home.php?mod=space&uid=247401]@brief[/url]  初始化或重置卡尔曼滤波器的一些参数,每次开始新的滤波循环或者有需要时调用
  9. * @param  temperature:NTC当前的温度值
  10. * @retval 温度值,单位℃
  11. * @note
  12. */
  13. void refresh_kalman_filter(float temperature)
  14. {
  15.     kalman_adc_old = temperature;
  16.     kalman_P1 = 0;
  17.     kalman_Q = 0.05;
  18.     kalman_R = 5;
  19.     kalman_Kg = 0;
  20.     kalman_P = 1;
  21. }

  22. /**
  23. * [url=home.php?mod=space&uid=247401]@brief[/url]  卡尔曼滤波函数,接受一个新的温度测量值并返回经过滤波处理后的温度估计值
  24. * @param  temperature:NTC当前的温度值
  25. * @retval 温度值,单位℃
  26. * @note
  27. */
  28. static float kalman_filter(float temperature)
  29. {

  30.     float LastData;
  31.    
  32.     float NowData;
  33.    
  34.     float kalman_data;

  35.     NowData = temperature;
  36.    
  37.     LastData = kalman_adc_old;
  38.    
  39.    
  40.     kalman_P = kalman_P1 + kalman_Q;
  41.    
  42.     kalman_Kg = kalman_P / ( kalman_P + kalman_R );
  43.    
  44.     kalman_data = LastData + kalman_Kg * ( NowData - kalman_adc_old );
  45.    
  46.     kalman_P1 = ( 1 - kalman_Kg ) * kalman_P;
  47.    
  48.     kalman_P = kalman_P1;
  49.    
  50.     kalman_adc_old = kalman_data;

  51.     return ( kalman_data );

  52. }

在官方例程这里加上滤波算法


滤波稳定下来后,测量到的电池电压保持1.4V,基本没有波动
如果想要快点到目标值,可以适当改小R值,如果改得太小会波动变化很大

  1. ****************************** DC Monitoring example started *****************************

  2. batt_level_mv = 1697
  3. batt_level_mv = 1691
  4. batt_level_mv = 1683
  5. batt_level_mv = 1672
  6. batt_level_mv = 1660
  7. batt_level_mv = 1646
  8. batt_level_mv = 1632
  9. batt_level_mv = 1617
  10. batt_level_mv = 1602
  11. batt_level_mv = 1587
  12. batt_level_mv = 1573
  13. batt_level_mv = 1559
  14. batt_level_mv = 1546
  15. batt_level_mv = 1534
  16. batt_level_mv = 1522
  17. batt_level_mv = 1511
  18. batt_level_mv = 1501
  19. batt_level_mv = 1492
  20. batt_level_mv = 1484
  21. batt_level_mv = 1476
  22. batt_level_mv = 1469
  23. batt_level_mv = 1463
  24. batt_level_mv = 1457
  25. batt_level_mv = 1452
  26. batt_level_mv = 1447
  27. batt_level_mv = 1442
  28. batt_level_mv = 1438
  29. batt_level_mv = 1435
  30. batt_level_mv = 1431
  31. batt_level_mv = 1428
  32. batt_level_mv = 1426
  33. batt_level_mv = 1423
  34. batt_level_mv = 1421
  35. batt_level_mv = 1419
  36. batt_level_mv = 1417
  37. batt_level_mv = 1416
  38. batt_level_mv = 1414
  39. batt_level_mv = 1413
  40. batt_level_mv = 1412
  41. batt_level_mv = 1411
  42. batt_level_mv = 1409
  43. batt_level_mv = 1409
  44. batt_level_mv = 1408
  45. batt_level_mv = 1407
  46. batt_level_mv = 1406
  47. batt_level_mv = 1406
  48. batt_level_mv = 1405
  49. batt_level_mv = 1405
  50. batt_level_mv = 1404
  51. batt_level_mv = 1404
  52. batt_level_mv = 1403
  53. batt_level_mv = 1403
  54. batt_level_mv = 1403
  55. batt_level_mv = 1402
  56. batt_level_mv = 1402
  57. batt_level_mv = 1402
  58. batt_level_mv = 1402
  59. batt_level_mv = 1402
  60. batt_level_mv = 1401
  61. batt_level_mv = 1401
  62. batt_level_mv = 1401
  63. batt_level_mv = 1401
  64. batt_level_mv = 1401
  65. batt_level_mv = 1401
  66. batt_level_mv = 1401
  67. batt_level_mv = 1401
  68. batt_level_mv = 1401
  69. batt_level_mv = 1401
  70. batt_level_mv = 1400
  71. batt_level_mv = 1400
  72. batt_level_mv = 1400
  73. batt_level_mv = 1400
  74. batt_level_mv = 1400
  75. batt_level_mv = 1400
  76. batt_level_mv = 1400
  77. batt_level_mv = 1400
  78. batt_level_mv = 1400
  79. batt_level_mv = 1400
  80. batt_level_mv = 1400
  81. batt_level_mv = 1400
  82. batt_level_mv = 1400
  83. batt_level_mv = 1400
  84. batt_level_mv = 1400
  85. batt_level_mv = 1400
  86. batt_level_mv = 1400
  87. batt_level_mv = 1400
  88. batt_level_mv = 1400
  89. batt_level_mv = 1400
  90. batt_level_mv = 1400
  91. batt_level_mv = 1400
  92. batt_level_mv = 1400
  93. batt_level_mv = 1400
  94. batt_level_mv = 1400
  95. batt_level_mv = 1400
  96. batt_level_mv = 1400
  97. batt_level_mv = 1400
  98. batt_level_mv = 1400
  99. batt_level_mv = 1400
  100. batt_level_mv = 1400
  101. batt_level_mv = 1400
  102. batt_level_mv = 1400
  103. batt_level_mv = 1400
  104. batt_level_mv = 1400
  105. batt_level_mv = 1400
  106. batt_level_mv = 1400
  107. batt_level_mv = 1400
  108. batt_level_mv = 1400
  109. batt_level_mv = 1400
  110. batt_level_mv = 1400
  111. batt_level_mv = 1400
  112. batt_level_mv = 1400
  113. batt_level_mv = 1400
  114. batt_level_mv = 1400
  115. batt_level_mv = 1400
  116. batt_level_mv = 1400
  117. batt_level_mv = 1400
  118. batt_level_mv = 1400
  119. batt_level_mv = 1400



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
tpgf 发表于 2024-7-18 12:00 | 显示全部楼层
这是一种通过软件进行滤波的方式是吗
paotangsan 发表于 2024-7-18 12:40 | 显示全部楼层
对于不同的干扰源 其实我们使用的滤波方式应该是不一样的
wakayi 发表于 2024-7-18 13:18 | 显示全部楼层
在adc的配置里边本身就有一定的滤波能力
xiaoqizi 发表于 2024-7-18 13:56 | 显示全部楼层
这么稳定的信号为什么一开始采集的时候波动那么大呢
wowu 发表于 2024-7-18 21:41 | 显示全部楼层
为什么滤波的时候还需要一个稳定的时间呢
renzheshengui 发表于 2024-7-18 22:13 | 显示全部楼层
其实这么稳定的电压 这么好的环境 完全可以不用滤波的
原来是wjc 发表于 2025-2-28 23:25 | 显示全部楼层
为了减少这种波动,常用的方法是添加适当的滤波器或做硬件上的去耦处理。
略略u 发表于 2025-4-29 13:02 | 显示全部楼层
官方例程 “DC_Monitoring” 的采样效果
真的问题不大 发表于 2025-4-30 16:17 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部