文档章节

瑞萨单片机(R5F100LE) 使用MPU6050

kangxin1234
 kangxin1234
发布于 2015/07/16 15:22
字数 1508
阅读 1288
收藏 2

    MPU-6050为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的封装空间。能测量三个方向的加速度,角加速度,角度以及温度。这篇文章介绍如何使用瑞萨单片机使用MPU6050。模块的工作原理不多说,介绍如何使用。

    MPU-6050可以使用UART通信和I2C通信,这里使用UART通信波特率9600。使用MPU-6050时可以先用上位机,把波特率设为9600,他会掉电保存这个设置。9600波特率时MPU6050每隔50个ms和回复一个数据包,在串口中断中解析它。

    引脚分配:

    P02 TXD1接MPU6050的RX   

    P03 RXD1接MPU6050的TX

    下面是代码生成器的设置。

    

主函数中没有什么内容初始化,仅仅写初始化函数就行然后等待中断,我用定时器产生了一个1ms的中断,在中断中,让GlobalTime加1,作为全局时间戳。P13.0是测试用LED灯。

/***********************************************************************************************************************
* File Name    : r_main.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements main function.
* Creation Date: 2015/7/15
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_serial.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
extern uint32_t GlobalTime;
/* End user code. Do not edit comment generated here */
void R_MAIN_UserInit(void);

/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void main(void)
{
    /* Start user code. Do not edit comment generated here */
	uint32_t nowTime=0, lastTime=0;
	R_MAIN_UserInit();
	R_TAU0_Channel0_Start();
	R_UART1_Start();
    while (1U)
    {
        nowTime=GlobalTime;
		if((nowTime-lastTime)>500)
		{
			lastTime = GlobalTime;
			P13.0 = ~P13.0;
		}
    }
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description  : This function adds user code before implementing main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

    定时器用户文件r_cg_time_user.c,仅仅自加GlobalTime。

/***********************************************************************************************************************
* File Name    : r_cg_timer_user.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements device driver for TAU module.
* Creation Date: 2015/7/15
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
#pragma interrupt INTTM00 r_tau0_channel0_interrupt
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
uint32_t GlobalTime;
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
* Function Name: r_tau0_channel0_interrupt
* Description  : This function is INTTM00 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_tau0_channel0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	++GlobalTime;
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

最关键的数据解析中串口中断函数中,注意这里改写了中断服务函数,没有用代码生成器给的中断接收函数。采集的数据放在全局变量中,注意用了一个自定义的函数MPU6050RecvEnd(),要在头文件中声明。

double Acceleration[3]={0};//XYZ轴的加速度
double AngularAcceleration[3]={0};//XYZ 轴的角加速度
double Angle[3]={0};//XYZ轴的角度
double Temperature=0;//温度
/***********************************************************************************************************************
* File Name    : r_cg_serial_user.c
* Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
* Device(s)    : R5F100LE
* Tool-Chain   : CA78K0R
* Description  : This file implements device driver for Serial module.
* Creation Date: 2015/7/15
***********************************************************************************************************************/

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
#pragma interrupt INTST1 r_uart1_interrupt_send
#pragma interrupt INTSR1 r_uart1_interrupt_receive
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_serial.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
extern volatile uint8_t * gp_uart1_tx_address;         /* uart1 send buffer address */
extern volatile uint16_t  g_uart1_tx_count;            /* uart1 send data number */
extern volatile uint8_t * gp_uart1_rx_address;         /* uart1 receive buffer address */
extern volatile uint16_t  g_uart1_rx_count;            /* uart1 receive data number */
extern volatile uint16_t  g_uart1_rx_length;           /* uart1 receive data length */
/* Start user code for global. Do not edit comment generated here */
double Acceleration[3]={0};
double AngularAcceleration[3]={0};
double Angle[3]={0};
double Temperature=0;
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
* Function Name: r_uart1_interrupt_receive
* Description  : This function is INTSR1 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_uart1_interrupt_receive(void)
{
	/* Start user code. Do not edit comment generated here */	 
		
    
    uint8_t rx_data, sum=0, j=0;  
	static uint8_t rightFlag = 0, recvData[11]={0}, i=0;
	
           
    rx_data = RXD1;

 	if(rx_data == 0x55 || rightFlag)
	{
		rightFlag = 1;
		
		recvData[i]=rx_data;
		if(++i == 11)
		{
			rightFlag = 0;
			i=0;
			for(j=0; j<10; j++)
				sum += recvData[j];
			if(sum == recvData[10])
				 MPU6050RecvEnd(recvData);
		}
	}
	/* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_uart1_interrupt_send
* Description  : This function is INTST1 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
__interrupt static void r_uart1_interrupt_send(void)
{
    if (g_uart1_tx_count > 0U)
    {
        TXD1 = *gp_uart1_tx_address;
        gp_uart1_tx_address++;
        g_uart1_tx_count--;
    }
    else
    {
        r_uart1_callback_sendend();
    }
}

/***********************************************************************************************************************
* Function Name: r_uart1_callback_receiveend
* Description  : This function is a callback function when UART1 finishes reception.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void r_uart1_callback_receiveend(void)
{
    /* Start user code. Do not edit comment generated here */	 
		
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_uart1_callback_softwareoverrun
* Description  : This function is a callback function when UART1 receives an overflow data.
* Arguments    : rx_data -
*                    receive data
* Return Value : None
***********************************************************************************************************************/
static void r_uart1_callback_softwareoverrun(uint16_t rx_data)
{
    /* Start user code. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_uart1_callback_sendend
* Description  : This function is a callback function when UART1 finishes transmission.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void r_uart1_callback_sendend(void)
{
    /* Start user code. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
}

/***********************************************************************************************************************
* Function Name: r_uart1_callback_error
* Description  : This function is a callback function when UART1 reception error occurs.
* Arguments    : err_type -
*                    error type value
* Return Value : None
***********************************************************************************************************************/
static void r_uart1_callback_error(uint8_t err_type)
{
    /* Start user code. Do not edit comment generated here */
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
static void MPU6050RecvEnd(uint8_t data[])
{
		switch(data [1])
		{
		case 0x51:
			Acceleration[0] = ((short)(data [3]<<8| data [2]))/32768.0*16*9.8;
			Acceleration[1] = ((short)(data [5]<<8| data [4]))/32768.0*16*9.8;
			Acceleration[2] = ((short)(data [7]<<8| data [6]))/32768.0*16*9.8;
			Temperature = ((short)(data [9]<<8| data [8]))/340.0+36.25;
		break;
		case 0x52:
			AngularAcceleration[0] = ((short)(data [3]<<8| data [2]))/32768.0*2000;
			AngularAcceleration[1] = ((short)(data [5]<<8| data [4]))/32768.0*2000;
			AngularAcceleration[2] = ((short)(data [7]<<8| data [6]))/32768.0*2000;
			Temperature = ((short)(data [9]<<8| data [8]))/340.0+36.25;
		break;
		case 0x53:
			Angle[0] = ((short)(data [3]<<8| data [2]))/32768.0*180;
			Angle[1] = ((short)(data [5]<<8| data [4]))/32768.0*180;
			Angle[2] = ((short)(data [7]<<8| data [6]))/32768.0*180;
			Temperature = ((short)(data [9]<<8| data [8]))/340.0+36.25;
		break;
		} 
}
/* End user code. Do not edit comment generated here */

    瑞萨单片机R5F100LE使用MPU6050cubesuite+工程链接。

© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
加载中

评论(14)

星星33083
星星33083
一旦加了四路PWM,数据采集立马有问题,不知道,中断优先级怎么设置
小虾米不吃鱼pold
小虾米不吃鱼pold
你好,请问有I2C通信方式的程序吗??
小虾米不吃鱼pold
小虾米不吃鱼pold
你好,请问有I2C通信方式的程序吗??
W
W52134679
原来这样子的。但是好像这个MPU是一组发送33个数据,用这个程序不能读出那几个数据呢
kangxin1234
kangxin1234 博主

引用来自“W52134679”的评论

你好,MPU到手了 但是怎样才能获取加速度角速度和角度呢 你这个程序好像不能进到那个处理原始数据的中断里啊
我用的这个MPU是有I2C和UART两种通信方式,这个程序用的是UART的。UART读出的数据是已经经过姿态解算的。
W
W52134679
你好,MPU到手了 但是怎样才能获取加速度角速度和角度呢 你这个程序好像不能进到那个处理原始数据的中断里啊
乐水山
乐水山
大神 问一下 我用你这个程序测试时为什么在线仿真时读出来的数全是问号 后来我在rx_data=RXD1这句前加了55ms延时状况仍未改变 而且今天我用上位机调6050的时候 若将波特率设为9600 显示极不正常 几乎数据就是不刷新 这都是为什么呢 这两者是不是有联系 求大神解答
kangxin1234
kangxin1234 博主

引用来自“srq”的评论

请问这个程序是不是就可以读出那三个角了?不用卡尔曼什么来计算姿态?
这个MPU是串口通信,自带卡尔曼滤波的。读取的数据已经经过滤波处理。
s
srq
请问这个程序是不是就可以读出那三个角了?不用卡尔曼什么来计算姿态?
quanwei9958
quanwei9958

引用来自“LCJ_JSY”的评论

请问这个是读取mpu6050数据吗
是的 MPU6050RecvEnd 他的这个函数是解析的,读取在串口里
关于瑞萨(R5F100LE)中断的应用问题

@kangxin1234 你好,前辈,想跟你请教个问题: 您的这个帖子里 TRIG = 1; delayMs(2); TRIG = 0; 是为了让他出现下降沿,然后进入中断么还是直接在下面这个图片里就进入中断了,如果是下降沿...

半个句号
2018/02/21
325
2
MPU6050开发 -- 在 C52 单片机上测试

用了三篇文章,从 MPU6050的初识,相关基本概念,到 I2C/SPI通信协议都讲了一下。现在可以上手来测试了。 手头没有什么Arduino的开发板,只有两款,一个是郭天祥的STC89C52单片机,另一个S5P...

qq_29350001
2017/11/23
0
0
【目录】电子发烧友, 持续更新

目录内容: 1)Geek 2)C51单片机学习平台搭建 3)入门 4)提高 5)红外发射 6)树莓派 7)物联网 8)模电基础 【Geek】 C51单片机 SIM900A 手机给门禁解锁 智能家居 【C程序代码已开源,更新...

990487026
2015/09/26
0
0
MPU6050开发 -- 测试程序分析

上一篇文章再 C52 单片机上进行了测试,那么接下来我们就分析一下测试程序。看看其中都用到哪些寄存器? 测试代码,参看:MPU6050开发 -- 在 C52 单片机上测试 一、单片机介绍 这部分上一篇文...

qq_29350001
2017/11/24
0
0
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx 快速安装详解

一、Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамбле...

网络小虾米
25分钟前
4
0
技术分享 | slave_relay_log_info 表认知的一些展开

作者:胡呈清 slave_relay_log_info 表是这样的: mysql> select * from mysql.slave_relay_log_info\G *************************** 1. row *************************** Number_of_lin......

爱可生
27分钟前
3
0
nginx配置http访问自动跳转到https

server {listen 80;server_name www.域名.com;rewrite ^(.*) https://$server_name$1 permanent;}server {listen 443;server_name www.域名.com;root /home/www;ssl on;......

很好亦平凡ms
27分钟前
4
0
SpreadJS:一款中国研发的类Excel开发工具,功能涵盖Excel的 95% 以上

Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面、出色的计算性能、数据分析和图表,已经成为数据统计领域不可或缺的软件之一。 基于Excel对数据处理与分析的卓越表现,把Excel...

葡萄城技术团队
27分钟前
3
0
用javafx框架tornadofx做了个天气预报的程序

class WeatherApp : App(WeatherView::class)class WeatherView : View("十五天天气预报") { val weatherVM: WeatherViewModel by inject() val controller: WeatherController by......

oschina4cyy
31分钟前
4
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部