hujj

  • 2019-08-28
  • 加入了学习《《小水电站自动控制》项目演示》,观看 《家庭智能监控》项目演示

  • 2019-08-25
  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器的应用

    这是应用项目的压缩包:  

  • 2019-08-24
  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器的应用

        打包上传应用测试的word文件。

  • 发表了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器的应用

        自从X-NUCLEO-IKS01A3测试板上的各个传感器分别测试成功后,便开始了应用的尝试。由于传感器评估板体积不小,不方便做穿戴式或便携式的应用,因此我的应用项目仅仅是将传感器的检测数据集中显示。受到LCD5110显示屏幕所限,一次无法显示太多的内容,只好通过分屏显示来实现。为了方便应用,我还开启了RTC日历功能,通过SysTick的毫秒计时,进行秒计时,每满60秒读取一次RTC数据,更新年月日时分秒数据。整个应用的功能大致安排如下: 1、温湿度及气压检测显示; 2、磁场方向检测显示; 3、加速度运动检测显示; 4、放置方位检测显示; 5~10、调整年月日时分数值界面; 11、联机自动传送; 12~15、前四项检测显示自动循环,每隔10秒自动切换一次检测显示内容。 各项功能的切换是通过用户按键来完成的,长按按键可以进行功能切换。   下图是开机时的界面: 系统进入主循环后,首个屏幕是显示温度、湿度和气压数据,如下图所示,这些数据每秒更新一次。 通过按下用户按键就可以进入下一显示界面。第二屏幕显示的是磁场方向,如下图所示: 从磁场强度的x,y,z轴数据来辨别方向花费了我不少的时间,我通过量角器确定好方位,然后每次旋转评估板10度,记录一次x,y,z三轴的数值。 首先确定好方位,然后记录x,y,z轴的数值: 通过统计观测发现方向主要与x,y轴数值相关,与z轴的数值关系不明显,参见下表:   我将上述x,y轴的数据标注在直角坐标系中,可以看出数值集中在第三、四象限上,方位基本形成了一个圆形。我按照十六方位进行了粗略的划分(下图黄色分界线所示,红点表示需要得到的方位),通过获得的x,y值来大致判断评估测试板的方位朝向。由于不需要精密显示,基本上可以满足评测需要。 下图是测试过程中的部分图片:   第三个屏幕是加速度运动数值显示,在这个状态下可以粗略地记录评测板的运动,只要晃动评估板,运动数值就会自动增加。 第四个屏幕是显示评估板的放置位置,可以显示出评估板是平放、侧立或者是反面放置。这个功能作为无人机飞行器的姿态监测可能作用更大,在我当前的应用中没有什么实质意义。   本来还准备添加一个振动检测的界面,但多次测试均不理想,而且功能与加速度运动有相似之处,最后放弃了。 下面是日期时间设置的界面,此处简单略过,不作细述。     之后的功能是自动连机通讯,即在电脑上图形显示传感器的部分数据; 在这个模式下,启动电脑上的Unicleo-GUI程序,连接评估板即可,参见下图: 最后是自动循环功能,进入这个功能后,每隔10秒钟自动切换显示内容,即在温湿度气压显示、磁场方向显示、运动监测显示和评估板姿态显示之间循环切换。在进入自动循环功能后长按用户按键即可退出自动循环,进入到第一个显示温湿度气压的界面。 下图是自动循环功能中显示温湿度及气压值: 下一步的应用是准备用这个评估板做一个家庭安防用的智能小车,利用磁场方位来引导小车自运巡航,已经着手在准备材料,后续进展会随时跟进的。       此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-08-19
  • 回复了主题帖: 基于STM32F103的血氧心率监测装置

    不!努力 发表于 2019-8-19 15:06 我使用这些算法,心率和血氧的数据始终不稳定,是怎么回事呢?哪位大神可以指点指点?谢谢!
        我是直接用下载的程序,监测和计算部分未作任何修改。从代码初步分析的结果,程序是将测得的最后500组数据加权平均得到结果,下次剔除最早的一部分数据,然后补充新获得的数据再计算加权平均数,这样就平滑了数据的波动。

  • 回复了主题帖: 基于STM32F103的血氧心率监测装置

    tangjch11 发表于 2019-6-22 17:13 了解了!多谢你的分享! 另外你LCD 显示那个心率的柱状条 是根据那个值进行实时更新显示的了?还是固定显 ...
    是根据LED的pwm值,这个值是根据心率数据计算的,这个计算是原程序就有的。

  • 2019-08-12
  • 回复了主题帖: 依据X-NUCLEO-IKS01A3磁场强度数值辨别方向

    dcexpert 发表于 2019-8-12 16:04 磁场传感器做指南针时,需要先校正,不然误差很大。在microbit中是通过加速度传感器辅助校正的,具体算法应 ...
    谢谢指点!我再试试其他的校准范例。 目前测试只是定位16个方向,即东、南、西、北、东北、东南、西北、西南、东偏南、东偏北、南偏东、南偏西、西偏南、西偏北、北偏西、北偏东等,没有要求太高的精度。

  • 发表了主题帖: 依据X-NUCLEO-IKS01A3磁场强度数值辨别方向

        X-NUCLEO-IKA01A3的磁力传感器得到的强度有x,y,z三个数值,经过测试,变动方向主要会影响数据x,y,而数据z的影响不大,为了找出x,y数值与方向之间的关系,我用开发板做了简易的测试,用量角器固定好南北方向,如下图:       然后每隔10度记录一次x,y的数值,为了让数据更可靠,我记录了两遍完整的数据。     之后在平面直角坐标系中依次将x,y标注好,发现这些数据分布在三、四象限上,正好形成了一个圆形,见下图:     我再按照16个方向测得的数据标注在坐标中(红色),并按照黄色作为各个方向的分界线,最后实现了根据磁力传感器数据用汉字显示方位。下面是显示的部分照片:     下面是根据x,y数值辨别和显示方向的代码: void display_direction(int x,int y) //根据磁场强度x,y值判断方位,并在固定位置显示汉字 { LCD_write_BG(45,2,(uint8_t *)" "); if(y > -225){ if(x < -220) LCD_write_BG(45,2,(uint8_t *)"北偏东"); else if(x < -150) LCD_write_BG(45,2,(uint8_t *)"东北"); else if(x < -50) LCD_write_BG(45,2,(uint8_t *)"东偏北"); else if(x < 55) LCD_write_BG(45,2,(uint8_t *)"正东"); else if(x < 150) LCD_write_BG(45,2,(uint8_t *)"东偏南"); else LCD_write_BG(45,2,(uint8_t *)"东南"); } else if(y < -510){ if(x < -115) LCD_write_BG(45,2,(uint8_t *)"西偏北"); else if( x < -25) LCD_write_BG(45,2,(uint8_t *)"正西"); else if(x < 75) LCD_write_BG(45,2,(uint8_t *)"西偏南"); else LCD_write_BG(45,2,(uint8_t *)"西南"); } else if(y < -420){ if(x > 0) LCD_write_BG(45,2,(uint8_t *)"南偏西"); else LCD_write_BG(45,2,(uint8_t *)"西北"); } else if(x > 0){ if(y > -315) LCD_write_BG(45,2,(uint8_t *)"南偏东"); else LCD_write_BG(45,2,(uint8_t *)"正南"); } else if(y > -330) LCD_write_BG(45,2,(uint8_t *)"正北"); else LCD_write_BG(45,2,(uint8_t *)"北偏西"); }     尽管这个实验的实用价值不高,但通过实验可以初步了解磁力传感器。另外由于所处的经纬度不同,可能也会引起数据的变化。 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-08-11
  • 回复了主题帖: 打样了一块PCB扩展板

    littleshrimp 发表于 2019-8-10 19:47 很不错,直插的器件和模块以后调试起来会很方便 现在使用的很多都是贴子元件有时候想测试一些功能搭电路 ...
    自己画一块,首次花费的时间可能多些,以后若再添加新的元器件,修改PCB板就花不了什么时间。我在空闲位置全部布置了空焊盘,以后若修改线路时,去掉相应的空焊盘就行。

  • 回复了主题帖: 打样了一块PCB扩展板

    qwqwqw2088 发表于 2019-8-10 18:00 很有借鉴意义 这块打样的PCB扩展板, 看这尺寸不小 5元优惠打样的?
    控制在10*8厘米,5元包邮,比自己用洞洞板搭焊更方便可靠,成本也差不多。

  • 2019-08-10
  • 发表了主题帖: 打样了一块PCB扩展板

        为了方便测试,设计打样了一块PCB扩展板。板上对应STM32F401开发板的排针引脚设计了排母,以便开发板可以直接插在扩展板上,其他的元件如LCD显示屏等也可以插接在扩展板上。板上还预留有DS1302及CR2032电池座、AT24C02芯片、CH340G串口转换芯片、miniUSB接口等位置,需要时可添加到扩展板上。同时在空闲的地方还布置了不少空焊盘,方便添加其他元件或改动线路用。这个扩展板不仅本次测试可用,以后还可以用于其他测试,免得用太多的杜邦线连接,也方便固定相应的元器件。     这是扩展板的正面:     这是反面:     焊接了LED灯和部分排母后:     插上了开发板及X-NUCLEO-IKS01A3测试板:     插上LCD显示屏后上电试机: 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 2019-08-01
  • 发表了主题帖: X-NUCLEO-IKS01A3的应用尝试

        在各个传感器都测试了一遍之后,便开始着手应用的尝试,首先是准备将传感器的数据集中显示,由于显示屏太小,只得分屏显示,第一屏显示的是温度湿度和气压(见下图): 第二屏显示的是磁场强度: 第三屏显示的是加速度数据:     第四屏显示的是方向位置:     为了更具有实用价值,我还利用了RTC的日历时钟功能,在屏幕的最底行显示日期时间。上述屏幕的切换可以通过用户按键来实现,也可以利用时钟功能每隔10秒切换一次。为了能调整日历时钟,我还启用了多功能按键,根据按键时长来实现不同的功能。下面是日历时钟的调整界面,当前被调整的项目会闪烁提示:   本来准备利用磁场强度来判断方向,但弄了几天都不成功,一直没能找到检测数据与方向之间的关系。直接显示6D方向的调试也没有取得成功,将原来测试通过的程序复制移植过来,也因为各种原因没有调试成功。总之这个应用尝试除了温湿度和气压有实用价值外,其他的传感器数值还没有利用上,还需要继续调试。 然后我又编译下载了DataLogFusion应用例程,然后启动PC机上的Unicleo_GUI程序,连接之后便出现下列界面: 之后点击“Start”,再点击窗口左边的菜单条,最下的图标,出现下面的茶壶,转动开发板,茶壶也跟随着变换方位,效果非常好,可就是在自己的程序中无法实现。     这是移动开发板时数据在直角坐标系中的显示图: 在下图中,蓝色的圆圈轨迹就是我转动开发板时产生的。 下图是GUI程序接收到的传感器数据,程序应该就是依据这些信息分析计算得到的,只是我目前尚不明白这些数据之间的关系,无法将这些数据用在自己的应用程序中。 调试还在继续,进展情况会陆续跟进。 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-07-27
  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之一 STTS751温度传感器测试

    hehung 发表于 2019-7-27 12:14 可以,麻烦你了,我的邮箱是:1398660197@qq.com,谢谢
    已发邮件,请注意查收,超大邮件有时间限制,过期自动删除。 也可以到此链接下载版主上传的:http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=1084046&page=1#pid2889321  

  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之一 STTS751温度传感器测试

    原包已经被我删除,在用的压缩后有181M,无法上传到论坛,可给邮箱,看看能否发送。

  • 回复了主题帖: 求X-CUBE-MEMS1固件包

    是STM32CubeExpansion_MEMS1_V6.2.0.压缩包吗?原版的已经被我删除,在用的压缩之后仍有181M,无法上传到资源。

  • 2019-07-25
  • 发表了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之七LSM6DSO点击测试

        今天继续进行LSM6DSO的点击测试,按照范例,启动单片机后,按动用户按钮,依次进入单击状态、双击状态和停止状态,在单击状态时,敲击开发板,程序能识别,在双击状态时必须双击开发板程序才能识别,在停止状态时不识别敲击。为了让测试更直观,我添加了一个变量来记录敲击次数,并显示在屏幕的右下角。切换状态时,计数值清零。     下图为测试过程:     这是进入等待用户按键状态的界面:     按下用户按键,依次进入单击状态、双击状态和停止状态:     下面是单击计数:     下面是双击计数:     下面是添加了LCD显示代码的函数: /** * @brief Process of the LSM6DSO Single and Double Tap Detection application * @retval None */ void MX_IKS01A3_LSM6DSO_SingleDoubleTap_Process(void) { IKS01A3_MOTION_SENSOR_Event_Status_t status; if (PushButtonDetected != 0U) { /* Debouncing */ HAL_Delay(50); /* Wait until the button is released */ while ((BSP_PB_GetState( BUTTON_KEY ) == PushButtonState)); /* Debouncing */ HAL_Delay(50); /* Reset Interrupt flag */ PushButtonDetected = 0; /* Enable/Disable single and double tap detection */ if (mode == MODE_DEFAULT) { SingleTapModeRequest = 1; LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"现在可以单击"); count = 0; } else if (mode == MODE_SINGLE_TAP) { DoubleTapModeRequest = 1; LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"现在可以双击"); count = 0; } else { DefaultModeRequest = 1; LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"停止接收点击"); count = 0; } } if (MemsEventDetected != 0U) { MemsEventDetected = 0; if (mode == MODE_SINGLE_TAP) { if (IKS01A3_MOTION_SENSOR_Get_Event_Status(IKS01A3_LSM6DSO_0, &status) != BSP_ERROR_NONE) { Error_Handler(); } LCD_write_BG(0,4,(uint8_t *)"收到单击信号"); count++; LCD_write_value(72,5,2,0,0,count); if (status.TapStatus != 0U) { BSP_LED_On(LED2); HAL_Delay(SINGLE_TAP_INDICATION_DELAY); BSP_LED_Off(LED2); HAL_Delay(INDICATION_WAIT_DELAY); } } else if (mode == MODE_DOUBLE_TAP) { if (IKS01A3_MOTION_SENSOR_Get_Event_Status(IKS01A3_LSM6DSO_0, &status) != BSP_ERROR_NONE) { Error_Handler(); } LCD_write_BG(0,4,(uint8_t *)"收到双击信号"); count++; LCD_write_value(72,5,2,0,0,count); if (status.DoubleTapStatus != 0U) { BSP_LED_On(LED2); HAL_Delay(DOUBLE_TAP_INDICATION_DELAY); BSP_LED_Off(LED2); HAL_Delay(INDICATION_WAIT_DELAY); BSP_LED_On(LED2); HAL_Delay(DOUBLE_TAP_INDICATION_DELAY); BSP_LED_Off(LED2); HAL_Delay(INDICATION_WAIT_DELAY); } } else { /* Do nothing */ } } if (SingleTapModeRequest != 0U) { if (IKS01A3_MOTION_SENSOR_Enable_Single_Tap_Detection(IKS01A3_LSM6DSO_0, IKS01A3_MOTION_SENSOR_INT1_PIN) != BSP_ERROR_NONE) { Error_Handler(); } mode = MODE_SINGLE_TAP; SingleTapModeRequest = 0; } if (DoubleTapModeRequest != 0U) { if (IKS01A3_MOTION_SENSOR_Disable_Single_Tap_Detection(IKS01A3_LSM6DSO_0) != BSP_ERROR_NONE) { Error_Handler(); } if (IKS01A3_MOTION_SENSOR_Enable_Double_Tap_Detection(IKS01A3_LSM6DSO_0, IKS01A3_MOTION_SENSOR_INT1_PIN) != BSP_ERROR_NONE) { Error_Handler(); } mode = MODE_DOUBLE_TAP; DoubleTapModeRequest = 0; } if (DefaultModeRequest != 0U) { if (IKS01A3_MOTION_SENSOR_Disable_Double_Tap_Detection(IKS01A3_LSM6DSO_0) != BSP_ERROR_NONE) { Error_Handler(); } mode = MODE_DEFAULT; DefaultModeRequest = 0; } } 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 2019-07-24
  • 发表了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之六LSM6DSO计步测试

        今天测试了【3D加速度+3D陀螺仪-LSM6DSO】的计步例程,下面是测试的过程:     摇晃开发板来模拟步行,计数便显示在屏幕上:     通过口助手观看输出信息:     目前只是简单地将范例中的串口输出信息显示在LCD屏幕上,还不清楚计步的算法。 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-07-23
  • 发表了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之五L

    本帖最后由 hujj 于 2019-7-23 17:31 编辑     完成了磁力计的测试之后,今天进行了最后的LSM6DSO传感器的测试,本次测试的例程仍然是6D方向,测试过程非常顺利,照例是添加搜索路径、添加LCD驱动和显示的代码,根据需要添加了部分汉字字库,由于我在程序中使用的是12*14点阵字库,需要从12*12点阵的字模修改过来,这个过程花费了一些时间。下面是测试过程的照片:     这是平放时检测信息:     下面是卧放时的照片,我是用手举着,手机从下往上拍摄的:     这是正立时的照片:     这是倒立时的照片:     下面是右侧立时的照片:     最后是左侧立时的照片:     以下是添加了LCD显示代码的相关函数原码: /** * @brief Send actual 6D orientation to UART * @retval None */ static void Send_Orientation(void) { uint8_t xl = 0; uint8_t xh = 0; uint8_t yl = 0; uint8_t yh = 0; uint8_t zl = 0; uint8_t zh = 0; if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_XL(IKS01A3_LSM6DSO_0, &xl) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation XL axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"XL 轴数据错误"); return; } if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_XH(IKS01A3_LSM6DSO_0, &xh) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation XH axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"XH 轴数据错误"); return; } if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_YL(IKS01A3_LSM6DSO_0, &yl) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation YL axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"YL 轴数据错误"); return; } if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_YH(IKS01A3_LSM6DSO_0, &yh) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation YH axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"YH 轴数据错误"); return; } if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_ZL(IKS01A3_LSM6DSO_0, &zl) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation ZL axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"ZL 轴数据错误"); return; } if (IKS01A3_MOTION_SENSOR_Get_6D_Orientation_ZH(IKS01A3_LSM6DSO_0, &zh) != BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "Error getting 6D orientation ZH axis from LSM6DSO - accelerometer.\r\n"); printf("%s", dataOut); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"ZH 轴数据错误"); return; } if (xl == 0U && yl == 0U && zl == 0U && xh == 0U && yh == 1U && zh == 0U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n ________________ " \ "\r\n | | " \ "\r\n | * | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n |________________| \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"YH 右侧立方向"); } else if (xl == 1U && yl == 0U && zl == 0U && xh == 0U && yh == 0U && zh == 0U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n ________________ " \ "\r\n | | " \ "\r\n | * | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n |________________| \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"XL 倒立方向"); } else if (xl == 0U && yl == 0U && zl == 0U && xh == 1U && yh == 0U && zh == 0U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n ________________ " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | * | " \ "\r\n |________________| \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"XH 正立方向"); } else if (xl == 0U && yl == 1U && zl == 0U && xh == 0U && yh == 0U && zh == 0U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n ________________ " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | | " \ "\r\n | * | " \ "\r\n |________________| \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"YL 左侧立方向"); } else if (xl == 0U && yl == 0U && zl == 0U && xh == 0U && yh == 0U && zh == 1U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n __*_____________ " \ "\r\n |________________| \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"ZH 正面朝上"); } else if (xl == 0U && yl == 0U && zl == 1U && xh == 0U && yh == 0U && zh == 0U) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n ________________ " \ "\r\n |________________| " \ "\r\n * \r\n"); LCD_clear_line(4); LCD_clear_line(5); LCD_write_BG(0,4,(uint8_t *)"ZL 背面朝上"); } else { //LSM6DSO-加速度计中未设置任何6D方向轴。 (void)snprintf(dataOut, MAX_BUF_SIZE, "None of the 6D orientation axes is set in LSM6DSO - accelerometer.\r\n"); } printf("%s", dataOut); }   此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 发表了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之四LIS2MDL磁力计测试

        测试LIS2MDL磁力计花费了几天的时间,主要是在数据的显示时遇到了坑,从传感器返回的值是16位带符号的整数,开始我按二进制方式,大于32767的就按负数进行换算,但总是没有达到目的,折腾了许多才反映过来应该直接判断是否小于零,最后达到了目的,显示的结果与串口输出结果完全一致。下图是串口输出的测试结果:     这是LCD显示的结果,显示分两个屏幕,第一屏显示轴向、自测前数据和自测数据。     第二屏显示三个轴向的自测前后数据差和下限、上限:     下图是测试时的照片:     这是开机屏幕:     现在还不清楚自测前后的数据表示什么,在测试中,如果开发不移动,每次测试返回的值都有少许差别,如果移动了位置则差别较大,目前仍在继续测试中,看能否弄清楚数值与位置或方向之间的规律。     下面是添加了显示的代码: /** * @brief Performs LIS2MDL magnetometer self-test执行Lis2Mdl磁强计自检 * @retval BSP status */ static int32_t LIS2MDL_SelfTest(void) { int32_t test_result = BSP_ERROR_NONE; uint32_t i; IKS01A3_MOTION_SENSOR_Axes_t data_nost; IKS01A3_MOTION_SENSOR_Axes_t data_st; IKS01A3_MOTION_SENSOR_Axes_t data; uint8_t prev_reg_values[ST_REG_COUNT]; int32_t ret; int16_t temp; (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\nStarting LIS2MDL magnetometer self-test ...\r\nKeep the device still!!!\r\n"); printf("%s", dataOut); HAL_Delay(INDICATION_DELAY); BSP_LED_On(LED2); /* Store current settings of the sensor 存储传感器的当前设置*/ for (i = 0; i < ST_REG_COUNT; i++) { if ((ret = IKS01A3_MOTION_SENSOR_Read_Register(IKS01A3_LIS2MDL_0, reg_addr, &prev_reg_values)) != BSP_ERROR_NONE) { return ret; } } /* Set the sensor for self-test 设置传感器进行自检*/ for (i = 0; i < ST_REG_COUNT; i++) { if ((ret = IKS01A3_MOTION_SENSOR_Write_Register(IKS01A3_LIS2MDL_0, reg_addr, st_reg_values)) != BSP_ERROR_NONE) { return ret; } } /* Wait defined time for stable output 等待确定的稳定输出时间*/ HAL_Delay(POWER_UP_DELAY); /* Read first data and discard it 读取第一个数据并丢弃它*/ if (LIS2MDL_M_Get_Data(&data) != BSP_ERROR_NONE) { Error_Handler(); } data_nost.x = 0; data_nost.y = 0; data_nost.z = 0; /* Read valid data multiple times and average it 多次读取有效数据并取其平均值*/ for (i = 0; i < (uint32_t)N_SAMPLES; i++) { if (LIS2MDL_M_Get_Data(&data) != BSP_ERROR_NONE) { Error_Handler(); } data_nost.x += data.x; data_nost.y += data.y; data_nost.z += data.z; } data_nost.x /= N_SAMPLES; data_nost.y /= N_SAMPLES; data_nost.z /= N_SAMPLES; /* Enable self-test 启用自检*/ if ((ret = IKS01A3_MOTION_SENSOR_Set_SelfTest(IKS01A3_LIS2MDL_0, MOTION_MAGNETO, 1)) != BSP_ERROR_NONE) { return ret; } /* Wait defined time for stable output */ HAL_Delay(ST_ENABLED_DELAY); /* Read first data and discard it 读取第一个数据并丢弃它*/ if (LIS2MDL_M_Get_Data(&data) != BSP_ERROR_NONE) { Error_Handler(); } data_st.x = 0; data_st.y = 0; data_st.z = 0; /* Read valid data multiple times and average it 多次读取有效数据并取其平均值*/ for (i = 0; i < (uint32_t)N_SAMPLES; i++) { if (LIS2MDL_M_Get_Data(&data) != BSP_ERROR_NONE) { Error_Handler(); } data_st.x += data.x; data_st.y += data.y; data_st.z += data.z; } data_st.x /= N_SAMPLES; data_st.y /= N_SAMPLES; data_st.z /= N_SAMPLES; /* Restore previous settings of the sensor 恢复传感器以前的设置*/ for (i = 0; i < ST_REG_COUNT; i++) { if ((ret = IKS01A3_MOTION_SENSOR_Write_Register(IKS01A3_LIS2MDL_0, reg_addr, prev_reg_values)) != BSP_ERROR_NONE) { return ret; } } /* Evaluate the test 评估测试*/ if (abs(data_st.x - data_nost.x) < LO_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } if (abs(data_st.x - data_nost.x) > HI_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } if (abs(data_st.y - data_nost.y) < LO_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } if (abs(data_st.y - data_nost.y) > HI_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } if (abs(data_st.z - data_nost.z) < LO_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } if (abs(data_st.z - data_nost.z) > HI_LIM) { test_result = BSP_ERROR_COMPONENT_FAILURE; } /* Print measured data 打印测量数据*/ (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\nMeasured magnetic field [mgauss]:\r\n"); //测量磁场: 轴,自测前,自测 printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n AXIS | PRE-SELFTEST | SELFTEST\r\n"); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "--------------|--------------|--------------\r\n"); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, " X | %8ld | %8ld\r\n", data_nost.x, data_st.x); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, " Y | %8ld | %8ld\r\n", data_nost.y, data_st.y); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, " Z | %8ld | %8ld\r\n", data_nost.z, data_st.z); printf("%s", dataOut); //添加LCD显示的代码开始 LCD_clear(); LCD_write_BG(10,0,(uint8_t *)"磁场传感器"); LCD_write_ASCII(0,2,(uint8_t *)"PRE-SEL. SELF."); LCD_write_ASCII(0,3,(uint8_t *)"X"); LCD_write_ASCII(0,4,(uint8_t *)"Y"); LCD_write_ASCII(0,5,(uint8_t *)"Z"); if(data_nost.x < 0){ LCD_write_value(15,3,5,0,0,65536 - data_nost.x); LCD_write_ASCII(15,3,(uint8_t *)"-"); } else LCD_write_value(15,3,5,0,0,data_nost.x); if(data_st.x < 0){ LCD_write_value(50,3,5,0,0,65536 - data_st.x); LCD_write_ASCII(50,3,(uint8_t *)"-"); } else LCD_write_value(50,3,5,0,0,data_st.x); if(data_nost.y < 0){ LCD_write_value(15,4,5,0,0,65536 - data_nost.y); LCD_write_ASCII(15,4,(uint8_t *)"-"); } else LCD_write_value(15,4,5,0,0,data_nost.y); if(data_st.y < 0){ LCD_write_value(50,4,5,0,0,65536 - data_st.y); LCD_write_ASCII(50,4,(uint8_t *)"-"); } else LCD_write_value(50,4,5,0,0,data_st.y); if(data_nost.z < 0){ LCD_write_value(15,5,5,0,0,65536 - data_nost.z); LCD_write_ASCII(15,5,(uint8_t *)"-"); } else LCD_write_value(15,5,5,0,0,data_nost.z); if(data_st.z < 0){ LCD_write_value(50,5,5,0,0,65536 - data_st.z); LCD_write_ASCII(50,5,(uint8_t *)"-"); } else LCD_write_value(50,5,5,0,0,data_st.z); //添加LCD显示的代码结束 /* Print test limits and data 打印测试限值和数据*/ (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\nTest limits and data [mgauss]:\r\n"); //试验限值和数据: 下限,差异,上限 printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\n LOW LIMIT | DIFFERENCE | HIGH LIMIT\r\n"); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "--------------|--------------|--------------\r\n"); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "%8d | %8d | %8d\r\n", LO_LIM, (int)abs(data_st.x - data_nost.x), HI_LIM); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "%8d | %8d | %8d\r\n", LO_LIM, (int)abs(data_st.y - data_nost.y), HI_LIM); printf("%s", dataOut); (void)snprintf(dataOut, MAX_BUF_SIZE, "%8d | %8d | %8d\r\n", LO_LIM, (int)abs(data_st.z - data_nost.z), HI_LIM); printf("%s", dataOut); //添加LCD显示的代码开始 HAL_Delay(8000); LCD_clear(); LCD_write_BG(10,0,(uint8_t *)"磁场传感器"); LCD_write_ASCII(0,2,(uint8_t *)"LOW DIFF. HIGH"); LCD_write_value(0,3,2,0,0,LO_LIM); temp = data_st.x - data_nost.x; if(temp < 0){ LCD_write_value(15,3,5,0,0,65536 - temp); LCD_write_ASCII(15,3,(uint8_t *)"-"); } else LCD_write_value(15,3,5,0,0,temp); LCD_write_value(60,3,3,0,0,HI_LIM); LCD_write_value(0,4,2,0,0,LO_LIM); temp = data_st.y - data_nost.y; if(temp < 0){ LCD_write_value(15,4,5,0,0,65536 - temp); LCD_write_ASCII(15,4,(uint8_t *)"-"); } else LCD_write_value(15,4,5,0,0,temp); LCD_write_value(60,4,3,0,0,HI_LIM); LCD_write_value(0,5,2,0,0,LO_LIM); temp = data_st.z - data_nost.z; if(temp < 0){ LCD_write_value(15,5,5,0,0,65536 - temp); LCD_write_ASCII(15,5,(uint8_t *)"-"); } else LCD_write_value(15,5,5,0,0,temp); LCD_write_value(60,5,3,0,0,HI_LIM); //添加LCD显示的代码结束 /* Print the test result */ if (test_result == BSP_ERROR_NONE) { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\nLIS2MDL magnetometer self-test PASSED!\r\n"); } else { (void)snprintf(dataOut, MAX_BUF_SIZE, "\r\nLIS2MDL magnetometer self-test FAILED!\r\n"); } printf("%s", dataOut); BSP_LED_Off(LED2); return ret; } 此内容由EEWORLD论坛网友hujj原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-07-20
  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之三3D加速度LIS2DW12传感器测...

    dcexpert 发表于 2019-7-19 22:06 是通过三个轴的参数来判断姿态吧。
    测试和判断都是直接用范例的代码(参见帖子中的代码),调用IKS01A3_MOTION_SENSOR_Get_6D_Orientation_XL()函数之后,直接判断xl,xh,yl,yh,zl,zh六个变量的值。

统计信息

已有216人来访过

  • 芯币:1068
  • 好友:2
  • 主题:77
  • 回复:462
  • 课时:5
  • 资源:3

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言