打印
[STM32F1]

STM32基础篇——ADXL345 加速度传感器实验

[复制链接]
楼主: aizaixiyuanqian
手机看帖
扫描二维码
随时随地手机跟帖
21
aizaixiyuanqian|  楼主 | 2018-3-17 19:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
设置不启用中断
设置 INT_ENABLE 寄存器,设置它不使用中断模式。

使用特权

评论回复
22
aizaixiyuanqian|  楼主 | 2018-3-17 19:53 | 只看该作者
初始化偏移量。
也就是设置 OFSX 寄存器、OFSY 寄存器、OFSZ 寄存器。

使用特权

评论回复
23
aizaixiyuanqian|  楼主 | 2018-3-17 19:53 | 只看该作者
初始化 ADX345,并核对 ADX 的 ID
int ADX345_Init(void)
{
IIC_Config();
if(ADX345_ReadReg(ADX_DEVID) == 0xE5)
{
ADX345_WriteReg(ADX_DATA_FORMAT,0x2B);//13 位全分辨率,
输出数据右对齐,16g 量程
ADX345_WriteReg(ADX_BW_RATE,0x0A); // 数 据 输 出 速 度 为
100Hz
ADX345_WriteReg(ADX_POWER_CTL,0x28); //链接使能,测量模

ADX345_WriteReg(ADX_INT_ENABLE,0x00); //不使用中断
ADX345_WriteReg(ADX_OFSX,0x00); //敲击阀值
ADX345_WriteReg(ADX_OFSY,0x00); //X 轴偏移
ADX345_WriteReg(ADX_OFSZ,0x00); //Y 轴偏移
return 0;
}
return 0xFF; //返回初始化失败
}

使用特权

评论回复
24
aizaixiyuanqian|  楼主 | 2018-3-17 19:56 | 只看该作者
读取 ADXL345 的 XYL 值。
ADX345 的 XYL 值,每个值有 2 个字节,一共 6 个字节,这 6 个字节(寄
存器 0x32 至寄存器 0x37)都为 8 位字节,保存各轴的输出数据。寄存器 0x32
和 0x33 保存 x 轴输出数据,寄存器 0x34 和 0x35 保存 y 轴输出数据,寄存
器 0x36 和 0x37 保存 z 轴输出数据。输出数据为二进制补码,DATAx0 为最
低有效字节,DATAx1 为最高有效字节,其中 x 代表 X、Y 或 Z。
DATA_FORMAT 寄存器(地址 0x31)控制数据格式。建议所有寄存器执行多字
节读取,以防止相继寄存器读取之间的数据变化。

使用特权

评论回复
25
aizaixiyuanqian|  楼主 | 2018-3-17 19:57 | 只看该作者
读取 X,Y,Z 的 AD 值
static int8_t ADX345_ReadXYZ(int16_t *xValue, int16_t *yValue, int16_t
*zValue)
{
uint8_t readValue[6], i;
IIC_Start();
IIC_SendData(ADX345_ADDR); //24C02 写地址
if(IIC_WaitAck())
{
return 0xFF;
}
IIC_SendData(0x32); //发送读地址(X 轴首地址)
if(IIC_WaitAck())
{
return 0xFF;
}
IIC_Start();
IIC_SendData(ADX345_ADDR + 1); //24C02 读地址
if(IIC_WaitAck())
{
return 0xFF;
}
/* 读取六个字节数据 */
for(i=0; i<6; i++)
{
if(i == 5) //接收最后一个字节时,发送 NACK
{
readValue[i] = IIC_ReceiveData(0);
}
else //发送接收后应答
{
readValue[i] = IIC_ReceiveData(1);
}
}
IIC_Stop();
/* 处理读取到的数据 */
*xValue = (uint16_t)(readValue[1] << 8) + readValue[0];
*yValue = (uint16_t)(readValue[3] << 8) + readValue[2];
*zValue = (uint16_t)(readValue[5] << 8) + readValue[4];
return 0;
}

使用特权

评论回复
26
aizaixiyuanqian|  楼主 | 2018-3-17 19:58 | 只看该作者
ADXL345 校正。
可参考《ADXL345》数据手册

使用特权

评论回复
27
aizaixiyuanqian|  楼主 | 2018-3-17 19:59 | 只看该作者
求角度值。
求角度值的公式如下:


使用特权

评论回复
28
aizaixiyuanqian|  楼主 | 2018-3-17 19:59 | 只看该作者
将 AD 值转换成角度值
int16_t ADX_GetAngle(float xValue, float yValue, float zValue, uint8_t dir)
{
float temp;
float res = 0;
switch(dir)
{
/* 与自然 Z 轴的角度 */
case 0:
temp = sqrt((xValue * xValue + yValue * yValue)) / zValue;
res = atan(temp);
break;
/* 与自然 X 轴的角度 */
case 1:
temp = xValue / sqrt((yValue * yValue + zValue * zValue));
res = atan(temp);
break;
/* 与自然 Y 轴的角度 */
case 2:
temp = yValue / sqrt((xValue * xValue + zValue * zValue));
res = atan(temp);
break;
default:
break;
}
res = res * 1800 / 3.14;
return res;
}

使用特权

评论回复
29
aizaixiyuanqian|  楼主 | 2018-3-17 20:00 | 只看该作者
例程主函数
int main(void)
{
uint8_t ledState;
uint32_t i;
/* 初始化 */
TFT_Init();
FLASH_Init();
SYSTICK_Config();
USART1_Config(9600);
LED_Config();
while(ADX345_Init())
{
GUI_Show12Char(60, 42, "ADX345 ERROR!", RED, BLACK);
SYSTICK_Delay1ms(100);
}
GUI_DisplayInit();
ADX345_Adjust();
while(1)
{
i++;
if(i > 0x02FFFF)
{
/* 读取 X,Y,Z 的加速度值 */
ADX_GetXYZData(&Xval, &Yval, &Zval);
printf(" x:%d \n", Xval);
printf(" y:%d \n", Yval);
printf(" z:%d \n", Zval);
/* 将读取到的加速度值转换为角度值 */
Xang=ADX_GetAngle(Xval, Yval, Zval,1);
Yang=ADX_GetAngle(Xval, Yval, Zval,2);
Zang=ADX_GetAngle(Xval, Yval, Zval,0);
GUI_DisplayData();
i = 0;
if(ledState == 0xFE)
{
ledState = 0xFF;
}
else
{
ledState = 0xFE;
}
LED_SetState(ledState);
}
}
}

使用特权

评论回复
30
aizaixiyuanqian|  楼主 | 2018-3-17 20:00 | 只看该作者
智能水杯可以参考下本历程

使用特权

评论回复
31
aizaixiyuanqian|  楼主 | 2018-3-17 20:00 | 只看该作者
这次比较简单就先到这里了

使用特权

评论回复
32
lzbf| | 2018-3-18 22:05 | 只看该作者
这个敏感度怎么样

使用特权

评论回复
33
houjiakai| | 2018-3-18 22:06 | 只看该作者
aizaixiyuanqian 发表于 2018-3-17 17:42
ADXL345 是一款完整的 3 轴加速度测量系统,可选择的测量范围有±2 g,
±4 g,±8 g 或±16 g。既能测量运 ...

范围还有到16g吗

使用特权

评论回复
34
youtome| | 2018-3-18 22:08 | 只看该作者
能够spi读取吗

使用特权

评论回复
35
cemaj| | 2018-3-18 22:09 | 只看该作者
aizaixiyuanqian 发表于 2018-3-17 18:34
设置 ADX345 寄存器
static int8_t ADX345_WriteReg(uint8_t addr, uint8_t dat)
{

没有完整的代码呢

使用特权

评论回复
36
pl202| | 2018-3-18 22:09 | 只看该作者

这个地址怎么定义的?

使用特权

评论回复
37
lzbf| | 2018-3-18 22:11 | 只看该作者
怎么计算角度呢?

使用特权

评论回复
38
houjiakai| | 2018-3-18 22:11 | 只看该作者
aizaixiyuanqian 发表于 2018-3-17 17:42
ADXL345 是一款完整的 3 轴加速度测量系统,可选择的测量范围有±2 g,
±4 g,±8 g 或±16 g。既能测量运 ...

以为正常都是1g左右呢。

使用特权

评论回复
评论
aizaixiyuanqian 2018-3-19 21:45 回复TA
不止1g 
39
youtome| | 2018-3-18 22:11 | 只看该作者
iic的速度比不上spi吧。

使用特权

评论回复
40
pl202| | 2018-3-18 22:11 | 只看该作者

这个INT引脚有什么作用?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则