单片机之加速度传感器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、基于单片机控制的跳绳计数器。数字计数式频率计能直接计数单位时间内被测信号的脉冲数,然后以数字...
机器人大赛怎么准备?从软件和硬件两方面准备。软件就是机器人大赛所需知识主要包括基本编程能力、硬件电路设计、单片机的开发能力、算法、电机的控制、陀螺仪加速度计的使用、编...