[X-NUCLEO-IKS01A2测评] 移植IKS01A1例程
1、在mbed上的例程是基于X-NUCLEO-IKS01A1的,其中因为元件差别比较大,除了温湿度和压力传感器以外都是新的型号。所以在上一次评测中,只能使用温度数据的读出。这次移植了该例程,并导入了新的库,测试成功。
2. 代码
/* Includes */
#include "mbed.h"
#include "XNucleoIKS01A2.h"
/* Instantiate the expansion board */
static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance();
/* Retrieve the composing elements of the expansion board */
static GyroSensor *gyroscope = mems_expansion_board->acc_gyro;
static MotionSensor *accelerometer = mems_expansion_board->accelerometer;
static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
/* Helper function for printing floats & doubles */
static char *printDouble(char* str, double v, int decimalDigits=2)
{
int i = 1;
int intPart, fractPart;
int len;
char *ptr;
/* prepare decimal digits multiplicator */
for (;decimalDigits!=0; i*=10, decimalDigits--);
/* calculate integer & fractinal parts */
intPart = (int)v;
fractPart = (int)((v-(double)(int)v)*i);
/* fill in integer part */
sprintf(str, "%i.", intPart);
/* prepare fill in of fractional part */
len = strlen(str);
ptr = &str;
/* fill in leading fractional zeros */
for (i/=10;i>1; i/=10, ptr++) {
if(fractPart >= i) break;
*ptr = '0';
}
/* fill in (rest of) fractional part */
sprintf(ptr, "%i", fractPart);
return str;
}
/* Simple main function */
int main() {
uint8_t id;
float value1, value2;
char buffer1, buffer2;
int32_t axes;
printf("\r\n--- Starting new run ---\r\n");
humidity_sensor->read_id(&id);
printf("HTS221humidity & temperature = 0x%X\r\n", id);
pressure_sensor->read_id(&id);
printf("LPS25Hpressure & temperature = 0x%X\r\n", id);
magnetometer->read_id(&id);
printf("LIS3MDL magnetometer = 0x%X\r\n", id);
gyroscope->read_id(&id);
printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
wait(3);
while(1) {
printf("\r\n");
temp_sensor1->get_temperature(&value1);
humidity_sensor->get_humidity(&value2);
printf("HTS221: %7s°C, %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
temp_sensor2->get_fahrenheit(&value1);
pressure_sensor->get_pressure(&value2);
printf("LPS25H: %7s°F, %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
printf("---\r\n");
magnetometer->get_m_axes(axes);
printf("LIS3MDL :%7ld, %7ld, %7ld\r\n", axes, axes, axes);
accelerometer->get_x_axes(axes);
printf("LSM6DS0 : %7ld, %7ld, %7ld\r\n", axes, axes, axes);
gyroscope->get_g_axes(axes);
printf("LSM6DS0 : %7ld, %7ld, %7ld\r\n", axes, axes, axes);
wait(1.5);
}
}
3. 分析
其中的创建instance是关键,这次的范例,在没有设定引脚的null参数下,也判读后创建,避免了自己引脚不熟悉的结果,其中I2C用的是D14和D15
static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance()
之后,需要声明传感器的读取变量,
/* Retrieve the composing elements of the expansion board */
static GyroSensor *gyroscope = mems_expansion_board->acc_gyro;
static MotionSensor *accelerometer = mems_expansion_board->accelerometer;
static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
这些传感器都在声明变量的时候初始化了,因此,不必再设定init指令,
在显示的数据中,还不是很正确,因为很多参数没有正确量化。不过,这个例程,可以供仔细分析和调试了。
汇总贴:X-NUCLEO-IKS01A2测评
https://bbs.eeworld.com.cn/thread-568428-1-1.html
个人汇总贴:
—by 北方
https://bbs.eeworld.com.cn/thread-567445-1-1.html
页:
[1]