进入11月,京城霜重露寒。
红星所集成电路实验室,一间设计室内。
三张绘图桌拼在一起,密密麻麻的草稿铺满了桌面。
烟灰缸里的烟头堆成了小山。
吕辰趴在桌上,手里拿着一支削得极细的铅笔,在一张坐标纸上画着。
他眯着眼睛,眉头拧成一团,额头上沁出细汗。
对面,诸葛彪同样趴着,拿着一模一样的铅笔,同样紧锁眉头。
钱兰坐在窗边,面前摊着一个笔记本,上面写满了o和1组成的序列。
她不时抬头看着墙上的黑板,黑板上写满了公式和推导过程,红蓝粉笔的痕迹层层叠叠,有些地方被擦掉又重写,擦了三四遍。
“这个地方不对。”
吕辰忽然开口,声音有些沙哑。
他放下铅笔,揉了揉眼睛,站起身走到黑板前。
拿起粉笔,在某一行公式上画了一个圈。
“你们看,这个pId控制器的积分项,我们用的是位置式算法。u(k)=kpe(k)+kiΣe(j)+kd*(e(k)-e(k-1))。”
他用粉笔点着那一行,“问题出在这个Σe(j)上。累加和会无限增长,如果不做限幅,迟早溢出。”
诸葛彪走过来,盯着那个公式看了几秒:“限幅肯定要做。但问题是,这个限幅阈值设多少?设太小,积分饱和,系统静差消不掉;设太大,溢出保护等于白设。”
钱兰也站起来,走到黑板前:“而且这是理论公式。我们要用数字逻辑实现,得把它离散化、量化、定点化。每一步都有精度损失。”
吕辰点点头,拿起粉笔,在黑板的空白处开始写。
“我们先做离散化。连续pId的传递函数是……”
他一边写一边讲解,粉笔在黑板上出“哒哒哒”
的脆响。
u(t)=k_pe(t)+k_iinte(t)dt+k_dfrac{de(t)}{dt}
“位置式离散化,把积分用累加代替,微分用差分代替。”
u(k)=k_pe(k)+k_isum_{j=o}^{k}e(j)de1tat+k_dfrac{e(k)-e(k-1)}{de1tat}
他写完,转过身看着两人:“现在的问题是,这些系数kp、ki、kd,还有采样周期Δt,都是浮点数。我们要用定点数实现,就得量化。”
诸葛彪皱着眉头:“量化就有量化误差。特别是ki,如果太小,量化后可能变成o,积分项就没了。”
钱兰补充道:“还有乘法。e(k)是p是量化后的8位或16位系数,乘起来就是32位甚至更多。我们要不要保留全部精度?”
吕辰沉默了几秒,然后转身继续在黑板上写。
k_p=frac{k_p_rea1}{q_p}
k_i=frac{k_i_rea1}{q_i}
k_d=frac{k_d_rea1}{q_d}
“这是量化系数。我们假设把所有系数都量化成16位定点数,q值根据动态范围选。”
他用粉笔点着那几个符号,“那么问题就变成了:乘法器的输出是32位,我们要截取哪16位送给下一级?”
诸葛彪想了想:“理论上应该保留高位。但积分项是累加的,如果每次都截掉低位,累加误差会越来越大。”
钱兰翻着她的笔记本:“我算过,如果每次截掉16位以下的4位,累加一千次,误差可能达到满量程的1%。”