打印
[AIROC™ 蓝牙]

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

[复制链接]
561|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小宏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;

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]  初始化或重置卡尔曼滤波器的一些参数,每次开始新的滤波循环或者有需要时调用
* @param  temperature: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;
}

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]  卡尔曼滤波函数,接受一个新的温度测量值并返回经过滤波处理后的温度估计值
* @param  temperature: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的配置里边本身就有一定的滤波能力

使用特权

评论回复
5
xiaoqizi| | 2024-7-18 13:56 | 只看该作者
这么稳定的信号为什么一开始采集的时候波动那么大呢

使用特权

评论回复
6
wowu| | 2024-7-18 21:41 | 只看该作者
为什么滤波的时候还需要一个稳定的时间呢

使用特权

评论回复
7
renzheshengui| | 2024-7-18 22:13 | 只看该作者
其实这么稳定的电压 这么好的环境 完全可以不用滤波的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

0

粉丝