第20届智能汽车竞赛中,气垫越野组别的颠簸与坎坷路况,使得传统的无悬挂编码器测速轮容易出现丢步或超步,造成测速不准,并且成本较为昂贵,容易损坏。
所以由正点原子开源的ATK-PMW3901光流模块(使用VL53L1X测量对地高度和PMW3901测量移动速度)获得灵感,设计了一款低成本的光流测速模块,并完成了在AI8051U单片机上的初始化工作,成功获取对地高度,和deltaX,deltaY移动速度。
在移植过程中,硬件部分需要重点注意1.8v电源和3.3v电源的上电时序,电容只需要尽量靠近被滤波部分,其他连线即可。软件部分需要注意PMW3901的spi通信方式,在手册中有这样一句话,“对于读操作,地址位保持不变,而对于写操作,必须将最高位置1,也就是说,如果芯片寄存器地址位0x7F,如果要去写这个寄存器,操作的地址就要变为0x7F | 0x80,也就是0xFF”所以代码中应重点如下移植修改,其他部分只需要按手册正确操作来,即可实现初始化,成本相对来说较低(40元左右),且PMW3901的适配高度范围很广,不至于紧贴地面,但实际效果还是应该添加低通滤波,并且和tof测量的对地距离进行融合,因为在不同对地距离下PMW3901的测量数据是有分辨率差异的,这点我还没有实现,大家自行开发。
- /**
- PMW3901 spi向指定寄存器写入数据
- **/
- void PMW3901_write_register(spi_index_enum spi_n,uint8 register_name,uint8 dat){
- register_name |= 0x80u;//最高位置1
- PMW3901_CS(0);
- spi_write_8bit_register(spi_n,register_name,dat);
- PMW3901_CS(1);
- }
-
- /**
- PMW3901 spi从指定寄存器读取数据
- **/
- uint8 PMW3901_read_register(spi_index_enum spi_n, uint8 register_name)
- {
- uint8 dat = 0;
- register_name &= ~0x80u;//保持不变
- PMW3901_CS(0);
- dat = spi_read_8bit_register(spi_n,register_name);
- PMW3901_CS(1);
- return dat;
- }
复制代码
硬件和软件设计并不绝对完美,仅作为思路供大家参考,附上一张实物图片。
|