Jscop软件波形打印及卡尔曼滤波测试

1.Jscop软件可以通过jlink以波形方式打印出变量。

2.安装好Segger-Jlink软件,安装好的软件如下图所示

b1c34dee5bad4d81b0fcce19f5057b68.png

在安装的目录下找到RTT源码,RTT源码路径如下图所示:

77bd528df3ce42cea21f81b067b1f739.png

3.将RTT源码添加入KEIL工程目录中,并添加头文件和初始化函数

添加头文件:  #include "SEGGER_RTT.h"

添加初始化函数:SEGGER_RTT_ConfigUpBuffer(1, "JScope_u2u2u2", buf, 2048, SEGGER_RTT_MODE_NO_BLOCK_SKIP);

初始化函数中u2u2u2 代表打印3个uint16型数据。

添加好的keil工程如下图所示。

fa574413929e42f19352ea7a2d8602cd.png

4.在工程中添加要打印的数据,

打印函数为:SEGGER_RTT_Write(1,&dd[i], 2);

4dc610b175244533bbb55bb87b5bfc90.png

5.打开Jscop软件,选择新建工程

29b3d1a967e34473ac720694c0700b04.png6.选择目标芯片型号

fff771c94f624d0295effa81456fe58b.png7.选择目标接口、速度和打印方式

这里我们选择SWD接口,因为我的jlink是隔离型的SWD接口,我们选择打印速度是单片机ADC采集速度的两倍,我这个jlink最高打印速度是9600K,购买连接如下。

/*******************************以下是广告*************************************/

https://h5.m.goofish.com/item?id=792274890020&ut_sk=1.ZYlMpI874bQDAOCP%252BewgBZVv_21407387_1715656606914.copy.detail.792274890020.2216528925411&forceFlush=1

闲鱼宝贝详情

/**********************************************************************************/

6c54e59973f340868384ba4ba851c120.png8.打印波形展示如下图:

3f57e540bf684ba685fd2c4d3e017bcc.png9.上图展示的是采集的电机的电流波形,

图中绿色为原始电机的电流波形,黄色为卡尔曼参数滤波,蓝色为卡尔曼1参数滤波。

从图中可以看出调整卡尔曼滤波Q和R的值可以得出不同的滤波效果。

卡尔曼滤波源代码如下:

typedef struct 
{
    float LastP;//上次估算协方差 初始化值为0.02
    float Now_P;//当前估算协方差 初始化值为0
    float out;//卡尔曼滤波器输出 初始化值为0
    float Kg;//卡尔曼增益 初始化值为0
    float Q;//过程噪声协方差 初始化值为0.001
    float R;//观测噪声协方差 初始化值为0.543
}KFP;//Kalman Filter parameter

//2. 
  KFP KFP_height1={0.02,0,0,0,0.01,0.8};
  KFP KFP_height ={0.00,0,0,0,0.05,0.4};

 /**
 *卡尔曼滤波器
 *@param KFP *kfp 卡尔曼结构体参数
 *   float input 需要滤波的参数的测量值(即传感器的采集值)
 *@return 滤波后的参数(最优值)
 */
 float kalmanFilter(KFP *kfp,float input)
 {
     //预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差
     kfp->Now_P = kfp->LastP + kfp->Q;
     //卡尔曼增益方程:卡尔曼增益 = k时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差)
     kfp->Kg = kfp->Now_P / (kfp->Now_P + kfp->R);
     //更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值)
     kfp->out = kfp->out + kfp->Kg * (input -kfp->out);//因为这一次的预测值就是上一次的输出值
     //更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。
     kfp->LastP = (1-kfp->Kg) * kfp->Now_P;
     return kfp->out;
 }

void main(void)
{
     uint16_t tempdate[3];
     uint8_t i;
    
    (void)ReadCurrentADVal(&tempdate[1]);//读取电机电流
        
    tempdate[0]=kalmanFilter(&KFP_height,(float)tempdate[1]);//卡尔曼滤波
    tempdate[2]=kalmanFilter(&KFP_height1,(float)tempdate[1]);//卡尔曼滤波1
        
    for(i=0;i<3;i++)        
         SEGGER_RTT_Write(1, &tempdate[i], 2);//打印波形
}

 

 

 

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值