2_foc闭环调试_ADC电流采样与滤波及pid数据结构

8683360ff8b81a43d1d8f8c71598d5fb.png

1、ADC电流采样

上次添加了编码器获取电角度的程序,将之前开环控制的角度进行了替换,这次再将电流采样添加进来,之后就可以利用这样一个有反馈的系统进行电流环PI控制器参数调试。

       之前写过ADC+DMA电流采样的stm32库函数程序,现在来看还是有很大缺陷的:首先当电机没有转动时,ADC采样已经有了一个数值,即是一个偏置,需要后面将其减去,这块采回来的电流理论上是一个正弦波数值。另外需要将ADC采样值转换为对应单位的电流,公式是(ADC原始值-偏置)*3.3V参考电压/4096/R欧姆/放大倍数,这个还需要进一步验证。

2、  一阶低通滤波算法    

       FirstOrder_LPF_Calc 通常用于计算一阶低通滤波器(LPF)的输出,滤波器用于平滑输入信号,消除噪声,尤其是在控制系统中处理传感器信号时。一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。

一阶低通滤波的算法公式为:

              Y(n)=αX(n) + (1-α)Y(n-1) 

  α 越大,滤波器的响应越快,能更快跟踪输入变化,但噪声抑制效果较差。

    α越小,响应越慢,能更好地滤除噪声,但可能会导致信号滞后。

应用:

FirstOrder_LPF_Calc 可广泛应用于传感器信号滤波、电流环和速度环的噪声抑制等场景。在FOC(磁场定向控制)中,滤波器用于平滑电流和速度反馈信号,避免过大的噪声干扰控制系统的稳定性。

总结:

  通过调节 α,可以灵活控制滤波器的响应速度和噪声抑制效果。

  滤波器能有效减小信号中的高频噪声,同时保持低频成分的完整性。

       一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:当数据快速变化时,滤波结果能及时跟进(灵敏度优先);当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。

3、 pid参数数据结构

typedef struct    
{ 
float  Ref;          // Input: Reference input
float  Fdb;          // Input: Feedback input
float  Err;          // Variable: Error
float  Kp;           // Parameter: Proportional gain
float  Up;           // Variable: Proportional output
float  Ui;           // Variable: Integral output
float  Ud;           // Variable: Derivative output      
float  OutPreSat;    // Variable: Pre-saturated output
float  OutMax;       // Parameter: Maximum output
float  OutMin;       // Parameter: Minimum output
float  Out;          // Output: PID output
float  SatErr;       // Variable: Saturated difference
float  Ki;           // Parameter: Integral gain
float  Kc;           // Parameter: Integral correction gain
float  Kd;           // Parameter: Derivative gain
float  Up1;          // History: Previous proportional output
float  Ui_1;
float  OutF;
} PIDREG_T;

       先混个面熟,之后挨个调。 

f049a38a4a874874cfe23c29a445a941.png

下面是一个使用卡尔曼滤波器电流进行滤波的简单 Matlab 程序示例: ```matlab % 输入电流数据 current = [1.2, 1.5, 1.3, 1.7, 1.6, 2.0, 1.8]; % 初始化卡尔曼滤波器参数 initialStateEstimate = current(1); initialErrorCovariance = 1; processNoise = 0.2; measurementNoise = 0.8; % 创建卡尔曼滤波器对象 kalmanFilter = vision.KalmanFilter(... 'StateTransitionModel', 1, ... 'MeasurementModel', 1, ... 'ProcessNoise', processNoise, ... 'MeasurementNoise', measurementNoise, ... 'InitialStateEstimate', initialStateEstimate, ... 'InitialErrorCovariance', initialErrorCovariance); % 使用卡尔曼滤波器电流数据进行滤波 filteredCurrent = zeros(size(current)); for i = 1:length(current) filteredCurrent(i) = step(kalmanFilter, current(i)); end % 绘制原始数据和滤波后的结果 plot(1:length(current), current, 'b-o', 1:length(current), filteredCurrent, 'r-*'); legend('原始数据', '滤波结果'); xlabel('时间'); ylabel('电流'); ``` 这个程序使用了 Matlab 自带的 `vision.KalmanFilter` 类来实现卡尔曼滤波器。首先,我们初始化了卡尔曼滤波器的参数,包括初始状态估计、初始误差协方差、过程噪声和测量噪声。然后,创建了一个卡尔曼滤波器对象 `kalmanFilter`。接下来,通过循环遍历输入的电流数据,并使用 `step` 函数对每个数据点进行滤波,得到滤波后的结果 `filteredCurrent`。最后,绘制原始数据和滤波后的结果。 请注意,这只是一个简单的示例程序,实际应用中可能需要根据具体情况调整卡尔曼滤波器的参数和输入数据。如果你需要更复杂的滤波过程,可以参考 Matlab 的文档和示例代码进行进一步的学习和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值