模拟量输出的线性转换
今天,用户反馈:控制器设定的执行器开度、执行器显示的开度、控制器通过检测执行器反馈的4-20mA信号所换算的开度,三者各不相同。
1fb1d362b3a0454eb689c0ccb3e4ddf8?from=pc.jpg
控制器设定值与执行器显示值

当单片机采用线性关系将开度数值转为PWM信号的占空比时,
由于光耦的通断的上升,下降时间等会引起该线性关系与实际推算的不一致。
当要求的控制精度比较高时,需要提供接口供用户调整该线性关系。

线性转换关系推导
bfe9810dff4a4ea984324b843e6aaae8?from=pc.jpg
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语言代码(实际数值稍有调整):
  1. U16 lduty;
  2. U32 data;
  3. data = (U32)duty * 2919
  4. data += 89;
  5. if(data > FAMA_FRED_PERIOD){
  6.         lduty = FAMA_FRED_PERIOD;
  7. }else{
  8.         lduty = (U16)data;
  9. }
  10. lduty = FAMA_FRED_PERIOD - lduty;
  11. FAMA_A_TIMER->CCR4 = lduty;

误差补偿算法推导
用户提供的在整个调节调节内三组数值的测试对照表,如下图:
54c5bcc04279453aabe1ebbe68acf232?from=pc.jpg
客户提供的测量值

整个模拟量输出的线性转换关系如下图:
c0892c3c86ea48b8872d6c663cbdb4d2?from=pc.jpg
线性转换关系

在这些转换关系中,只有k1, b1已知,而k2、b2以及k3、b3需要通过用户提供的测量数据推算。
如下图excel计算得到:
fca009ba04544a96a5ea9e3b9a70cec3?from=pc.jpg
各线性关系推导

我们知道,如果认为执行器的模拟量输入控制的精度足够高,则用户在执行器上读得的开度值与控制器上的设定值有以下的关系:
a3e040f890424b329a1123624f1746f7.jpg
而补偿之后,我们得到下面的关系式:
84e9a27ac51f47e693cfd2e593f057ae.jpg
补偿的目的在于,找到新的 148dba214d5c4d2a9db4110184eb377d.jpg 以及 8fae517ecf9b43879061635eb3df86a5.jpg 使得:
84e9a27ac51f47e693cfd2e593f057ae.jpg de85eb1d4f46498b8e90cf3409d73610.jpg
进一步运算得到:
8b3b5ad0ed7a470c87cca7cd59c509fb.jpg
需要满足下面两个关系式:
36fa99761c9c47baa1b6f9616cd2d72e.jpg
c060386010ec4db7820a4be11a0174d9.jpg
得到:
78a2b1a5050e4160ae1867aeb5aba8b6.jpg
c41c1a257e474d6ba52568ff290ab5b2.jpg
9174a6c98cfd41f5b46a3269d33a8b7f?from=pc.jpg
补偿系数计算过程

将代码修改如下:
  1. U16 lduty;
  2. U32 data;
  3. data = (U32)duty * 2917 / 65535;
  4. data += 80; //24ms op off time
  5. if(data > FAMA_FRED_PERIOD){
  6.                 lduty = FAMA_FRED_PERIOD;
  7. }else{
  8.                 lduty = (U16)data;
  9. }       
  10. lduty = FAMA_FRED_PERIOD - lduty;
  11. FAMA_A_TIMER->CCR4 = lduty;

提供修改过的代码给用户测试,客户反馈结果如下,大大减少误差,
425d93035ae14633930a05d4ab8b408d?from=pc.jpg
补偿之后的测量结果


下一步计划
在控制器的代码中实现补偿计算算法,用户通过工控屏输入设置的开度以及执行器显示的开度。
控制器自动计算出补偿后的线性系数。
在我们控制器的输入模拟量的标定中,我们已经使用了这种方法。
这其中核心算法为最小二乘法。


来源:物联网全栈开发