Funpack第六期MAX32660-EVSYS板卡电子手环实验
本项目为Funpack第六期的MAX32660-EVSYS板卡计步器项目,设计到陀螺仪通信及数据处理、OLED液晶显示屏IIC通信及驱动显示。
标签
Funpack第六期
MAX32660-EVSYS
Dino
更新2021-03-22
1682

本设计是基于MAX32660板卡开发的一款模拟运动手表的小实验

具有的功能有以下几点:

  • 可以显示时、分、秒信息,采用24小时制
  • 步数计数,采用MPU6050陀螺仪实现
  • 温度测量功能,使用MPU6050内部集成的温度传感器来实现
  • 按键功能,P0_12引脚为按键引脚,通过按键可以查看步数和温度数据

本次设计采用KEIL 5 软件来进行开发,需要注意的是开发前的准备工作是在KEIL官网下载MAX32660固件库进行安装。

开发过程分为一下几个部分进行介绍:

GPIO初始化

按键初始化代码为例

#define KEY_Pin PIN_12
#define KEY_GPIO_Port PORT_0

extern gpio_cfg_t GPIO_KEY;

void GPIO_INIT(void){

GPIO_KEY.port = KEY_GPIO_Port;
GPIO_KEY.mask = KEY_Pin;
GPIO_KEY.pad = GPIO_PAD_PULL_UP;
GPIO_KEY.func = GPIO_FUNC_IN;
GPIO_Config(&GPIO_KEY);

从板卡原理图中可以看到按键为P0端口的12引脚,宏定义按键的端口和引脚号

采用DEMO的引脚初始化函数,对结构体变量进行赋值和模式、引脚等信息设置即可。

本设计板卡引脚情况使用如下:

0.96’OLED SPI

CS--->P0_4

DC--->P0_3

RES--->P0_2

D1--->P0_5
D0--->P0_6

 

GY-521 IIC

SDA--->P0_9

SCL--->P0_8

 

按键

KEY--->P0_12

本设计计数功能采用MPU6050陀螺仪来实现,陀螺仪与板卡的通信方式采用IIC通信。在基础的芯片初始化和数据处理代码采用正点原子的stm32f103战舰开发板的MPU6050示例代码。对于陀螺仪数据处理过程算法是参考CSDN的博客来完成,链接如下:

https://blog.csdn.net/bzy090212/article/details/78861509/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

MPU6050初始化代码如下:

short ax,ay,az; 
short gx,gy,gz;
float pitch,roll,yaw;

extern int error;

uint8_t MPU_Init(void)
{
   uint8_t res;

   MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); 
   mxc_delay(1000);
   MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);
   MPU_Set_Gyro_Fsr(3); 
   MPU_Set_Accel_Fsr(0); 
   MPU_Set_Rate(50); //ÉèÖòÉÑùÂÊ50Hz
   MPU_Write_Byte(MPU_INT_EN_REG,0X00); 
   MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); 
   MPU_Write_Byte(MPU_FIFO_EN_REG,0Xff); 
   MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); 
   res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
   if(res==MPU_ADDR)
   {
      MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);
      MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);
      MPU_Set_Rate(50); 
   } else
   return 1;
   return 0;
}

在OLED显示设计中,本设计采用定时器中断法,定期对OLED显示内容进行控制和显示同时对按键进行扫描检测,代码如下:

if(GPIO_InGet(&GPIO_KEY)==0)
{
   if(mode==1)
   {
      mode=0;
   }
   else if(mode==0)
   {
      mode=1;
   }   
   while(GPIO_InGet(&GPIO_KEY)==0);
}

if(mode==1)
{
   SetFontSize(1);
   DrawString(0,0,"Step:");
  DrawNum(30,0,step_cnt,5);
}
  else if(mode==0)
{
   a++;
   if(a==10)
   {
      a=0;
      temp1=MPU_Get_Temperature()*10;
   }
   SetFontSize(1);
   DrawString(0,0,"Temp:");
   DrawChar(30,0,(temp1/100)+48);
     DrawChar(36,0,(temp1%100/10)+48);
   DrawString(42,0,".");
   DrawChar(48,0,(temp1%10)+48);
  DrawString(54,0,"C");
}

其中计时功能也是采用定时器来完成,并对计时进行设置,符合24小时制:

void Clock_Handler(void)
{
   TMR_IntClear(CLOCK_TIMER);
   sec++;
   if(sec == 60)
   {
      sec =0;
      min++;
      if(min == 60)
      {
         min=0;
         hour++;
         if(hour == 24)
         {
            hour = 0;
            step_cnt = 0;
         }
      }
   }
}

心得体会,本人新手小白,在此次活动中学习到很多。对于开发软件的使用上,在刚开始阶段本人使用ECLIPSE软件来进行开发,发现在找资料时去美信官网查找资料非常快捷方便,但是有些教程视频为英文,这个就血药有一定的英语基础。在开发阶段,陀螺仪的步数检测算法参考大佬的帖子,对于一直方面要注意的地方有很多例如数据的格式,参数的传递,IO的配置等等,这个过程中还不小心烧了一块板卡,导致不得不再买了一块,让我学会了在给板卡上电的时候要先检查好引脚,不然短短几秒就会烧掉140元。

至此本设计展示了进本设计思想和核心程序,全部源代码和演示请见附.

附件下载
程序.rar
团队介绍
团队成员
姚新园
学生
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号