This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] UCD3138A:标准化 PID 值的公式

Guru**** 2533280 points
Other Parts Discussed in Thread: UCD3138, UCD3138A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1071479/ucd3138a-formula-for-normalized-pid-values

部件号:UCD3138A
“线程”中讨论的其它部件:UCD3138

大家好,我正在遵循  表19中5.3 GUI 模型方程式部分的指南表格指南“UCD3138数字控制器控制原理”:标准化 PID 要注册 PID 您将列出公式如何将模拟 PID 值转换为 UCD3138A 寄存器。  唯一缺少的部分 是用于模拟 PID 值标准化的公式。 您可以 在此处分享这些信息吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Thomasz,该部分的目的似乎是确定过滤器的特性,而这些特性实际上并不取决于模拟输入和输出。   

    模拟输入在其他地方有描述,但 DAC 的范围是0到1.6伏,步长为1024。  eADC (错误 ADC)是滤波器的输入,它具有6位分辨率,因此需要64步。  虽然极性可以通过控制位切换,但32为负,一为零,31为相对于 DAC 的正。   

    步长可以切换为标称1,2,4和8 mV,但滤波器输入的分辨率始终为1 MV。  电子 ADC 和滤波器之间有一个转换器,它以较低的分辨率向左移动,以保持数字输入不变。   

    过滤器的输出将发送到 DPWM。  它可用于同时设置频率,占空比或两者(对于 LLC)。

    由于输入电压为1.6 V,输出的脉冲宽度和频率为3.3 V,因此电源,eADC 和 DPWMS 之间通常有一些组件可以进行电平转换。  这些情况因系统而异。   

    这些信号的大小不会影响滤波器的特性,我认为这是归一的目的?   

    我不确定我是否正在回答您的问题。  如果不是,请尝试解释您试图找出的最终结果。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的解释,但它没有回答我的问题。 对我来说,表19似乎已经转换了所有的分辨率和范围。 同样, 表19也应该用于 将模拟 PID 值转换为 UCD3138寄存器。   当我按照 PDF 格式的计算结果操作时,我 使用表18和表19获得了不同的 PID 值。 我把 python Conde 粘贴在下面。  

    pi = 3.1415
    fc = 10E3
    fp1 = fc*10
    fz1 = fc/10
    fz2 = fc/10
    wp1 = 2*pi*fp1
    wz1 = 2*pi*fz1
    wz2 = 2*pi*fz2
    K0  = 125
    Ts  = 1
    
    Kp = K0*(wp1*wz1+wp1*wz2-wz1*wz2)/(wp1*wz1*wz2)
    Ki = K0*Ts/2
    Kd = 2*K0*(wp1-wz1)*(wp1-wz2)/wp1/wz1/wz2/(Ts*wp1+2)
    Ts  = 5E-6
    alpha = (2-Ts*wp1)/(2+Ts*wp1)
    
    print('Kp analog eq(31) = %E' % Kp)
    print('Ki analog eq(32) = %E' % Ki)
    print('Kd analog eq(33) = %E' % Kd)
    print('alpha eq(34) @fs=200kHz = %E\n' % alpha)
    
    PRD = 1250
    KCOMP = PRD
    TDPWM = 1/200E3
    NOS = 1
    #table 18
    Kp1 = K0*(PRD+1)*2**20*(fp1*(fz1+fz2)-fz1*fz2)/( 125*fp1*fz1*fz2*KCOMP )
    Ki1 = pi*K0*((PRD+1)**2)*2**24*TDPWM/( 125*KCOMP*NOS )
    Kd1 = K0*NOS*(PRD+1)*2**20*(fp1-fz1)*(fp1-fz2)/( 125*fp1*fz1*fz2*KCOMP*(16*pi*fp1*(PRD+1)*TDPWM+NOS) )
    alpha1 = 256*(NOS-16*pi*fp1*(PRD+1)*TDPWM)/(16*pi*fp1*(PRD+1)*TDPWM+NOS)
    #table 19
    Kp2 = (PRD+1)*2**20*Kp/125/KCOMP
    Ki2 = (PRD+1)*2**20*Ki/125/KCOMP
    Kd2 = (PRD+1)*2**20*Kd/125/KCOMP
    alpha2 = 256*alpha
    
    print('Kp_table_18 = %E' % Kp1)
    print('Kp_table_19 = %E' % Kp2)
    print('Ki_table_18 = %E' % Ki1)
    print('Ki_table_19 = %E' % Ki2)
    print('Kd_table_18 = %E' % Kd1)
    print('Kd_table_19 = %E' % Kd2)
    print('alpha_table_18 = %E' % alpha1)
    print('alpha_table_19 = %E\n' % alpha2)
    
    print('Kp_table_18/Kp_table_19 = %E' % (Kp1/Kp2))
    print('Ki_table_18/Ki_table_19 = %E' % (Ki1/Ki2))
    print('Kd_table_18/Kd_table_19 = %E' % (Kd1/Kd2))
    print('alpha_table_18/alpha_table_19 = %E' % (alpha1/alpha2))

    PS 在计算和模拟中,PID 的缩放方式为:PID 输出时1 = 100%占空比。 因此,输入时单位增益为1mV 错误的 P 调节器将提供0.001占空比。 当您将其转换为 ucd3138滤波器时:1个 LSB 形成前端(1mV 错误)将为您提供0.001个工作周期,P = 524.288 (对于简单的锯齿 PWM,当 KCOMP=PWM 周期时)。 1048.576 = 2^17/125,这对表19中的方程式有一定的意义。  

    PPS 类似于 PS,对于1kHz 采样率,单位模拟 KI 增益缩放系数为1.048576 (KI 在 采样率和1 LSB (1mV)输入错误时将产生0.001占空比)。 python 的示例使用200 kSPS,因此 KI 缩放系数为1.048576/200。这意味着要注册的 KI 应该为0.32768,这当然是不可能的,这意味着采样率应该小于 PWM 频率

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tomasz,您的分析对 P 因子有意义,因为它是一个直通值。  对于 KI,这可能也是正确的,因为您假设错误是非零常量。  您会期望 KI 增加到不可能的值,并体现时间和采样率。  这是因为它有历史,所以它会累积。  如果它出现持续的非零错误,它最终将溢出。   

    当然,在真实系统中,KI 的目的是调整系统中的某些偏移量,该偏移量需要在范围内。  因此,当偏移量匹配时,误差很可能会切换为负值,集成商将超冲一些偏移量,然后与偏移量匹配。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    伊恩,我知道集成商会在一段时间内饱和,这只是获得缩放系数的实验方法。 请告诉我对表18,19中的变量的描述是否正确:

    • PRD:PWM 期间寄存器
    • KCOMP:KCOMP 值(简单情况下 KCOM = PRD)
    • SC:??? FILTERCTRL YN_Scale 是什么?
    • 不是:?? DPWMCTRL2:sample_TRIG1_oversample_number of front end samples/PWM cycle??
    • TDPWM -??? LSB PWM 时间:1/250MHz/2^4 = 4ns/16位= 250 ps??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tomasz,通过筛选器,所有内容都被缩放,因此最大值仍是1以下的一个 LSbit。  它们都有一些标志。  PRD 寄存器为4 ns,PWM 脉冲宽度的值为250 ps。   

    0时的 yn 刻度将所有内容保留为最大1的标称值,但换档将在该点向上或向下移动。   

    KCOMP 也扩展为1。   

    请注意,当过滤器输出用于周期时,由于周期寄存器的限制,它将四舍五入到4 ns。   

    样本过多非常复杂,您需要查看技术参考手册中的相关章节。  我认为它解释了触发滤波器的频率。  请注意,如果您尝试太快地触发过滤器,它只会忽略过滤器仍在执行时出现的触发器。  滤波器的最大速度约 为2 MHz。  当然,为了增加复杂性,您可以使用多个 DPWM 触发,我们在桥接拓扑 EVM 中执行了这一操作。  桥的每一侧至少提供一个触发器。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这需要一些挖掘,但我认为我已经得到了答案:

    1. 表19似乎很好,夹持寄存器后的输出通常为(PRD+1)*2^(16-SC)*Kxn/125/KCOMP,但它直接位于 DPWM Filter_Duty 中,与高分辨率 PRD 相比,因此它必须增加 4位:  (PRD+1)*2^(20-SC) KxN/COMP*
    2. 表18和19中使用的值如下:
      1. PRD:PWM 期间寄存器(低分辨率)
      2. KCOMP:KCOMP 值(简单情况下 KCOM = PRD)
      3. SC:FILTERCTRL YN_STREER
      4. NOS:前端样本数/PWM 周期-可在多 个寄存器中加载
      5. TDPWM - LSB PWM 时间:1/250MHz/2^4 = 4ns/16位= 250 ps -写入演示板手册中
    3. 获取 PID 系数的正确方法:
      1. 使用 UCD3138控制理论 pdf,WP1 = WP2计算2极2零补偿器
      2. 使用(31..34)获取 PID 值表 pdf
      3. 模拟使用 ac pid 和2p2z 传输函数,并根据 pdf 中的说明调整 pid 以适合2p2z 补偿器,例如,我必须:KI*2和 KD*0.6才能匹配 AC 和相位图解
      4. 使用表19计算 ucd3138 PID 寄存器的值

    不幸的是,表18的计算有缺陷(表17,最可能的是表18是使用表17计算的):

    1. 使用表18获得的 KP 和 KI (Nos=1,KCOMP=PRD)比使用上述方法计算的值大2*PI
    2.  使用表18获得的 KD 与 使用上述方法计算的 KP 不同,但 KP 和 KI 没有恒定比率
    3. 使用 表18计算 alpha 正常

    pi = 3.1415
    fc = 10E3
    fp1 = fc*10
    fz1 = fc/10
    fz2 = fc/10
    wp1 = 2*pi*fp1
    wz1 = 2*pi*fz1
    wz2 = 2*pi*fz2
    K0  = 125
    Ts  = 1
    
    Kp = K0*(wp1*wz1+wp1*wz2-wz1*wz2)/(wp1*wz1*wz2)
    Ki = K0*Ts/2
    Kd = 2*K0*(wp1-wz1)*(wp1-wz2)/wp1/wz1/wz2/(Ts*wp1+2)
    Ts  = 5E-6
    alpha = (2-Ts*wp1)/(2+Ts*wp1)
    
    print('Kp analog eq(31) = %f' % Kp)
    print('Ki analog eq(32) = %f' % Ki)
    print('Kd analog eq(33) = %f' % Kd)
    print('alpha eq(34) @fs=200kHz = %f\n' % alpha)
    
    PRD = 1250
    KCOMP = PRD
    TDPWM = 250E-12
    NOS = 1
    SC = 0
    SmplRt = 200E3
    
    #table 18
    Kp1 = K0*(PRD+1)*2**(20-SC)*(fp1*(fz1+fz2)-fz1*fz2)/( 125*fp1*fz1*fz2*KCOMP )
    Ki1 = pi*K0*(PRD+1)**2*2**(24-SC)*TDPWM/( 125*KCOMP*NOS )
    Kd1 = K0*NOS*(PRD+1)*2**(20-SC)*(fp1-fz1)*(fp1-fz2)/( 125*fp1*fz1*fz2*KCOMP*(16*pi*fp1*(PRD+1)*TDPWM+NOS) )
    alpha1 = 256*(NOS-16*pi*fp1*(PRD+1)*TDPWM)/(16*pi*fp1*(PRD+1)*TDPWM+NOS)
    #table 19
    Kp2 = (PRD+1)*2**(20-SC)*Kp/125/KCOMP
    Ki2 = (PRD+1)*2**(20-SC)*Ki/SmplRt/125/KCOMP
    Kd2 = (PRD+1)*2**(20-SC)*Kd*SmplRt/125/KCOMP
    alpha2 = 256*alpha
    
    print('Kp_table_18 = %f' % Kp1)
    print('Kp_table_19 = %f' % Kp2)
    print('Ki_table_18 = %f' % Ki1)
    print('Ki_table_19 = %f' % Ki2)
    print('Kd_table_18 = %f' % Kd1)
    print('Kd_table_19 = %f' % Kd2)
    print('alpha_table_18 = %f' % alpha1)
    print('alpha_table_19 = %f\n' % alpha2)
    
    print('Kp_table_18/Kp_table_19 = %f' % (Kp1/Kp2))
    print('Ki_table_18/Ki_table_19 = %f' % (Ki1/Ki2))
    print('Kd_table_18/Kd_table_19 = %f' % (Kd1/Kd2))
    print('alpha_table_18/alpha_table_19 = %f' % (alpha1/alpha2))
    
    #table17 check
    #fz1t = NOS*((2048*(alpha1-256)*Kd1*Ki1+((alpha1+256)*Ki1+(alpha1-256)*Kp1)**2)**0.5+(alpha1+256)*Ki1-alpha1*Kp1+256*Kp1)/( 32*pi*(PRD+1)*TDPWM*(512*Kd1+(alpha1+256)*Kp1) )
    #fz2t = -1*NOS*((2048*(alpha1-256)*Kd1*Ki1+((alpha1+256)*Ki1+(alpha1-256)*Kp1)**2)**0.5-(alpha1+256)*Ki1+alpha1*Kp1-256*Kp1)/( 32*pi*(PRD+1)*TDPWM*(512*Kd1+(alpha1+256)*Kp1) )
    #K0t = 125*KCOMP*Ki1*NOS*2**(SC-24)/( pi*(PRD+1)**2*TDPWM)
    #fp1t = -1*(alpha1-256)*NOS/( 16*pi*(alpha1+256)*(PRD+1)*TDPWM )
    #print('fz1t = %f' % fz1t)
    #print('fz2t = %f' % fz2t)
    #print('K0t = %f' % K0t)
    #print('fp1t = %f' % fp1t)