今天,用户反馈:控制器设定的执行器开度、执行器显示的开度、控制器通过检测执行器反馈的4-20mA信号所换算的开度,三者各不相同。
当单片机采用线性关系将开度数值转为PWM信号的占空比时,
由于光耦的通断的上升,下降时间等会引起该线性关系与实际推算的不一致。
当要求的控制精度比较高时,需要提供接口供用户调整该线性关系。
假设从控制器保存的开度设置值S(真实开度*100)与PWM信号的占空比设定寄存器值D(PWM信号100%占空比对于的寄存器值为1000)的转换关系为:
D=k*S+b
而上图电路中,运放U2A输出的电压U与占空比的关系为:
U=D/1000*5
而输出电流I(mA)与电压V的关系为:
I=U/10*100=10U;
从而得到:
I=(k*S+b)/20;
当S=0时,I=4;
当S=10000时,I=20;
用excel的slope和intercept函数可以解得:
k=0.032,b=80。
因为STM32处理器没有硬件浮点数计算单元,将0.032转为*2097/65535。
得到,下述开度设定值转为占空比寄存器的C语言代码(实际数值稍有调整):
U16 lduty;
U32 data;
data = (U32)duty * 2919
data += 89;
if(data > FAMA_FRED_PERIOD){
lduty = FAMA_FRED_PERIOD;
}else{
lduty = (U16)data;
}
lduty = FAMA_FRED_PERIOD - lduty;
FAMA_A_TIMER->CCR4 = lduty;
用户提供的在整个调节调节内三组数值的测试对照表,如下图:
整个模拟量输出的线性转换关系如下图:
在这些转换关系中,只有k1, b1已知,而k2、b2以及k3、b3需要通过用户提供的测量数据推算。
如下图excel计算得到:
我们知道,如果认为执行器的模拟量输入控制的精度足够高,则用户在执行器上读得的开度值与控制器上的设定值有以下的关系:
而补偿之后,我们得到下面的关系式:
补偿的目的在于,找到新的以及使得:
进一步运算得到:
需要满足下面两个关系式:
得到:
将代码修改如下:
U16 lduty;
U32 data;
data = (U32)duty * 2917 / 65535;
data += 80; //24ms op off time
if(data > FAMA_FRED_PERIOD){
lduty = FAMA_FRED_PERIOD;
}else{
lduty = (U16)data;
}
lduty = FAMA_FRED_PERIOD - lduty;
FAMA_A_TIMER->CCR4 = lduty;
提供修改过的代码给用户测试,客户反馈结果如下,大大减少误差,
在控制器的代码中实现补偿计算算法,用户通过工控屏输入设置的开度以及执行器显示的开度。
控制器自动计算出补偿后的线性系数。
在我们控制器的输入模拟量的标定中,我们已经使用了这种方法。
这其中核心算法为最小二乘法。
页面更新:2024-05-17
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号