小宏121 发表于 2024-7-17 23:42

【英飞凌CYW20829测评】第4篇 ADC滤波实验

本帖最后由 小宏121 于 2024-7-17 23:44 编辑

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


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

****************************** DC Monitoring example started *****************************

batt_level_mv = 1400
batt_level_mv = 1399
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1399
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1399
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400

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

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





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

static float kalman_adc_old;
static float kalman_P1;
static float kalman_Q = 0.05;
static float kalman_R = 5;
static float kalman_Kg = 0;
static float kalman_P = 1;

/**
* @brief初始化或重置卡尔曼滤波器的一些参数,每次开始新的滤波循环或者有需要时调用
* @paramtemperature:NTC当前的温度值
* @retval 温度值,单位℃
* @note
*/
void refresh_kalman_filter(float temperature)
{
    kalman_adc_old = temperature;
    kalman_P1 = 0;
    kalman_Q = 0.05;
    kalman_R = 5;
    kalman_Kg = 0;
    kalman_P = 1;
}

/**
* @brief卡尔曼滤波函数,接受一个新的温度测量值并返回经过滤波处理后的温度估计值
* @paramtemperature:NTC当前的温度值
* @retval 温度值,单位℃
* @note
*/
static float kalman_filter(float temperature)
{

    float LastData;
   
    float NowData;
   
    float kalman_data;

    NowData = temperature;
   
    LastData = kalman_adc_old;
   
   
    kalman_P = kalman_P1 + kalman_Q;
   
    kalman_Kg = kalman_P / ( kalman_P + kalman_R );
   
    kalman_data = LastData + kalman_Kg * ( NowData - kalman_adc_old );
   
    kalman_P1 = ( 1 - kalman_Kg ) * kalman_P;
   
    kalman_P = kalman_P1;
   
    kalman_adc_old = kalman_data;

    return ( kalman_data );

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


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

****************************** DC Monitoring example started *****************************

batt_level_mv = 1697
batt_level_mv = 1691
batt_level_mv = 1683
batt_level_mv = 1672
batt_level_mv = 1660
batt_level_mv = 1646
batt_level_mv = 1632
batt_level_mv = 1617
batt_level_mv = 1602
batt_level_mv = 1587
batt_level_mv = 1573
batt_level_mv = 1559
batt_level_mv = 1546
batt_level_mv = 1534
batt_level_mv = 1522
batt_level_mv = 1511
batt_level_mv = 1501
batt_level_mv = 1492
batt_level_mv = 1484
batt_level_mv = 1476
batt_level_mv = 1469
batt_level_mv = 1463
batt_level_mv = 1457
batt_level_mv = 1452
batt_level_mv = 1447
batt_level_mv = 1442
batt_level_mv = 1438
batt_level_mv = 1435
batt_level_mv = 1431
batt_level_mv = 1428
batt_level_mv = 1426
batt_level_mv = 1423
batt_level_mv = 1421
batt_level_mv = 1419
batt_level_mv = 1417
batt_level_mv = 1416
batt_level_mv = 1414
batt_level_mv = 1413
batt_level_mv = 1412
batt_level_mv = 1411
batt_level_mv = 1409
batt_level_mv = 1409
batt_level_mv = 1408
batt_level_mv = 1407
batt_level_mv = 1406
batt_level_mv = 1406
batt_level_mv = 1405
batt_level_mv = 1405
batt_level_mv = 1404
batt_level_mv = 1404
batt_level_mv = 1403
batt_level_mv = 1403
batt_level_mv = 1403
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1402
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1401
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
batt_level_mv = 1400
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

学习一下
页: [1]
查看完整版本: 【英飞凌CYW20829测评】第4篇 ADC滤波实验