941浏览
查看: 941|回复: 0

[官方教程] K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪

[复制链接]
本帖最后由 猪百岁 于 2021-3-12 17:27 编辑

K210入门-裸机开发(十)之IIC协议_MPU6050六轴陀螺仪

开发板:K210 AIRV R3版 widora

开发环境:kendryte IDE 官方的

必须的参考文档:Standalone SDK编程指南v0.5.0,以及widora的原理图

1. 新建文件夹11my_code_mpu6050

FriMarch-202103122310..png
礼物 + 地球

FriMarch-202103127959..png

库和实例都没有 IIC 所以只能自己写, 我们这里用spi的例程来改

FriMarch-202103124559..png

安装依赖

FriMarch-202103121393..png
清理 + 构建

FriMarch-202103122065..png

只保留这几个

FriMarch-202103125118..png
查看原理图

FriMarch-202103125349..png

FriMarch-202103126629..png

FriMarch-202103122927..png

SDA -> IO10

SCL -> IO9

先配置

FriMarch-202103126900..png

FriMarch-202103129526..png

2.开始写代码

I2C在第15章

FriMarch-202103128203..png

加个i2c.h 头文件 然后安装依赖, 再清理 + 构建

FriMarch-202103124423..png

按举例来改

FriMarch-202103127078..png

移植代码 参考野火的MPU6050 F103开发板 不参考他的了 太多了

现在参考 买模块附带的51程序

FriMarch-202103125508..png

复制宏定义过去

FriMarch-202103123860..png

FriMarch-202103127102..png

然后移植过去K210

FriMarch-202103124957..png

继续移植

FriMarch-202103124810..png
移植到K210

FriMarch-202103127810..png

继续移植

FriMarch-202103124187..png

然后一条龙看看(清理+构建+下载)

这边修正一下 报错了

FriMarch-202103122388..png

FriMarch-202103127010..png
串口没输出., 配置下

FriMarch-202103123069..png

串口还是没输出 换个串口

FriMarch-202103121617..png

打开其他串口助手能读了

但数据是全0,我去检查下

我TM的拿了GY801的模块当GY521mpu-6050资料

换了之后还是不行

查了手册 改了下 OK了

FriMarch-202103126525..png

FriMarch-202103125845..png

FriMarch-202103127426..png

特别注意, 请务必焊好, 我这边是用杜板线挂着, 因为接触不稳,就出出现全0,只能按复位后才正常输出

MPU6050移植完毕, 下次不知道能不能在K210再见了

链接:https://pan.baidu.com/s/1Ah_SmWkZ2gs4XbbnodmcKA
提取码:f0wf

main.c代码如下


#include <bsp.h>
#include <fpioa.h>
#include <gpiohs.h>
#include <stdint.h>
#include <stdio.h>
#include <sysctl.h>
#include <uart.h>

#include "i2c.h"
#define UART_NUM UART_DEVICE_3

void uart_print(const char const *str) {
  uart_send_data(UART_NUM, str, strlen(str));
}

//****************************************
// 定义MPU6050内部地址
//****************************************
#define SMPLRT_DIV 0x19  //陀螺仪采样率,典型值:0x07(125Hz)
#define CONFIG 0x1A      //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG \
  0x1B  //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define ACCEL_CONFIG \
  0x1C  //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B    //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x75      // IIC地址寄存器(默认数值0x68,只读)
#define SlaveAddress 0xD0  // IIC写入时的地址字节数据,+1为读取

void MPU6050_INIT(void);
int GETDATA_MPU6050(uint8_t addr);

int main(void) {
  plic_init();
  sysctl_enable_irq();
  uart_init(UART_NUM);
  uart_configure(UART_NUM, 115200, 8, UART_STOP_1, UART_PARITY_NONE);

  i2c_init(I2C_DEVICE_0, 0x68, 7, 200000);
  MPU6050_INIT();

  while (1) {
    printf("ACCEL_XOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_XOUT_H));
    printf("ACCEL_YOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_YOUT_H));
    printf("ACCEL_ZOUT_H:%d\r\n", GETDATA_MPU6050(ACCEL_ZOUT_H));
    printf("GYRO_XOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_XOUT_H));
    printf("GYRO_YOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_YOUT_H));
    printf("GYRO_ZOUT_H:%d\r\n", GETDATA_MPU6050(GYRO_ZOUT_H));
    sleep(1);
  }
}

void MPU6050_INIT(void) {
  uint8_t data_buf[2] = {PWR_MGMT_1, 0x00};
  // Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);

  data_buf[0] = SMPLRT_DIV;
  data_buf[1] = 0x07;
  // Single_WriteI2C(SMPLRT_DIV, 0x07);
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);

  data_buf[0] = CONFIG;
  data_buf[1] = 0x06;
  // Single_WriteI2C(CONFIG, 0x06);
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);

  data_buf[0] = GYRO_CONFIG;
  data_buf[1] = 0x18;
  // Single_WriteI2C(GYRO_CONFIG, 0x18);
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);

  data_buf[0] = ACCEL_CONFIG;
  data_buf[1] = 0x01;
  // Single_WriteI2C(ACCEL_CONFIG, 0x01);
  i2c_send_data(I2C_DEVICE_0, data_buf, 2);
}

int GETDATA_MPU6050(uint8_t addr) {
  uint8_t H, L;
  uint8_t reg = addr;
  i2c_recv_data(I2C_DEVICE_0, ®, 1, &H, 1);
  reg = addr + 1;
  i2c_recv_data(I2C_DEVICE_0, ®, 1, &L, 1);

  return ((H << 8) + L);  //合成数据
  /*
  H=Single_ReadI2C(REG_Address);
      L=Single_ReadI2C(REG_Address+1);
      return (H<<8)+L;   //合成数据
  */
}

版权声明:本文为CSDN博主「jwdeng1995」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jwdeng1995/article/details/108110072

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail