STM32控制三轴加速度传感器实现分析

发布者:温暖微风最新更新时间:2016-07-28 来源: eefocus关键字:STM32  三轴  加速度传感器 手机看文章 扫描二维码
随时随地手机看文章
买的stm32F107VC开发板,带三轴加速度传感器LIS302DL,附带的示例代码。学习了几天,总结如下。

 

1。逻辑结构

初始化各外设(RCC,GPIO,SPI,NVIC,I2C,LCD)——检测MEMS并显示检测状态——在死循环中不断查询加速度值并描画。

 

 

2。硬件原理

与该程序相关的硬件连接图:

MEMS连接图

    

 

 

MEMS引出脚与MCU(左)、IO扩展(右下)连接图

   

  

 

LCD连接图

  

  

 

 

LCD引出脚与MCU(左)、IO扩展(右上)连接图

   

  

 

 

从图中可以看出,MEMS使用I2C接口SCL和SDA连接MCU;LCD使用SPI3接口连接MCU。两者的其余引出脚(INT1, 2, TouchScreenXY+-)均连接到IO扩展。IO扩展部分的原理图为:

它由两块touchScreen控制芯片组成,同样挂在I2C总线上。该部分的原理还没弄清,代码中怎么控制这两块芯片的动作,MEMS INT1,2连接扩展口的意义何在,是如何作用的,有待进一步研究。
 

MEMS控制原理

  

在程序动作前,需要初始化系统中断向量表(使用NVIC_SetVectorTable函数),配置系统时钟、使能各外设时钟(SystemInit,RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd)。

 

 

1。GPIO

PB6,PB7分别作为SCL和SDA。查找STM32芯片手册的AFIO部分,

将PB6,PB7作为SCL和SDA使用不需要进行重映射,因此只需初始化其模式、速度。

 

 

2。I2C

(1)外设时钟频率

外设时钟频率fPCLK1需写入CR2寄存器的最低六位,写入值的单位为MHz。因此,把RCC中PCLK1的频率值除以1000,000后,放入CR2中。

    

(2)CCR (clock control register)

该值控制master模式下的I2C时钟。

I2C传输分为standard mode (fSCL = 100kHz) 和fast mode (fSCL = 400kHz)。fast mode分为 tlow/thigh = 2 和 tlow/thigh = 16/9 两种。图示如下。16/9类同。

 

CCR值的公式为:

standard mode:

Thigh = CCR * TPCLK1

Tlow = CCR * TPCLK1

fast mode:

比例为2:

Thigh = CCR * TPCLK1

Tlow = 2 * CCR * TPCLK1

比例为16/9:

Thigh = 9 * CCR * TPCLK1

Tlow = 16 * CCR * TPCLK1

  

因此,计算CCR值的方法为:

standard mode:

CCR = Thigh / TPCLK1 = 0.5 * TSCL / TPCLK1 = fPCLK1 / (2 * fSCL)

(代码中结构体的变量I2C_ClockSpeed即为fSCL)

fast mode:

比例为2:

CCR = Thigh / TPCLK1 = (1 / 3) * TSCL / TPCLK1 = fPCLK1 / (3 * fSCL)

比例为16/9:

CCR = fPCLK1 / (25 * fSCL)

  

在CCR中,standard mode下最小值为0x04,fast mode下为0x01。

  

(3)TRISE寄存器

该值设定master模式下的最大上升时间。计算方法为允许的最大SCL上升时间除以TPCLK1,所得商值加1。

在I2C bus specification中,standard mode 下最大时间为1000ns,fast mode下为300ns。

因此,TRISE计算方法为:

standard mode:

TRISE = 1000 * (10^(-9)) / TPCLK1 + 1 = fPCLK1 + 1

fast mode:

TRISE = 300 * (10^(-9)) / TPCLK1 + 1 = 300 * fPCLK1 / 1000 + 1

  

  

3。读取MEMS中加速度数据

实现过程按照LIS302DL datasheet中给的时序

大致步骤为:允许ACK,发送起始位,发送外设写地址,发送命令数据,发送起始位,发送外设读地址,(收到外设数据),禁用ACK,发送停止位,允许ACK,从DR寄存器读数据。

发送和接收命令或地址数据的本质是读写DR寄存器。

每步执行之后需要检查SR1和SR2相应寄存器的状态,确认该步执行完成后才能进行下一步。

对于外设读写地址,LIS302DL datasheet中有说明:当SDO接地时,外设地址SAD为00111010;master要发送的地址数据位SAD+W/R,W/R位,从MEMS读数据时为1,向MEMS写数据时为0。

 

在发送外设写地址后,对MEMS的操作为:通过I2C写入MEMS寄存器的地址,(通过I2C写入对该寄存器的控制字)。

在发送外设读地址后,对MEMS的操作为:关闭ACK,发送停止位,从DR读取数据。

 

程序中用到的MEMS寄存器有:0x20 CTRL_REG1,选择电源模式,选择加速度检测方向

                                          0x27 STATUS_REG,各轴数据获取和溢出状况

                                          0x29, 2B, 2D OUT_X,Y,Z 各轴输出数据。

   

剩余问题:在I2C驱动中,对于外设时钟频率的赋值,汇编代码中,MCU寄存器中为正确的值,但单步时发现,赋值给时钟频率变量的值显示不正确,无法赋给正确的值;最后计算结果为寄存器中数据的计算,因此是正确的。

若把变量声明为static,汇编代码中该变量的存储位置发生变化。需要学习code, RO data, RW data和ZI data的职能。
 

中断

设定某方向的加速度阈值,当传感器测量值超过该阈值时,传感器输出中断信号。信号通过IO扩展芯片的中断管脚与MCU的GPIO相连,进而能在传感器超过阈值时,系统进入ISR。

 

程序初始化时需要进行的与中断有关的设定如下,设定都是通过对寄存器的改写实现的:

MEMS:

设定输出给IO扩展芯片管脚的中断的高/低电平有效

设定中断为非锁存模式。(锁存模式即中断信号需要在读取某个寄存器后才能清除)

设定中断的方向和阈值。

IO扩展芯片:

设定输出给MCU IO口的中断的高/低电平有效,及level/pulse方式

使能全局中断功能

使能芯片GPIO的中断功能

使能绑定某些管脚的中断功能

清除当前中断寄存器各位状态

MCU:

配置与IO扩展芯片中断管脚连接的GPIO的参数

将该GPIO与相应EXTI绑定

设定EXTI相应线的使能,上升下降沿触发

设定NVIC优先级和使能

   

  

中断发生,ISR执行完成后需要进行的释放操作如下:

IO扩展芯片:

清除GPIO中断的挂起状态

清除GPIO具体管脚中断的挂起状态

清除边缘检测、上升下降沿检测状态

MCU:

清除相应EXTI线上的挂起状态

关键字:STM32  三轴  加速度传感器 引用地址:STM32控制三轴加速度传感器实现分析

上一篇:解决:keil报错invalid redeclaration of type name "s32"
下一篇:tm32关于BOOT0和BOOT1

推荐阅读最新更新时间:2024-03-16 15:02

STM32实战 2.矩阵键盘通过串口3输出
#include KEY44.h #include sys.h #include delay.h #include usart.h u8 key_num = 0; int main(void) { uart_init(115200); delay_init(); KEY44_Init(); while(1) { key_num = key44_Scan(); if(key_num != 0) { printf( KEY is %drn ,key_num); } } } #include KEY44.h #include sys.h #include delay.h vo
[单片机]
STM32 SPI接口读写SPI flash实验
STM32 SPI flash读写测试实验报告 一、实验目的 1.学习SPI的基本工作原理 2.通过实验加深对STM32SPI的理解 3. 利用STM32的SPI11和SPI接口的flash芯片进行通信,读写测试,并将测试结果用串口打印出来 二、实验原理 1.SPI基础知识 SPI特征 ● 3线全双工同步传输 ● 带或不带第三根双向数据线的双线单工同步传输 ● 8或16位传输帧格式选择 ● 主或从操作 ● 支持多主模式 ● 8个主模式波特率预分频系数(最大为fPCLK/2) ● 从模式频率(最大为fPCLK/2) ● 主模式和从模式的快速通信 ● 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 ● 可编
[单片机]
<font color='red'>STM32</font> SPI接口读写SPI flash实验
stm32读写nrf24l01复位不通过的问题
通过网上查阅搜索发现,这个问题在别人那里还真出现过。 使用nrf24l01时,按开发板上的复位键,无线模块无法复位,即初始化不成功,但重新上电后,此现象消失,不知道什么情况造成的的, 后来网友建议 这么写 nRF24L01_Write_register(0x00,0x00); delay_ms(100); nRF24L01_Write_register(0x01,0x01); //通道0 自动应答允许 nRF24L01_Write_register(0x02,0x01); //通道0 接收允许 nRF24L01_Write_register(0x03,0x03); //地址宽度为5字节 nRF2
[单片机]
STM32入门——第一天学习GPIO
第一步 学习GPIO,以按键控制跑马灯为例 GPIO是相对于stm32来说的,也就是芯片上的IO引脚,如C51上的P0口。但是stm32上的io口拥有更强大的功能,有GPIOA~G。每个GPIOx共15个引脚,刚开始学习时对于每个IO口的N多个功能没必要深究,但要记住几个重要的功能:输入上拉,输入下拉,推挽输出。这是本次试验用到的。 输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平。 输入下拉:同理此时按键与电源相连,按下即为高电平,下拉就是该IO口通过一个电阻与地相连,没按下
[单片机]
<font color='red'>STM32</font>入门——第一天学习GPIO
STM32高级开发(15)-使用eclipse开发STM32
在最起初的时候,我刚刚接触linux上单片机的开发,最喜欢的就是 eclipse + arm-plug-in + arm-none-eabi 的开发环境,因为这是在Linux上最接近于windows下keil、IAR等IDE的开发方式,然而那是由于对eclipse亦或是makefile等编译过程中的工具的不甚了解,很多时候会遇到一些莫名的错误,也导致了那是觉得这样的环境很鬼畜,现在看来多是一些很浅显的问题,直到最近我再一次的尝试了eclipse开发环境的搭建和使用,我才很顺利的完成了程序的配置。现在也把这个方法推荐给大家,不过在使用这个方式前,还是建议大家先把之前的文章内容看懂了,否则很多时候遇到问题都会不知道怎么解决。 安装
[单片机]
<font color='red'>STM32</font>高级开发(15)-使用eclipse开发<font color='red'>STM32</font>
stm32 蜂鸣器
蜂鸣器分为两种型号:有源蜂鸣器和无源蜂鸣器 区别:有源的只用提供一个驱动电压就可以工作,但是无源的蜂鸣器需要提供规定赫兹的脉冲信号才能发出声音,声音的大小可以根据占空比进行调节。 #include system.h /*蜂鸣器时钟端口、引脚定义*/ #define BEEP_PORT GPIOB #define BEEP_PIN GPIO_Pin_5 #define BEEP_PORT_RCC RCC_APB2Periph_GPIOB #define beepPBout(5) void BEEP_Init(void); #endif void BEEP_Init() //端口初始化 { GPIO_InitT
[单片机]
在IAR调试stm32中断偏移的奇怪现象
今天在做STM32F207 bootloader时发生了一个诡异的事情,在IAR中将我的APP函数中断偏移设置为 即偏移了64KB,前64KB用于放置bootloader程序.编译连接最后生成map,查看也没出错 然后在IAR中下载调试(在此之前还没有下载bootloader): 竟然可以找到复位函数的入口,全速运行,程序正常执行. 按照ST官网的手册一般情况下,在复位后程序,程序从地址0x00000000读取堆栈地址,0x00000004取PC指针,0x00000000地址一般情况为0x08000000的映射,, 图中1就是2的别名,他们的数据能容是相同的. 我偏移了0x0001000
[单片机]
在IAR调试<font color='red'>stm32</font>中断偏移的奇怪现象
通过轮胎判断路面状况,利用振动发电机确保电源
“路面结冰。请小心车辆打滑”。普利司通开发出了在轮胎上安装加速度传感器用以检测轮胎接地面的振动,从而判断路面状况的技术。该技术能够辨别“干燥”、“半湿润”、“湿润”、“结露”、“积雪”、“压雪”、“结冰”等7种路面状况。目的是通过提前察觉到危险的路面状况并提醒驾驶员注意,从而防止事故发生。 判断路面状况提醒驾驶员注意 普利司通开发出了利用轮胎内侧安装的加速度传感器数据判断路面状况的技术(a)。判断的路面状况结果显示在车内的显示器上(b)。 普利司通把收集并分析轮胎接地面的信息,为轮胎提供新价值的技术称为“CAIS(contact area information sensing)”。该公司没有公布实用化时间,不过表示“正
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved