Funpack第六期用MAX32660-EVSYS+MPU6050+OLED实现计时器和计步器
Funpack第六期 MAX32660-EVSYS MPU6050 OLED IIC DMP RTC 计时器 计步器
标签
嵌入式系统
aramy
更新2021-03-18
895

   任务目的:使用MAX32660-EVSYS MPU6050 OLED实现计时器和计步器功能。

   使用的硬件:由Funpack第六期活动指定在得捷购买的MAX32660-EVSYS开发板。MPU6050模块,集成了MPU6050六轴芯片,提供了外围芯片,引出了IIC接口。OLED,由电子烟上拆下来的OLED显示屏,主控SSD1307Z;能显示96*16个点0.65寸的OLED显示屏,也是做好了驱动板,引出IIC接口。

    实现过程:

    1 使用keil开发工具,下载了美信官网的例程。利用IIC例程作为基础,进行改写。

if((error = I2C_MasterWrite(MXC_I2C0, I2C_SLAVE_ADDR, txdata, 16, 0)) != 16) {
        printf("Error writing %d\n", error);
        while(1);
    }
if((error = I2C_MasterRead(MXC_I2C0, I2C_SLAVE_ADDR, rxdata, 16, 0)) != 16) {
        printf("Error reading%d\n", error);
        while(1);
    }

从例程中可以看到,IIC的读写都有范例,但是和平常见到的有区别,自己的理解为入口参数分别是IIC端口(可以选端口0或端口1对应不同的gpio),IIC通讯地址。需要写入或者读取的缓冲区,写入长度。最后一个入口参数功能还不清楚。返回值为写入或读取的长度。

     

    2 改写IIC的读写函数,用来驱动OLED和mpu6050模块。利用了开发板的IIC0,通过不同的地址去访问不同的模块。OLED和mpu6050的驱动程序网上很多例子,只要把IIC驱动的部分实现了,其它部分基本不用动。mpu6050写入IIC的函数

MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//¸´Î»MPU6050

这里入口为寄存器地址,代写入的值。按美信例程中函数进行改造:

//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
uint8_t MPU_Write_Byte(uint8_t reg,uint8_t data){ 
	uint16_t error;
	uint8_t txdata[2];
	txdata[0]=reg;
	txdata[1]=data;
	error=I2C_MasterWrite(MXC_I2C0, MPU_WRITE, txdata, 2, 0);
	//printf("IIC write reg=%x  echo=%d \n",reg,error);
	return error-2;
}

创建一个2字节的缓冲区,首字节放入MPU6050的地址(这里不是0X68而是左移一位后的写地址0XD0),第二个字节存放待写入的内容。

res=MPU_Read_Byte(MPU_DEVICE_ID_REG);

mpu6050读取IIC的函数,只有一个入口参数,即读取地址。改造后:

//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据
uint8_t MPU_Read_Byte(uint8_t reg){
	uint8_t data;
	data=reg;
	I2C_MasterWrite(MXC_I2C0, MPU_WRITE, &data, 1, 0);
	//printf("IIC write leng=%d\n",error);
	I2C_MasterRead(MXC_I2C0, MPU_READ, &data, 1, 0);
	//printf("IIC read leng=%d\n",error);
	return data;
}

 

即先写入MPU6050的读取地址(0XD1),再写入寄存器地址,然后就可以读到该寄存器对应的值了。

     

 

    3 参考RTC的例程,调用开发板的RTC功能,但是没看见开发板如何接电池,所以断电后时间信息丢失,暂时无法保存时间。系统循环读取RTC的秒,当秒发生变化时,告诉OLED,做时间的刷新显示。

 

    4 参考GPIO的例程。调用开发板上的LED和按钮。按钮用来切换计时器和计步器。LED用来指示当前工作在哪个功能下。按钮功能只需要调用例程中的中断函数即可:

void buttonHandler(void *pb){
    buttonPressed = !buttonPressed;
		flash=1;
}

 

使用了一个全局变量,来保存按键的值。

 

      5 参考原子的计步程序。原子的计步程序是在stm32F4下利用了mpu6050的dmp功能,获取人行走时晃动带来的加速度、角速度的变化,从而实现计步功能。将dmp的模块移植到MAX32660下,成功调用计步功能。

dmp_get_pedometer_step_count(&step_count); //得到计步步数
dmp_get_pedometer_walk_time(&walk_time); //得到计步所用时间

 

   心得体会:非常感谢硬禾学堂的这次活动。组织的非常好。拿到板子后一头雾水,完全不知道如何下手,在线看了Thomas前辈的讲解,很快的入了门。但是美信的例程中IIC的实现与平时见到的IIC通讯的方法完全不同,正在摸不着头脑时,讨论群里的大神给出了方向。按方向很快就找到了门路,完成了任务。

    在这里让我一个业余玩家,感受到了嵌入式的乐趣。谢谢!

附件下载
homework.zip
团队介绍
个人电子爱好者
团队成员
魏雷
中国邮政集团公司下属的东莞市一名员工。现从事计算机软件开发与维护工作。玩单片机业属于自己的业余爱好,利用业余时间了解电子世界,对新科技充满了好奇与兴趣。
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号