三轴振动传感器iis3dwbtr的使用(配置寄存器)

一次项目中用到了三轴振动传感器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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今生今世遥不可及

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值