讲师博文
WI-FI三轴传感器节点实验 来源 : 未知     2018-09-21

【实验目的】
 
学习STM32的M0系列芯片的使用
 
学习MDK开发软件的使用方法,如仿真调试
 
通过本实验掌握stm32F0xx的I2C使用方法
 
【实验环境】
 
Wi-Fi三轴传感器模块
 
MDK开发工具和相应的仿真器
 
PC机 XP、Window7/8
 
【实验内容】
 
编写三轴传感器实验程序,实现STM32F0xx模拟I2C采集三轴的实时数据,并与第三章节一样在PC端显示相应的数据。
 
【实验原理】 
 
在STM32模块中,硬件上连接了一个三轴加速度传感器。通过设置硬件连接及软件操作,可以利用三轴加速度获取x、y、z轴3个方向上的加速度信息。
 
开发板上使用的是MMA7455L加速度传感器,它输出的是数字信号,有低通滤波、温度补偿、自我测试,可配置为通过中断引脚(INT0与INT1)检测0g,并且对快速的移动进行检测等特点。
 
通过向传感器的控制寄存器中写入不同的内容,可以配置该传感器工作在不同的模式上,比如自测模式、待机模式、测试模式、加速度选择模式。可以通过I2C总线或者使用SPI总线来读取传感器的数字输出。在STM32模块上,使用的是模拟I2C总线来实现数据的读取。
 
MMA7455L传感器只在从机模式下进行工作,设备地址为$1D,支持多字节的读/写模式。不支持Hs模式、10位寻址模式和起始字节模式。在进行单字节的读取时,首先主机(微控制器)会向传感器发出一个开始信号,然后是从机地址,读/写位写入"0"表示这是一个写操作。MMA7455L会发出一个应答信号。下面主机传送一个用于读取操作的8位的寄存器地址,然后传感器会返回一个应答。主机也可以发送一个重复的开始信号,而后以寻址传感器来读取先前选择的寄存器,从机就会应答并传送数据。等到数据接收之后,主机就会传送一个停止信号。 除此之外,还可以选择多字节读和单字节写的模式。
 
STM32模块开发平台上MMA7455L与MCU连接原理图:

 
图 三轴传感器原理图
 
STM32的PA_2引脚与模块的时钟引脚相连,PA_1引脚与模块的数据引脚相连。运用stm32的GPIO引脚的模拟读取I2C的时序。
 
【实验步骤】
 
完成第3章节"RealView MDK4.22a集成开发环境",就可以做传感器实验了,首先打开光盘中的传感器工程文件。
 
工程源码路径:华清远见-网络拓扑图资料光盘\无线传感模块\低功耗Wi-Fi部分-STM32F051\程序源码\STM23F051 加速度度传感器(模拟i2c)\MDK-ARM

 
编译下载超声波程序(先编译后下载)
 
如果需要调试的话,应先下载程序,再点击右上方的调试按钮进入调试界面。

实物连接:

图 实物连接
 
上图连接说明,AP模式的Wi-Fi是通过串口直接和PC机相连接。串口Wi-Fi接收到数据,以串口的形式输出到PC的串口调试助手上显示。
 
【实验结果】
 
利用串口调试工具做实验,打开串口调试工具,波特率115200、串口号(你的电脑的端口号)、点击打开。
 
接收到的数据如下,

 
可以通过串口发送21 57 01 00 41 01 ff 00 00 00 1F F6控制继电器的开。
 
21 51: 为字符'!W'
 
01 00 :设备地址 注意:01为低八位地址,00为高八位地址 
 
41 :设备类型 'A' ,是三轴传感器
 
01 ff 00: 读到的三轴数据x/y/z。三轴值有正负之分
 
1F:当前电量
 
F6 :校验和。
 
【实验参考代码】
 
Mian.c
 
COBOL Code 

  int main(void)

  {

  uint8_t ReadValue,i;

  uint8_t buf[11]={0};

  SystemInit(); //系统时钟初始化

  /* Configure LED6 */

  STM_EVAL_LEDInit(LED6);

  Systick_Init();//滴答定时初始化

  /* Initiate Blink Speed variable */

  BlinkSpeed = 1;

  GPIO_Configuration_Init();

  USART_Cfig_Init(); //串口初始化

  I2C_init(); //I2C 初始化

  TIM_INT_Config();

  MM7455_Init();

  buf[0] = 0x21;

  buf[1] = 'W';

  buf[2] = 0x01;

  buf[3] = 0x00;

  buf[4] = 'A';

  /* Assume base board in zero-g position when reading first value. */

  Axis3_Test(&x, &y, &z);

  xoff = 0-x;

  yoff = 0-y;

  zoff = 0-z;

  while(1)

  {

  Delay(1000);

  Axis3_Test(&x, &y, &z); //读取三轴的XYZ的值

  x = x+xoff;

  y = y+yoff;

  z = z+zoff;

  buf[5] = x;

  buf[6] = y;

  buf[7] = z;

  for(i=0; i<(11-2);i++)

  {

  ReadValue ^=buf[i+1];

  }

  buf[10] = ReadValue;

  UART_Send(USART2,buf, 11);

  Delay(1000);

  }

  }

读取I2C芯片的数据函数

COBOL Code

  void Axis3_Test(int8_t *x, int8_t *y, int8_t *z)

  {

  uint8_t Read_buf;

  /* wait for ready flag */

  while ((getStatus() & ACC_STATUS_DRDY) == 0);

  /*

  * Have experienced problems reading all registers

  * at once. Change to reading them one-by-one.

  */

  I2C_Read_one_Byte(&Read_buf, ACC_ADDR_XOUT8, MMA_ADRESS);

  *x = (int8_t)Read_buf;

  I2C_Read_one_Byte(&Read_buf, ACC_ADDR_YOUT8, MMA_ADRESS);

  *y = (int8_t)Read_buf;

  I2C_Read_one_Byte(&Read_buf, ACC_ADDR_ZOUT8, MMA_ADRESS);

  *z = (int8_t)Read_buf;

  }

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:Wi-Fi超声波测距传感器节点实验

下一篇:关于IP地址

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号