技术文档

单片机 加速度 单片机之加速度传感器KX022(1)

小编 2024-11-25 技术文档 23 0

单片机之加速度传感器KX022(1)

加速度传感器在我们生活中的应用很常见,如智能手机、智能手环,其中用来记步的就是加速度传感器了,其他的如游戏控制,图像翻转等。本节主要介绍Kionix公司的加速度传感器KX022-1020的特点及其与单片机通信方式,下节介绍其在计步器中的应用与设置。KX022具有体积小功耗低(最低睡眠电流0.9uA)精度高(数据8/16位可配置),可选的加速度范围大等特点,它是三轴(xyz)加速度传感器,加速度±2g/4g/8g可以配置,有移动唤醒,敲击功能。KX022的通信方式有SPI和IIC,本节就IIC方式做详细介绍。详细情况见Kionix官网PDF。

一、参考接线方式如下

引脚定义和接线图

在实际应用中我们用IIC通信协议接线图如下

KX022与单片机用IIC通信接线图

用IIC通信在读写数据之前需要发送地址,1号引脚为地址引脚,接VSS与VDD的地址不一样。

通信地址

我们的地址引脚接地,因此在写数据前要先发送0x3C,读数据之前要先发送0x3D

二、KX022与单片机用IIC通信的时序图

IIC时序图

时序图中标识的意思

KX022与单片机通信的过程如下

具体通信过程

简写代表的意思

有了时序图与通信过程,接下来就可以来写KX022与单片机通信的程序了

三、代码实现通信过程

#define WRITE_ADDR 0x3C

#define READ_ADDR 0x3D

void delay_us(u8 time)//简单延时函数

{

u8 i;

for(i = 0; i < time; i++);

}

/***********************************

IIC起始信号

************************************/

void iic_start(void)

{

SCLK = 1;

SDA = 1;

delay_us(0);

SDA = 0;

delay_us(0);

SCLK = 0;

delay_us(0);

}

/***********************************

IIC停止信号

************************************/

void iic_stop(void)

{

SDA = 0;

delay_us(0);

SCLK = 1;

delay_us(0);

SDA = 1;

delay_us(0);

}

/*********************************

IIC发送一个字节

**********************************/

u8 iic_send_byte(u8 dat)

{

u8 i;

for(i = 0; i < 8; i++)

{

if(dat&0x80)

{

SDA = 1;

}

else

{

SDA = 0;

}

delay_us(0);

SCLK = 1;

delay_us(0);

dat <<=1;

SCLK = 0;

}

P1MODH &= 0xf3;

P1_5 = 1; //设置为输入

delay_us(0);

SCLK = 1;

delay_us(0);

i = 0;

while(SDA)

{

i++;

if(i > 25)

{

SCLK = 0;

delay_us(0);

SDA = 1;

return 0;

}

}

SCLK = 0;

delay_us(0);

SDA = 1;

return 1;

}

/***************************************

IIC读一个字节,无应答

****************************************/

u8 iic_read2_byte()

{

u8 dat = 0;

u8 i = 0;

P1MODH &= 0xf3;

P1_5 = 1; //设置SDA为输入

for(i = 0;i < 8; i++)

{

SCLK = 1;

delay_us(0);

dat <<= 1;

dat |= SDA;

delay_us(0);

SCLK = 0;

delay_us(1);

}

//设置SDA输出

return dat;

}

/***************************************

IIC读一个字节,有应答

***************************************/

u8 iic_read_byte()

{

u8 dat = 0;

u8 i = 0;

P1MODH &= 0xf3;

P1_5 = 1; //设置SDA为输入

for(i = 0;i < 8; i++)

{

SCLK = 1;

delay_us(0);

dat <<= 1;

dat |= SDA;

delay_us(0);

SCLK = 0;

delay_us(0);

}

i = 0;

SCLK = 1;

delay_us(0);

while((SDA == 1) && (i < 25))i++;

SCLK = 0;

SDA = 1;

//设置SDA输出

return dat;

}

/**************************************************

从指定寄存器读一个字节数据

***************************************************/

u8 read_data_from_kx022( u8 rom_addr)

{

u8 temp = 0;

iic_start();

iic_send_byte(WRITE_ADDR);

iic_send_byte(rom_addr);

iic_start();

iic_send_byte(READ_ADDR);

temp = iic_read_byte();

iic_stop();

return temp;

}

/***************************************************

向指定寄存器写一个字节数据

****************************************************/

void write_data_to_kx022(u8 rom_addr, u8 dat)

{

iic_start();

iic_send_byte(WRITE_ADDR);

iic_send_byte(rom_addr);

iic_send_byte(dat);

iic_stop();

}

/************************************************

从指定寄存器连续读多个数据

*************************************************/

u8 read_data2_from_kx022( u8 rom_addr)

{

u8 temp = 0;

iic_start();

iic_send_byte(WRITE_ADDR);

iic_send_byte(rom_addr);

iic_start();

iic_send_byte(READ_ADDR);

temp = iic_read2_byte();

return temp;

}

以上就是KX022与单片机之间的通信过程了,IIC时序之间的延时可以根据实际情况调整,这个只是通信协议部分完成了,想要使用KX022还需要很多的设置,下一节主要讲KX022的设置以及应用,以及记步算法的原理与实现。本节就写到这了,有问题欢迎留言。

单片机之加速度传感器KX022(2)

上一节主要讲述了KX022与单片机之间用IIC通信的过程与程序代码,这一节主要介绍KX022在计步器中的具体应用与设置方法。

一、初始化需要设置的参数

在设置其他寄存器值之前,需要先读一下这个寄存器的值。

在设置其他寄存器之前需要将这个寄存器的PC1(bit7)置零,在寄存器值设置完成后再将这一位置1。

设置数据输出速率,取值0x59,400HZ TAP & 1.5HZ motion

设置中断引脚以及中断有效电平,上一节原理图中中断引脚是INT2,高电平有效,设置值为0x20

采样设置,选64,故设置值为0x60

将status清零,0x00

寄存器太多,就不一一介绍了,其他寄存器初始设置值如下:

write_data_to_kx022(0x25, 100);//双击判定的俩次敲击时间间隔限制

write_data_to_kx022(0x26, 254);//敲击判定X,Y,Z变化的和的最大值

write_data_to_kx022(0x27, 30);//敲击判定X,Y,Z变化的和的最小值

write_data_to_kx022(0x2b, 80);//INT信号的在检测到敲击动作后延迟计数

write_data_to_kx022(0x1e, GTAP_AXIS);

read_data_from_kx022(0x17)//读一下,清除中断状态

二、唤醒参数设置

read_data_from_kx022(0x17);

write_data_to_kx022(0x18, 0x00);

write_data_to_kx022(0x21, 0x20|GTAP_EN);

write_data_to_kx022(0x3b, 0x80);

三、睡眠参数设置

write_data_to_kx022(0x18, 0x00);

write_data_to_kx022(0x18, 0x06|0x08);

write_data_to_kx022(0x1a, 0x59);//400HZ TAP & 1.5HZ motion

write_data_to_kx022(0x1b, 0x08);

write_data_to_kx022(0x21, 0x22);//

write_data_to_kx022(0x3b, 0x00);

write_data_to_kx022(0x3e, 0x00);

write_data_to_kx022(0x18, 0x82|0x08);

read_data_from_kx022(0x17);

以上就是KX022在计步器应用中的基本设置,参数设置好了,就可以从传感器中读取数据了,但是怎么处理数据呢,这个时候就需要记步算法了。

四、记步算法

用户在水平步行运动中,垂直和前进两个加速度会呈现周期性变化,如图所示,在步行收脚的动作中,由于重心向上单只脚触地,垂直方向加速度是呈正向增加的趋势,之后继续向前,重心下移两脚触底,加速度相反。水平加速度在收脚时减小,在迈步时增加。

反映到图表中,我们可以看到在步行运动中,垂直和前进产生的加速度与时间大致为一个正弦曲线,而且在某点有一个峰值,其中垂直方向的加速度变化最大,通过对轨迹的峰值进行检测计算和加速度阈值决策,即可实时计算用户运动的步数,还可依此进一步估算用户步行距离。

从图中可以看出,人走路时候的加速度的变化是有一定规律的,通过加速度传感器获得各轴加速度的值,然后通过滤波等一系列处理就可以计算出步数了。由于计步器算法比较复杂,涉及到很多参数的判断,篇幅有限在这就不详述了,需要具体的加速度算法源代码以及应用,请留下邮箱。

相关问答

飞行器控制一般用什么 单片机 ?

我也是刚开始玩四轴的新手,打算自己DIY,刚浸淫此道2个月,做一个最简单的四轴需要了解单片机与三轴加速度,超声波测高等外围部件的数据读取,接受,同时根据得...

加速度 传感器怎么用proteus仿真

[最佳回答]1、先在图纸中右键删除你在器件箱中指定的元(查成交价|参配|优惠政策)件。选中编辑(Edit)--整理选项(Tidy)--确定。整理选项(Tidy)可以删除图纸上没...

52 单片机 能驱动伺服电机吗?

可以。52单片机(指的是STC89C52单片机)本身并不具备直接驱动伺服电机的能力。伺服电机通常需要使用PWM(脉宽调制)信号来控制其位置和速度。而STC89C52单片机...

单片机 与PC机之间的串行通信怎么改变串行通信的速度?

硬件连接首先需要将单片机与串口电机连接,具体连接方式根据电机型号和单片机型号不同而异,一...单片机与PC机之间的串行通信改变串行通信的速度的方法步骤如...

GY521与51 单片机 的连接及编程?

GY521是IIC接口,直接用单片机普通IO模拟就可以了。得到数据加速度和角速度的原始数据后,就可以用串口传给上位机显示。可以用自带的DMP,可以得到处理后的数据...

AD采集卡是什么?

加速度传感器有很多种,我之前用的是日本富士的BA24CM传感器。内置前放的型号,输出是模拟电压量。我是用NI的采集卡连接的,因为是内置前放的型号,所以采集卡...

人工智能需要学3D吗?

对人工智能观察说,机器人检测是第一步,检测一系列机械结构对应的3d图形,还可以用激光雷达、高精度扫描仪以及三维结构光识别,或者如果加速度计,陀螺仪等传感...

普通的IO口为什么可以模拟PWM信号?

PWM英文全拼就是PlUSEWIDTHMODE也就是脉冲宽度调制。它的参数就是有频率和占空比,当然还有峰值电压。然而单片机的IO口,一般都具有高低电平输出的功能。然而...

跳绳内部计数结构?

1、以机械形式计数的机器,采用齿轮转动机械计数的原理。2、基于单片机控制的跳绳计数器。数字计数式频率计能直接计数单位时间内被测信号的脉冲数,然后以数字...

机器人大赛怎么准备?

从软件和硬件两方面准备。软件就是机器人大赛所需知识主要包括基本编程能力、硬件电路设计、单片机的开发能力、算法、电机的控制、陀螺仪加速度计的使用、编...

猜你喜欢