阅读设置

20
18

第451章 版图设计 (2/4)

+

k_d

\frac{e(k)

-

e(k-1)}{\delta

t}

他写完,转过身看着两人:“现在的问题是,这些系数kp、ki、kd,还有采样周期Δt,都是浮点数。我们要用定点数实现,就得量化。”

诸葛彪皱着眉头:“量化就有量化误差。特别是ki,如果太小,量化后可能变成0,积分项就没了。”

钱兰补充道:“还有乘法。e(k)是16位有符号数,kp是量化后的8位或16位系数,乘起来就是32位甚至更多。我们要不要保留全部精度?”

吕辰沉默了几秒,然后转身继续在黑板上写。

k_p

=

\frac{k_p\_real}{q_p}

k_i

=

\frac{k_i\_real}{q_i}

k_d

=

\frac{k_d\_real}{q_d}

“这是量化系数。我们假设把所有系数都量化成16位定点数,q值根据动态范围选。”他用粉笔点着那几个符号,“那么问题就变成了:乘法器的输出是32位,我们要截取哪16位送给下一级?”

诸葛彪想了想:“理论上应该保留高位。但积分项是累加的,如果每次都截掉低位,累加误差会越来越大。”

钱兰翻着她的笔记本:“我算过,如果每次截掉16位以下的4位,累加一千次,误差可能达到满量程的1%。”

“1%?”吕辰皱起眉头,“电机控制的精度要求是微米级,1%的误差意味着几十微米的偏移。不行,太大了。”

三人沉默了。

办公室里只有墙上挂钟的“滴答”声,还有窗外偶尔传来的蝉鸣。

过了好一会儿,吕辰忽然说:“我们换个思路。”

他走到黑板前,把刚才写的公式全都擦掉。

“传统的pid,是用乘法器实现。但乘法器太占面积。我们能不能不用乘法?”

诸葛彪愣了一下:“不用乘法?那怎么实现比例、积分、微分?”

吕辰拿起粉笔,在黑板上画了一个表格。

“用查表。把e(k)当作地址,kpe(k)的结果事先算好,存在rom里。来一个e(k),直接读rom,得到kpe(k)。”

钱兰眼睛亮了:“查表式乘法器?”

“对。”吕辰继续画,“kiΣe(j)也可以查表。Σe(j)是累加和,范围可控,我们可以事先算好不同累加和对应的ki积分值,存在另一片rom里。”

诸葛彪皱着眉头:“那rom的容量得有多大?e(k)是16位,如果直接寻址,2的16次方是。每个结果存16位,就是128k字节。两片rom就是256k。”

吕辰点点头:“所以我们要压缩地址线。e(k)不需要全部16位,可以只取高8位或高10位。损失一点精度,换来rom容量指数级下降。”

钱兰在笔记本上飞快地算着:“如果取高8位,地址线8位,深度256。每个结果存16位,就是512字节。三片rom加起来也就1.5k字节。”

诸葛彪若有所思:“用面积换时间?rom比乘法器占地方大得多,但速度快,一个读周期就能出结果。”

“对。”吕辰说,“我们现在的瓶颈不是面积。五微米工艺,四十平方毫米,晶体管数量上限大概是五千个。乘法器要用几百个管子,rom虽然面积大,但一个比特就是一个管子,1.5k字节就是12k比特,也就是一万二千个管子。”

他顿了顿:“但rom的结构规则,阵列排布,布图密度高。实际占的面积,可能比乘法器大不了多少。”

钱兰补充道:“而且rom是数字电路,没有模拟电路的那些温漂、失调问题。工艺偏差对rom的影响也小,只要管子能导通或关断就行。”

诸葛彪想了想,问:“那积分项的累加器怎么办?”

吕辰在黑板上又画了一个框图:“累加器还是要保留。但累加器的输出Σe(j),我们也可以做截断。取高12位,或者高10位,作为ki-rom的地址。”

他放下粉笔,看着两人:“这个方案的思路是:用查表代替乘法,用截断压缩地址线,用rom的大容量换取逻辑的简化。”

诸葛彪沉默了几秒,然后点点头:“可以试试。至少比硬着头皮做乘法器靠谱。”

钱兰已经开始在笔记本上画新的框图了:“那我们就这么定。pid控制器分成三块:比例项查表、积分项累加+查表、微分项差分+查表。三路结果再加法器相加,限幅后输出。”

吕辰走回绘图桌边,看着那些散落的草稿纸:“现在的问题是,这三张表的数据怎么算。kp、ki、kd的量化值,e(k)和Σe(j)的动态范围,都要先确定。”