芯片爱好者小王
从系统设计角度给点建议。首先明确,<10ms的延迟对于这个应用是相对宽松的,合理设计很容易达到。重点考虑稳定性和可调试性。1. 时钟规划:建议用一个外部晶振产生主时钟(比如50MHz),用FPGA的MMCM/PLL生成摄像头像素时钟(比如24MHz)和可能需要的更高频率的处理时钟。确保时钟网络约束正确。2. 图像预处理:二值化是关键,阈值不能写死。最好通过一个UART或SPI接口,能从单片机或PC实时调整阈值并存入寄存器,方便现场调车。3. 中线提取算法硬件化:别想太复杂。在高速下,车只需要知道近处赛道的趋势。可以只选取图像底部固定的N行(例如,从第200行到第240行),在每一行中,从左到右扫描找到第一个和最后一个白点(假设黑底白线),取它们的中心作为该行的中心点,然后对N行的中心点取平均或加权平均,得到最终的中线偏差。这个逻辑用状态机很容易实现。4. 控制输出:PID计算可以用定点数,在FPGA里就是一些乘加运算。注意输出PWM的频率和分辨率要与你的电机驱动匹配。常见坑:跨时钟域(CDC)问题无处不在。摄像头数据进入你的处理时钟域、控制周期与图像处理周期不同步,这些地方都必须用可靠的同步器(如两级触发器)或异步FIFO。另外,片上存储(BRAM)是宝贵资源,合理分配行缓冲的大小。最后,留出调试接口,比如把计算出的中线偏差值通过IO口输出用示波器看,或者把二值化图像通过VGA显示出来,调车时会救命。
