用到的通信手段:I2C,串口;
用到的模块:陀螺仪mpu6050,蓝牙模块HC-05(用这个是因为我电脑抽风了,识别不到串口,明明arduino就可以串口下载的……所以用手机当上位机);
用到的单片机:stm32f103rct6;
用到的驱动库:(mpu6050)链接:https://pan.baidu.com/s/1hXgFjKHruVZ0s-BogRg7Sg?pwd=8888
提取码:8888
烧录方式:st-link;
话不多说,开整!
硬件连接图:
stm32cubemx配置:
配置调试器~
配置时钟源~
配置I2C~
配置串口~
配置时钟频率~
完善项目名,开发工具,以及自动生成.h选项~
最后生成代码~
然后打开项目所在文件夹
·
到这一步,前面盘里面的mpu6050驱动库就派上用场了。
我们把mpu6050驱动库里面的.c文件夹的东西复制黏贴到cubemx生成的Src文件夹里面,把驱动库里面的.h文件夹的东西复制黏贴到cubemx生成的 inc 文件夹里面。
然后就是keil5的事情了。
打开文件,先编译一遍,确保生成的文件没问题。
然后添加刚刚加进去的驱动库。
编译一遍,然后如果出现这个问题,就去把mpu6050.c文件里面的hi2c1改成你开启的i2cx
在main.c里面添加头文件
#include "mpu6050.h"
#include "inv_mpu.h"
#include <stdio.h>
在主函数的循环前添加下面这段代码,相当于开启mpu6050
while(mpu_dmp_init()){
HAL_Delay(200);
}
然后就是定义变量,要想读取角度值我们需要找到对应的原函数,然后在主函数里面写出来
原函数在inv_mpu.c的最后面,有相应的文字注释。
是一个float型+指针作为输入的函数,所以我们要定义的变量也应该是float型。
另外,我们再定义个字符串来存储返回来的形参的值。
float pitch,roll,yaw;
uint8_t date[20];
在主函数里面添加读取角度的函数
并掏出我们的sprintf把反馈回来的值打印在字符串date里面
并用串口发送给上位机
翻译过来也就是下面几行代码:
mpu_dmp_get_data(&pitch,&roll,&yaw);
sprintf((char*)date,"pitch :%.2f\n",pitch);
HAL_UART_Transmit(&huart2,date,sizeof(date),1000);
sprintf((char*)date,"pitch :%.2f\n",roll);
HAL_UART_Transmit(&huart2,date,sizeof(date),1000);
sprintf((char*)date,"pitch :%.2f\n",yaw);
HAL_UART_Transmit(&huart2,date,sizeof(date),1000);
HAL_Delay(1000);
写在主函数里面
编译保存~接着就是打开手机连接蓝牙(电脑就是直接打开串口助手调好波特率)
烧录,按复位键
(温馨提示:运行前拜一拜单片机有奇效哦~(滑稽脸))
最终效果,就是这个样子了。
感谢各位观看,如果文章有错误还请大家斧正(○| ̄|_,orz,囧rz);
VID_20220810_210422
好累_(´ཀ`」 ∠)_ ,第一次写,感觉比写程序还要费脑细胞……
让本来就不多的脑细胞更雪上加霜了……