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

我这里直接拿一节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 

---------------------
作者:小宏121
链接:https://bbs.21ic.com/icview-3390146-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值