今天,用户反馈:控制器设定的执行器开度、执行器显示的开度、控制器通过检测执行器反馈的4-20mA信号所换算的开度,三者各不相同。
控制器设定值与执行器显示值
当单片机采用线性关系将开度数值转为PWM信号的占空比时,
由于光耦的通断的上升,下降时间等会引起该线性关系与实际推算的不一致。
当要求的控制精度比较高时,需要提供接口供用户调整该线性关系。
线性转换关系推导
4-20mA输出电路
假设从控制器保存的开度设置值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;
提供修改过的代码给用户测试,客户反馈结果如下,大大减少误差,
补偿之后的测量结果
下一步计划
在控制器的代码中实现补偿计算算法,用户通过工控屏输入设置的开度以及执行器显示的开度。
控制器自动计算出补偿后的线性系数。
在我们控制器的输入模拟量的标定中,我们已经使用了这种方法。
这其中核心算法为最小二乘法。
来源:物联网全栈开发