北方 发表于 2017-10-11 16:27

[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指令,
在显示的数据中,还不是很正确,因为很多参数没有正确量化。不过,这个例程,可以供仔细分析和调试了。

okhxyyo 发表于 2017-11-23 11:28

汇总贴: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]
查看完整版本: [X-NUCLEO-IKS01A2测评] 移植IKS01A1例程