소스 검색

cofig samplerate and LPF

Juraj Ďuďák 2 년 전
부모
커밋
56192a4309
2개의 변경된 파일99개의 추가작업 그리고 16개의 파일을 삭제
  1. 18 12
      src/icm20948.c
  2. 81 4
      src/icm20948.h

+ 18 - 12
src/icm20948.c

@@ -81,11 +81,11 @@ void icm20948_init(SPI_HandleTypeDef *hspi, McuPin_typeDef *pinCs, McuPin_typeDe
 	
 	icm20948_spi_slave_enable();
 	
-	icm20948_gyro_low_pass_filter(0);
-	icm20948_accel_low_pass_filter(0);
+	icm20948_gyro_low_pass_filter(_gyro_low_pass_196_6Hz);
+	icm20948_accel_low_pass_filter(_accel_low_pass_246Hz);
 
-	icm20948_gyro_sample_rate_divider(0);
-	icm20948_accel_sample_rate_divider(0);
+	icm20948_gyro_sample_rate_divider(_gyro_samplerate_281_3Hz);
+	icm20948_accel_sample_rate_divider(_accel_samplerate_562_5Hz);
 
 	if(pin_int != NULL){
 		icm20948_set_int();
@@ -325,31 +325,37 @@ void icm20948_odr_align_enable()
 	write_single_icm20948_reg(ub_2, B2_ODR_ALIGN_EN, 0x01);
 }
 
-void icm20948_gyro_low_pass_filter(uint8_t config)
+void icm20948_gyro_low_pass_filter(gyro_dlp_cfg config)
 {
 	uint8_t new_val = read_single_icm20948_reg(ub_2, B2_GYRO_CONFIG_1);
-	new_val |= config << 3;
+//	new_val |= config << 3;
+	new_val = (new_val & 0x06) | config;	// mask Gyro range settings
 
 	write_single_icm20948_reg(ub_2, B2_GYRO_CONFIG_1, new_val);
 }
 
-void icm20948_accel_low_pass_filter(uint8_t config)
+/**
+ * @brief Configure Low-pass filter:
+ * @param config:
+ */
+void icm20948_accel_low_pass_filter(accel_dlp_cfg config)
 {
 	uint8_t new_val = read_single_icm20948_reg(ub_2, B2_ACCEL_CONFIG);
-	new_val |= config << 3;
+//	new_val |= config << 3;
+	new_val = (new_val & 0x06) | config;	// mask Accel range settings
 
 	write_single_icm20948_reg(ub_2, B2_GYRO_CONFIG_1, new_val);
 }
 
-void icm20948_gyro_sample_rate_divider(uint8_t divider)
+void icm20948_gyro_sample_rate_divider(gyro_samplerate divider)
 {
 	write_single_icm20948_reg(ub_2, B2_GYRO_SMPLRT_DIV, divider);
 }
 
-void icm20948_accel_sample_rate_divider(uint16_t divider)
+void icm20948_accel_sample_rate_divider(accel_samplerate smplrt)
 {
-	uint8_t divider_1 = (uint8_t)(divider >> 8);
-	uint8_t divider_2 = (uint8_t)(0x0F & divider);
+	uint8_t divider_1 = (uint8_t)(smplrt >> 8);
+	uint8_t divider_2 = (uint8_t)(0x0F & smplrt);
 
 	write_single_icm20948_reg(ub_2, B2_ACCEL_SMPLRT_DIV_1, divider_1);
 	write_single_icm20948_reg(ub_2, B2_ACCEL_SMPLRT_DIV_2, divider_2);

+ 81 - 4
src/icm20948.h

@@ -88,6 +88,83 @@ typedef enum
 	_16g
 } accel_full_scale;
 
+/**
+ * @brief Acceleroemter settings: register ACCEL_CONFIG_1 (Bank 2).
+ */
+typedef enum
+{
+	/** output rate = 4500Hz */
+	_accel_low_pass_OFF = 0,
+	/** output rate = determined by @ref  icm20948_accel_sample_rate_divider function, @ref accel_samplerate respectivelly */
+	_accel_low_pass_246Hz = 0x9,
+	_accel_low_pass_114_4Hz = 0x11,
+	_accel_low_pass_50_4Hz = 0x19,
+	_accel_low_pass_23_9Hz = 0x21,
+	_accel_low_pass_11_5Hz = 0x29,
+	_accel_low_pass_5_7Hz = 0x31,
+	_accel_low_pass_473Hz = 0x39,
+} accel_dlp_cfg;
+
+
+typedef enum
+{
+	_accel_samplerate_562_5Hz = 1,
+	_accel_samplerate_281_3Hz = 3,
+	_accel_samplerate_187_5Hz = 5,
+	_accel_samplerate_140_6Hz = 7,
+	_accel_samplerate_102_3Hz = 10,
+	_accel_samplerate_70_3Hz = 15,
+	_accel_samplerate_48_9Hz = 22,
+	_accel_samplerate_35_2Hz = 31,
+	_accel_samplerate_17_6Hz = 34,
+	_accel_samplerate_8_8Hz = 127,
+	_accel_samplerate_4_4Hz = 255,
+	_accel_samplerate_2_2Hz = 513,
+	_accel_samplerate_1_1Hz = 1022,
+	_accel_samplerate_0_55Hz = 2044,
+	_accel_samplerate_0_27Hz = 4095,
+
+} accel_samplerate;
+
+typedef enum
+{
+	_gyro_samplerate_562_5Hz = 1,
+	_gyro_samplerate_375_0Hz = 2,
+	_gyro_samplerate_281_3Hz = 3,
+	_gyro_samplerate_225_0Hz = 4,
+	_gyro_samplerate_187_5Hz = 5,
+	_gyro_samplerate_140_6Hz = 7,
+	_gyro_samplerate_125_0Hz = 8,
+	_gyro_samplerate_102_3Hz = 10,
+	_gyro_samplerate_70_3Hz = 15,
+	_gyro_samplerate_66_2Hz = 16,
+	_gyro_samplerate_48_9Hz = 22,
+	_gyro_samplerate_35_2Hz = 31,
+	_gyro_samplerate_34_1Hz = 32,
+	_gyro_samplerate_17_6Hz = 63,
+	_gyro_samplerate_17_3Hz = 64,
+	_gyro_samplerate_4_4Hz = 255,
+} gyro_samplerate;
+
+
+/**
+ * @brief Gyroscope settings: register GYRO_CONFIG_1 (Bank 2).
+ */
+typedef enum
+{
+	/** output rate = 9000Hz */
+	_gyro_low_pass_OFF = 0,
+	/** output rate = determined by @ref  icm20948_gyro_sample_rate_divider function, @ref accel_samplerate respectivelly */
+	_gyro_low_pass_196_6Hz = 0x1,
+	_gyro_low_pass_151_8Hz = 0x09,
+	_gyro_low_pass_119_5Hz = 0x11,
+	_gyro_low_pass_51_2Hz = 0x19,
+	_gyro_low_pass_23_9Hz = 0x21,
+	_gyro_low_pass_11_6Hz = 0x29,
+	_gyro_low_pass_5_7Hz = 0x31,
+	_gyro_low_pass_361_4Hz = 0x39,
+} gyro_dlp_cfg;
+
 
 typedef enum
 {
@@ -144,12 +221,12 @@ void icm20948_i2c_master_clk_frq(uint8_t config); // 0 - 15
 void icm20948_clock_source(uint8_t source);
 void icm20948_odr_align_enable();
 
-void icm20948_gyro_low_pass_filter(uint8_t config); // 0 - 7
-void icm20948_accel_low_pass_filter(uint8_t config); // 0 - 7
+void icm20948_gyro_low_pass_filter(gyro_dlp_cfg config);
+void icm20948_accel_low_pass_filter(accel_dlp_cfg config);
 
 // Output Data Rate = 1.125kHz / (1 + divider)
-void icm20948_gyro_sample_rate_divider(uint8_t divider);
-void icm20948_accel_sample_rate_divider(uint16_t divider);
+void icm20948_gyro_sample_rate_divider(gyro_samplerate divider);
+void icm20948_accel_sample_rate_divider(accel_samplerate smplrt);
 void ak09916_operation_mode_setting(operation_mode mode);
 
 // Calibration before select full scale.