“线程”中讨论的其它部件:UCD3138,
大家好,我正在遵循 表19中5.3 GUI 模型方程式部分的指南表格指南“UCD3138数字控制器控制原理”:标准化 PID 要注册 PID 您将列出公式如何将模拟 PID 值转换为 UCD3138A 寄存器。 唯一缺少的部分 是用于模拟 PID 值标准化的公式。 您可以 在此处分享这些信息吗?
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.
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中的变量的描述是否正确:
Tomasz,通过筛选器,所有内容都被缩放,因此最大值仍是1以下的一个 LSbit。 它们都有一些标志。 PRD 寄存器为4 ns,PWM 脉冲宽度的值为250 ps。
0时的 yn 刻度将所有内容保留为最大1的标称值,但换档将在该点向上或向下移动。
KCOMP 也扩展为1。
请注意,当过滤器输出用于周期时,由于周期寄存器的限制,它将四舍五入到4 ns。
样本过多非常复杂,您需要查看技术参考手册中的相关章节。 我认为它解释了触发滤波器的频率。 请注意,如果您尝试太快地触发过滤器,它只会忽略过滤器仍在执行时出现的触发器。 滤波器的最大速度约 为2 MHz。 当然,为了增加复杂性,您可以使用多个 DPWM 触发,我们在桥接拓扑 EVM 中执行了这一操作。 桥的每一侧至少提供一个触发器。
这需要一些挖掘,但我认为我已经得到了答案:
不幸的是,表18的计算有缺陷(表17,最可能的是表18是使用表17计算的):
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)