/**
   * @brief A function used to configure and init the accelerometer
	 * @param none
	 * @retval none
   */
void configure_init_accelerometer(void)
{
	//Configure the accelerometer initialization struct
	LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25;        /* Ppower down or /active mode with output data rate 3.125 / 6.25 / 12.5 / 25 / 50 / 100 / 400 / 800 / 1600 HZ */
  LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_XYZ_ENABLE;                        /* Axes enable */
  LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Disabled;			/* Block or update Low/High registers of data until all data is read */
	LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_50;													/* Choose anti-aliasing filter BW 800 / 400 / 200 / 50 Hz*/
  LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_2;                        /* Full scale 2 / 4 / 6 / 8 / 16 g */
  LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL;                     /* Self test */
	
	//Configure the accelerometer interrupt struct
	LIS3DSH_IntConfigStruct.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED;     /* Enable/Disable data ready interrupt */
  LIS3DSH_IntConfigStruct.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL;         /* Interrupt Signal Active Low / Active High */
  LIS3DSH_IntConfigStruct.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED;							/* Interrupt type as latched or pulsed */
	
	//Enable the interrupt line
	HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1);
	
	//Initialize the accelerometer
	LIS3DSH_Init(&LIS3DSH_InitStruct);
	
	//Setting the interrupt configuration of the accelerometer
	LIS3DSH_DataReadyInterruptConfig(&LIS3DSH_IntConfigStruct);		
}
/**
  * @brief  Initialize the accelerometer.
  * @param  None
  * @retval None
  */
void Accelerometer_Init(void)
{
	LIS3DSH_InitTypeDef accel_init;
	LIS3DSH_DRYInterruptConfigTypeDef it_config;
	
	accel_init.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25;				/* Output data 25 times per second (25 Hz) as by requirements */
	accel_init.Axes_Enable = LIS3DSH_XYZ_ENABLE;												/* Enable x, y and z axes */
	accel_init.Continous_Update = LIS3DSH_ContinousUpdate_Disabled;			/* Disable continuous update to be able to read the MSB of each reading */
	accel_init.AA_Filter_BW = LIS3DSH_AA_BW_50;													/* Anti-aliasing filter bandwidth set to 50Hz to remove frequencies above 2 * 25Hz */
	accel_init.Full_Scale = LIS3DSH_FULLSCALE_2;												/* Use full scale of +/- 2g */
	accel_init.Self_Test = LIS3DSH_SELFTEST_NORMAL;											/* Self test normal */
	
	/* Initialize LIS3DSH */
	LIS3DSH_Init(&accel_init);
	
	it_config.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED;	/* Enable DRY interrupt */
	it_config.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL;		/* Set interrupt to be active high as by requirements */
	it_config.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED;					/* Set interrupt type to be pulsed as by requirements */
	
	/* Set LIS3DSH interrupt configuration */
	LIS3DSH_DataReadyInterruptConfig(&it_config);
	
	/* Set priority for EXTI0 IRQ */
	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
	
	/* Enable IRQ for the EXTI Line 0 (LSI3DSH generates INT1 interrupt on GPIO_PIN_0 PE0) */
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
void bsp_init() {
	//bsp_led_init();
	bsp_pwm_config();

	bsp_sw_init();
	bsp_timer_config();


	LIS3DSH_Init();
	LIS3DSH_Set_Output(0X47);

}
void accelerometer_init(void) {
	LIS3DSH_InitTypeDef  LIS3DSH_InitStruct;

	/* Set configuration of LIS302DL*/
	LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_100;
	LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_X_ENABLE | LIS3DSH_Y_ENABLE | LIS3DSH_Z_ENABLE;
	LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_4;
	LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_200;
	LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Enabled;
	LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL;
	LIS3DSH_Init(&LIS3DSH_InitStruct);

	/* Enable interrupt when data is ready */	
	LIS3DSH_DRYInterruptConfigTypeDef DRYInterruptConfig;
	DRYInterruptConfig.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED;
	DRYInterruptConfig.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL;
	DRYInterruptConfig.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED;
	LIS3DSH_DataReadyInterruptConfig(&DRYInterruptConfig);
	
	/* Set pin as input */
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOE, &GPIO_InitStruct);
	
	/* Tell system that you will use PE0 for EXTI_Line0 */
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource0);
	
	/* PE0 is connected to EXTI_Line0 */
	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line0;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
	EXTI_Init(&EXTI_InitStruct);

	/* Add IRQ vector to NVIC */
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	
	ma_filter_initialize(&filter_x, &cb_x, x_buffer);
	ma_filter_initialize(&filter_y, &cb_y, y_buffer);
	ma_filter_initialize(&filter_z, &cb_z, z_buffer);
}
Beispiel #5
0
//Initialize the accelerometer
void initAccel()
{
	LIS3DSH_InitTypeDef accel_init;
	
	accel_init.AA_Filter_BW = LIS3DSH_AA_BW_800; //Datasheet says this is the default value so just going to use it b/c not sure why/how AA filter is needed.
	accel_init.Axes_Enable = LIS3DSH_X_ENABLE | LIS3DSH_Y_ENABLE | LIS3DSH_Z_ENABLE; //Need to enable all three axis, bitwise OR to set all three control bits high.
	accel_init.Continous_Update = LIS3DSH_ContinousUpdate_Enabled; //Otherwise output registers not updated until MSB and LSB reading (but shouldn't this param be 0 then?)
	accel_init.Full_Scale = LIS3DSH_FULLSCALE_2; //Tilt angle application notes say typical value is +/- 2g. Maybe increase later if necessary?
	accel_init.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_100; //We will be sampling at 100Hz, so output rate should be the same.
	accel_init.Self_Test = LIS3DSH_SELFTEST_NORMAL;// Positive sign self test, negative sign self test, or normal mode self test...lets stick with normal for now.
	
	LIS3DSH_Init(&accel_init);
}
Beispiel #6
0
void prvMEMS_Config(void)
{
	uint8_t ctrl = 0;

	LIS3DSH_InitTypeDef  LIS3DSH_InitStruct;

    LIS3DSH_InitStruct.SM1_Hysteresis=0x00;
    LIS3DSH_InitStruct.SM1_Pin=LIS3DSH_SM1_INT_TO_PIN_INT1;
    LIS3DSH_InitStruct.SM1_Enable=LIS3DSH_SM1_DISABLE;

    LIS3DSH_InitStruct.SM2_Hysteresis=0x00;
    LIS3DSH_InitStruct.SM2_Pin=LIS3DSH_SM2_INT_TO_PIN_INT1;
    LIS3DSH_InitStruct.SM2_Enable=LIS3DSH_SM2_DISABLE;

    LIS3DSH_InitStruct.CR3_Dren=LIS3DSH_CR3_DREN_TO_INT1_DISABLE;
    LIS3DSH_InitStruct.CR3_Iea=LIS3DSH_CR3_IEA_ACTIVE_LOW;
    LIS3DSH_InitStruct.CR3_Iel=LIS3DSH_CR3_IEL_LATCHED;
    LIS3DSH_InitStruct.CR3_Int2En=LIS3DSH_CR3_INT2_DISABLED;
    LIS3DSH_InitStruct.CR3_Int1En=LIS3DSH_CR3_INT1_DISABLED;
    LIS3DSH_InitStruct.CR3_Vfilt=LIS3DSH_CR3_VFILT_DISABLED;
    LIS3DSH_InitStruct.CR3_Strt=LIS3DSH_CR3_NO_SOFT_RESET;

    LIS3DSH_InitStruct.CR4_Odr=LIS3DSH_CR4_ODR_100HZ;
    LIS3DSH_InitStruct.CR4_Bdu=LIS3DSH_CR4_BDU_ENABLED;
    LIS3DSH_InitStruct.CR4_Zen=LIS3DSH_CR4_Z_AXIS_ENABLED;
    LIS3DSH_InitStruct.CR4_Yen=LIS3DSH_CR4_Y_AXIS_ENABLED;
    LIS3DSH_InitStruct.CR4_Xen=LIS3DSH_CR4_X_AXIS_ENABLED;

    LIS3DSH_InitStruct.CR5_Bw=LIS3DSH_CR5_BW_50HZ;
    LIS3DSH_InitStruct.CR5_Fscale=LIS3DSH_CR5_FSCALE_2G;
    LIS3DSH_InitStruct.CR5_St=LIS3DSH_CR5_ST_DISABLE;
    LIS3DSH_InitStruct.CR5_Sim=LIS3DSH_CR5_MODE_4_WIRE_INTERFACE;

    LIS3DSH_InitStruct.CR6_Boot=LIS3DSH_CR6_FORCE_REBOOT_DISABLE;
    LIS3DSH_InitStruct.CR6_FifoEn=LIS3DSH_CR6_FIFO_DISABLED;
    LIS3DSH_InitStruct.CR6_WtmEn=LIS3DSH_CR6_WTM_DISABLED;
    LIS3DSH_InitStruct.CR6_AddInc=LIS3DSH_CR6_ADDINC_DISABLED;
    LIS3DSH_InitStruct.CR6_P1Empty=LIS3DSH_CR6_FIFO_EMPTY_TO_INT1_DISABLED;
    LIS3DSH_InitStruct.CR6_P1Wtm=LIS3DSH_CR6_FIFO_WTM_TO_INT1_DISABLED;
    LIS3DSH_InitStruct.CR6_P1OverRun=LIS3DSH_CR6_FIFO_OVERRUN_TO_INT1_DISABLED;
    LIS3DSH_InitStruct.CR6_P2Boot=LIS3DSH_CR6_BOOT_TO_INT2_DISABLED;

	
	LIS3DSH_Init(&LIS3DSH_InitStruct);	
}
/*Configure the accelerometer
	*/
void Configure_Accel(void)
{
	LIS3DSH_InitStruct.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25;
	LIS3DSH_InitStruct.Axes_Enable = LIS3DSH_X_ENABLE | LIS3DSH_Y_ENABLE | LIS3DSH_Z_ENABLE;
	LIS3DSH_InitStruct.Full_Scale = LIS3DSH_FULLSCALE_4;
	LIS3DSH_InitStruct.AA_Filter_BW = LIS3DSH_AA_BW_200;
	LIS3DSH_InitStruct.Continous_Update = LIS3DSH_ContinousUpdate_Disabled;
	LIS3DSH_InitStruct.Self_Test = LIS3DSH_SELFTEST_NORMAL;
	
	
	DRYInterruptConfig.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED;
	DRYInterruptConfig.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL;
	DRYInterruptConfig.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED;
	
	
	LIS3DSH_DataReadyInterruptConfig(&DRYInterruptConfig);
	LIS3DSH_Init(&LIS3DSH_InitStruct);	
	
	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
	
}
Beispiel #8
0
void memsinit(void){

  LIS3DSH_InitTypeDef meminit;
  LIS3DSH_DRYInterruptConfigTypeDef intinit;

  meminit.Continous_Update = LIS3DSH_ContinousUpdate_Disabled;
  meminit.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25;
  meminit.AA_Filter_BW = LIS3DSH_AA_BW_800;
  meminit.Axes_Enable = LIS3DSH_XYZ_ENABLE;
  meminit.Full_Scale = LIS3DSH_FULLSCALE_2;
  meminit.Self_Test = LIS3DSH_SELFTEST_NORMAL;
  
  LIS3DSH_Init(&meminit);

  intinit.Dataready_Interrupt = LIS3DSH_DATA_READY_INTERRUPT_ENABLED;
  intinit.Interrupt_signal = LIS3DSH_ACTIVE_HIGH_INTERRUPT_SIGNAL;
  intinit.Interrupt_type = LIS3DSH_INTERRUPT_REQUEST_PULSED;
  
  LIS3DSH_DataReadyInterruptConfig(&intinit);

  
}
/**
* @brief Initialise the Accelerometer
* @param None
* @retval None
*/
void Accelerometer_Config(void) {

	/* initialise accelerometer */
	LIS3DSH_InitTypeDef Acc_InitDef;

	/* define field of the accelerometer initialisation structure */
	Acc_InitDef.Power_Mode_Output_DataRate = LIS3DSH_DATARATE_25;      									/* 25Hz */
	Acc_InitDef.Axes_Enable = LIS3DSH_XYZ_ENABLE;                     									/* XYZ */
	Acc_InitDef.Continous_Update = LIS3DSH_ContinousUpdate_Disabled;										/* continuous update */
	Acc_InitDef.AA_Filter_BW = LIS3DSH_AA_BW_50;																				/* 50Hz to filter gravity*/
	Acc_InitDef.Full_Scale = LIS3DSH_FULLSCALE_2;																				/* 2g */

	LIS3DSH_Init(&Acc_InitDef);

	/* Init Kalman Filter for the accelerometer */
	xState = malloc(sizeof(kalmanState));
	yState = malloc(sizeof(kalmanState));
	zState = malloc(sizeof(kalmanState));
	kalmanInit(xState, INIT_q, INIT_r, INIT_x, INIT_p, INIT_k);
	kalmanInit(yState, INIT_q, INIT_r, INIT_y, INIT_p, INIT_k);
	kalmanInit(zState, INIT_q, INIT_r, INIT_z, INIT_p, INIT_k);
}