一次项目中用到了三轴振动传感器IIS3DWBTR,网上的例程其实挺少的,大多是使用HAL库版本,HAL库我不了解,于是写了一版标准库函数版本的代码,主要是获取三轴加速度值并通过LORA模块上传到本地配置的ChirpStack服务器(下篇内容会讲到)。
言归正传:这个传感器主要是通过SPI
配置寄存器来设置,读取寄存器信息来读取加速度,至于FIFO,没有用到。1.传感器初始化
spi初始化
void gpio_for_iis3dwbtr_config(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable SPI2 and GPIO clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//PORTB时钟使能
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟
/* Configure iis3dwbtr pins: SCK */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure iis3dwbtr pins: MISO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure iis3dwbtr pins: MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure iis3dwbtr pins: SCS */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);
SPI_SendByte(0xff);
}
iis3dwbtr配置相应的寄存器 对于上面的寄存器看名称对应手册上的名称就知道了
void iis3dwbtr_test(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(0x0D);
SPI_SendByte(0X10);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL6_C);
SPI_SendByte(CTRL6_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL1_XL);
SPI_SendByte(CTRL1_XL_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);;
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL3_C);
SPI_SendByte(CTRL3_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL4_C);
SPI_SendByte(CTRL4_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL5_C);
SPI_SendByte(CTRL5_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL7_C);
SPI_SendByte(CTRL7_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL8_XL);
SPI_SendByte(CTRL8_XL_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(CTRL10_C);
SPI_SendByte(CTRL10_C_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(WAKE_UP_DUR);
SPI_SendByte(WAKE_UP_DUR_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
//fifo
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(INTERRUPTS_EN);
SPI_SendByte(INTERRUPTS_EN_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
//fifo
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(FIFO_CTRL3);
SPI_SendByte(FIFO_CTRL3_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
//fifo
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(FIFO_CTRL4);
SPI_SendByte(FIFO_CTRL4_c);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(10);
}
spi发送相应的寄存器值和相应的赋值,对于这个寄存器
发送的值是#define CTRL3_C 0x12 #define CTRL3_C_c 0x40这两个,就完成了相应寄存器的配置。
2.配置完之后就是读相应寄存器的值了 三轴三个寄存器
if(kedu){
rawX = iis3dwbtr_xget();
rawY = iis3dwbtr_yget();
rawZ = iis3dwbtr_zget();
}
else{
rawX = 0x0009;
rawY = 0x0008;
rawZ = 0x0999;
}
signedValue_x = (int16_t)rawX;
signedValue_y = (int16_t)rawY;
signedValue_z = (int16_t)rawZ;
acceleration_x = ((float)signedValue_x / 32768.0f) * 16.0f;
acceleration_y = ((float)signedValue_y / 32768.0f) * 16.0f;
acceleration_z = ((float)signedValue_z / 32768.0f) * 16.0f;
temp = ds18b20_Get_Temp();
sprintf(outputStr, "X: %.2f; Y: %.2f; Z: %.2f; T: %.2f", acceleration_x, acceleration_y, acceleration_z, temp);
这样做是因为读出来的寄存器的值是补码形式,需要相应的计算转换成浮点数,即我们常见的-0.9g这种形式。
读取相应补码值如下:
uint16_t iis3dwbtr_xget(void)
{
u16 accx = 0;
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(OUTX_H_A);
accx|=SPI_SendByte(0xff)<<8;
GPIO_SetBits(GPIOB,GPIO_Pin_12);
delay_ms(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
SPI_SendByte(OUTX_L_A);
accx|=SPI_SendByte(0xff);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
return accx;
}