卡尔曼滤波的C/CPP版本
说明文档
使用到的部分ip
完整的工程文件
vivado版本:2021.02 ML版
rtl代码
rtl的testbench代码
部分信号的时序图(还没整理好)
debug过程中用到的脚本和记录的数据,其中data_gen.py
是用来生成tb测试数据的,checksum_test.py
是用来验证匿名上位机协议checksum的,data_process.py
是用于uart数据帧对齐的。
打开工程后的top层次结构如下:
其中keyboard和dynamic_digital是自己写的ip,分别用于键盘输入,数码管动态显示,工程里也包括了。
本项目仅计算了ROLL和PITCH两个角度,没有计算YAW角,YAW默认为0。
基于FPGA的MPU6050姿态解算(1) | DOA's Blog (floral.github.io)
input clk_in, //50m clk in
input rst_n,
input [3:0] col_in, // 4x4键盘矩阵的列输入
output [3:0] row_out, // 4x4键盘矩阵的行输出
output scl, // i2c scl
inout sda, // i2c sda
input rx, // uart rx, 本工程没用,不连也行
output tx, // uart tx
output [7:0] seg_out, // 单个数码管段码输出
output [5:0] dig_out // 不同数码管有效/使能输出
在原版的IP基础上,增加了i2c_data_num
、i2c_ack[6]
信号,前者表示I2C连续写入/读取的数据量(以字节为单位),后者标志主机发送STOP完成。使用的时候只需在给i2c_config
赋值的同时给i2c_data_num
赋值即可。
完成指定数据量的写入/读取之后,i2c_ack[6]
信号会被拉高。
该模块是一个有四个状态的状态机:WAIT
、CONFIG
、CALIBRATE
、CALCULATE
。
控制整个流程的不同状态切换。
在CALIBRATE
状态下,I2C是连续读取的,即I2C_Config
不切换;在CALCULATE
状态下,I2C的读取频率是由mpu_read_timer
决定的,默认频率是800Hz(是由UART 115200速率经过计算后的最合适频率),每出现一次timer_tick
,I2C_Config
才切换为I2C_Continuous_Read_Byte
状态,i2c_ack_6_pos_in
被拉高后则进入WAIT
状态。
本项目使用的上位机是<匿名上位机>,所以协议使用的也是该上位机的协议。
上位机下载地址: 匿名科创] (anotc.com)
注意该模块中有一个需要读入的atan数据文件atan.data
在project/vivado/Pose_Detection_With_Kalman_Filter/C_model/
下。
uart速率默认为115200