进入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 \int e(t)dt + K_d \frac{de(t)}{dt}
“位置式离散化,把积分用累加代替,微分用差分代替。”
u(k) = K_p e(k) + K_i \sum_{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。”
小主,这个章节后面还有哦,请点击下一页继续阅读,后面更精彩!
喜欢四合院:我是雨水表哥请大家收藏:(m.qbxsw.com)四合院:我是雨水表哥全本小说网更新速度全网最快。