首先,确定项目整体框架:关键器件、各个模块、电源和主板PCB;然后使用Quartus植入RSIC-V软核,设置各种外设:I2C、PWM、HC-SR04、UART、ENCODER,融合直流电机、姿态传感器信息以及超声波模块,使用卡尔曼滤波以及PID算法,调整参数,使小车能够平稳运行并实现避障,并使得小车能和手机电脑等电子设备终端通信,实现远程遥控。
1.电源模块:
a.原理图:电源模块原理图.pdf
b.PCB版图:电源模块pcb版图1.pdf
2.主板
a.原理图:project.pdf
b.PCB版图:主板pcb版图1.pdf
1.电源板功能调试:
a.电池接口接错了,易造成短路;
b.电源板应能输出一路5V的电压和四路12V的电压,
c.检查电容极性是否接反。
2.主板功能调试:
a.各个模块的电源和地是否短路;
b.电源板供电给各个模块是否正常。
1.问题:
a.在电源模块中,电池接口接错了;
b.在主板中,12V的电源线画太细了,可能不足以支撑5A的电流;
2.解决办法:
a.重新绘制电源模块的PCB版图,注意电池接口的极性;
b.重新绘制主板的PCB版图,把电源线加粗;
在有电池接口的版图设计时,需要注意三座接口的管脚问题,注意电源与地别短路。
各个模块代码汇总如下 software.zip
通过编写好的I2C接口,读取MPU6050的数据。首先在MPU6050的相关寄存器写入数据,初始化MPU6050寄存器。然后按照I2C协议通过指定的寄存器读取的三轴加速度以及角 速度数据。
在C++语言里代码如下:
在电机固定转速下,编码器会输出固定的脉冲数,通过读取脉冲数来读取速度。 在Verilog里代码如下:
HC-SR04模块会隔一段时间发送一个trig信号,触发超声波的发送。然后会接到一段高电平的信号,高电平的持续时间与前方障碍物的距离成正比,以此计算前方距离远近。 在Verilog里代码如下:
ADC会接收到电源电压的模拟信号,然后转化为数字信号发送给FPGA,我们将转化的数据显示在OLED屏上。 在Verilog里代码如下:
HC-05芯片通过UART接口与FPGA实现远程通信。
由于小车运行期间,MPU6050芯片提供的数据夹杂有较严重的噪音,在芯片处理静止状态时数据摆动都可能超过2%。除了噪音,各项数据还会有偏移的现象,也就是说数据并不是围绕静止工作点摆动, 因此需要通过滤波算法消除噪音。对于夹杂了大量噪音的数据,卡尔曼滤波器的效果无疑是最好的。一个卡尔曼滤波器接受一个轴上的角度值、角速度值以及时间增量,估计出一个消除噪音的角度值。跟据当前的角度值和上一轮估计的角度值,以及这两轮估计的间隔时间,还可以反推出消除噪音的角速度。我们使用滤波过后的角度和角速度来作为PD控制里的角速度。(记住输入的角度值、角速度值的方向一定要匹配,否则会得到错误的滤波数据)。
所谓PID控制,就是对偏差进行比例、积分和微分的控制。PID由3个单元组成,分别是比例(P)单元、积分(I)单元、微分(D)单位。在工程实践中,一般P是必须的,所以衍生出许多组合的PID控制器,如PD、PI、PID等。
直立车参考方案_飞思卡尔官网文件_经典_.pdf
经过实验,通过搭建在FPGA上的RSIC-V的软核处理器以及添加的各种外设,最后能让小车平稳运行,加减速,转弯,以及遥控。基本能实现预期的功能。
一个多月的培训终于结束了,感觉收获很多。仔细回味,有很多做的不足和需要改进的地方。