进入11月,京城霜重露寒。
红星所集成电路实验室,一间设计室内。
三张绘图桌拼在一起,密密麻麻的草稿铺满了桌面。
烟灰缸里的烟头堆成了小山。
吕辰趴在桌上,手里拿着一支削得极细的铅笔,在一张坐标纸上画着。
他眯着眼睛,眉头拧成一团,额头上沁出细汗。
对面,诸葛彪同样趴着,拿着一模一样的铅笔,同样紧锁眉头。
钱兰坐在窗边,面前摊着一个笔记本,上面写满了0和1组成的序列。
她不时抬头看着墙上的黑板,黑板上写满了公式和推导过程,红蓝粉笔的痕迹层层叠叠,有些地方被擦掉又重写,擦了三四遍。
“这个地方不对。”吕辰忽然开口,声音有些沙哑。
他放下铅笔,揉了揉眼睛,站起身走到黑板前。
拿起粉笔,在某一行公式上画了一个圈。
“你们看,这个PID控制器的积分项,我们用的是位置式算法。u(k) = Kpe(k) + KiΣe(j) + Kd*(e(k)-e(k-1))。”他用粉笔点着那一行,“问题出在这个Σe(j)上。累加和会无限增长,如果不做限幅,迟早溢出。”
诸葛彪走过来,盯着那个公式看了几秒:“限幅肯定要做。但问题是,这个限幅阈值设多少?设太小,积分饱和,系统静差消不掉;设太大,溢出保护等于白设。”
钱兰也站起来,走到黑板前:“而且这是理论公式。我们要用数字逻辑实现,得把它离散化、量化、定点化。每一步都有精度损失。”
吕辰点点头,拿起粉笔,在黑板的空白处开始写。
“我们先做离散化。连续PID的传递函数是……”
他一边写一边讲解,粉笔在黑板上发出“哒哒哒”的脆响。
u(t) = K_p e(t) + K_i i)dt + K_d frac{de(t)}{dt}
“位置式离散化,把积分用累加代替,微分用差分代替。”
u(k) = K_p e(k) + K_i su_{j=0}^{k} e(j) Delta T + 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)的动态范围,都要先确定。”
诸葛彪也走过来:“先做数学建模。给定电机的参数,比如转动惯量、阻尼系数、电磁时间常数,然后用经典PID整定方法,算出一组理论Kp、Ki、Kd。”
钱兰补充道:“然后根据量化方案,反推量化后的Q值,确保不溢出,精度尽量高。”
“就这么干。”吕辰拿起铅笔,在新的坐标纸上开始写,“我先列一个任务清单……”
他刚写下第一行字,忽然停住了。
他看着那些草稿纸,看着黑板上那些被擦掉又重写的公式,看着烟灰缸里堆成小山的烟头,忽然笑了起来。
诸葛彪愣了一下:“笑什么?”
吕辰摇摇头:“我在想,咱们这是在干什么?为了省一个乘法器,折腾了整整三天。又是离散化、又是量化、又是查表。”
诸葛彪没听出他话里的深意,只是叹了口气:“可不是嘛。咱们这活儿,跟绣花似的。我外婆绣了一辈子花,到老眼睛都花了。我这还没到三十,眼睛就快瞎了。”
钱兰噗嗤一声笑了:“诸葛,你这话要是让你外婆听见,非得拿拐棍打你不可。绣花是绣花,咱们这是画版图,能一样吗?”
“怎么不一样?”诸葛彪指着桌上那些坐标纸,“你看这线条,一根一根的,粗细都要均匀,间距都要一致。绣花也不过如此了。”
吕辰笑着摇摇头,继续写他的任务清单。
窗外的阳光从西斜变成落山,又从落山变成暮色。
办公室里的灯亮了。
三人谁也没动,继续趴在桌上,写写画画。
……
接下来的三天,他们就在一遍一遍的查错中度过。
第一遍,诸葛彪查,用红笔在图上标注可能的错误。
第二遍,吕辰查,用蓝笔在图上标注不同的意见。