lb8820265

个性签名:QQ:252669569

  • 2020-06-09
  • 回复了主题帖: “国产芯片交流”开版!怎么做,听你的!

    是不是还要包括功率半导体芯片,IGBT,IGCT等等的

  • 2020-05-28
  • 回复了主题帖: 【羽毛球训练监测器项目】--项目简介及研发计划

    这个有意思,我也做过类似的姿势识别,这个可能需要惯性导航和姿态解算的相关知识。

  • 2020-04-10
  • 回复了主题帖: 【奖品发送完毕】颁奖:TI 嵌入式主题直播月——为高效、智能、低功耗系统设计助力

    信息确认,感谢EE

  • 2020-03-13
  • 发表了主题帖: 当BLE遇到MEMS——MATLAB软件下BLE通信

             前面有介绍过使用Win10系统来编写BLE上位机的方法:当BLE遇到MEMS——Windows平台下BLE程序编写 这里介绍使用MATLAB软件来编写BLE上位机。MATLAB在2019版本之后开始支持BLE的通信,不需要安装任何的工具箱,官网相关的介绍网址。或者直接在MATLAB的命令行中输入: web(fullfile(docroot, 'matlab/import_export/troubleshooting-bluetooth-low-energy.html')) MATLAB BLE支持的系统: macOS 10.13 High Sierra or later Windows® 10 or later         在MATLAB上写的BLE代码是可以在macOS和Windows同时用,真正跨平台,不过对系统的版本要求比较高。 接下来就手把手的介绍在MATLAB上编写BLE上位机的方法。 用的开发板是NRF52832,SDK为12.3版本,MATLAB2019b。 1.准备一个蓝牙广播设备         这里准备的是NRF52832,里面烧录蓝牙串口程序(ble_app_uart),上电让其广播。 2.测试系统是否支持         打开MATLAB后在命令行窗口运行 blelist     如果一切正常则会返回搜索到的蓝牙设备信息,如下蓝牙设备名为"Nordic_UART",设备地址为"C5776FDF79B2"。 3.连接设备 b=ble("Nordic_UART")         指令连接设备,通过设备名或者设备地址连接,b为设备的句柄,指令返回设备的基本信息如下。         删除设备使用“clear b"指令。 3.获取BLE的特性         连接上后可以查看设备里面的服务和特性,通过命令 b.characteristics         可以看到,设备除了几个通用的服务之外有还有一个名为“Custom”服务带有两个特性。这两个服务和特性是什么含义,在NRF52832蓝牙串口工程“ble_nus.c”文件中有如下定义。 定义0002为发送特性,定义0003为接收特性。也就是0002是从nrf发送给电脑,0003是从电脑接收。 4.获取特性句柄     知道每个特性的作用后,需要操作这两个特性用来发送和接收,分别用tx和rx来给当做句柄,使用命令 rx=characteristic(b,"6E400001-B5A3-F393-E0A9-E50E24DCCA9E","6E400003-B5A3-F393-E0A9-E50E24DCCA9E") tx=characteristic(b,"6E400001-B5A3-F393-E0A9-E50E24DCCA9E","6E400002-B5A3-F393-E0A9-E50E24DCCA9E") 函数中b是蓝牙设备的句柄,后两个参数分别是服务UUID和特性UUID。返回参数如下。     可以看到rx特性具有Notify属性,tx特性具有Write和WriteWithoutResponse属性。 5.写 直接使用命令进行发送: write(tx,'lb8820265') 可以选择发送数据的格式,和是否有反馈的发送。如下图。     串口助手接收的字符串后面都带有0x0D 0x0A的换行符,这是因为在SDK的main.c函数中,代码将接收到的数据末尾都加上的换行符。 6.读 BLE的读有两种方式,一种是阻塞式的查询,直到接收到数据,一种是通知功能,有数据就进入回调函数。 阻塞方式的读 首先用订阅命令接收数据,然后用接收函数接收到的数据展现出来: subscribe(rx) read(rx) 最后用串口助手发送“lb8820265”(末尾加上换行符,不然要发送大于20个字节)。在命令行窗口中就会显示如下(显示的是ascII码): 回调函数的读          首先建一个后缀为.m的函数文件,如下图所示。注意函数名与文件名保持一致。 然后指定回调函数如下。 rx.DataAvailableFcn=@CharacteristicData     最后使用串口助手发送,MATLAB就能直接接收到了。 好啦!这里真要感叹MATLAB的强大之处,不过也发现在SDK15.0下无法使用MATLAB正常连接,ST的芯片试过都可以连接。 如果大家对这个感兴趣,接下来我会尝试用APP Designer来开发一个BLE上位机,就像开发串口工具一样。 此内容由EEWORLD论坛网友lb8820265原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2020-02-06
  • 回复了主题帖: 年度原创评选,给你喜欢的文章投个票

    哇,感谢EE!

  • 2020-01-14
  • 加入了学习《世健第四期》,观看 全新设计的8通道16位同步采样SAR ADC -- AD7606B

  • 2019-12-03
  • 回复了主题帖: 有奖活动——我知道的嵌入式操作系统

    我最开始接触到的是UCOSII,当时还买了一本书,全部啃完了,让我受益匪浅,真正感受到了编程的魅力,原来编程也是一门艺术,操作系统用最小的开销,完成了最复杂的功能,而且可裁剪。后来我用UCOSII做了一系列的项目,感觉也是不错的,我以为我会一直用它。 可是好景不长,STM32推出了一个CubeMX软件,可以直接生成带FreeRTOS操作系统的工程,让后我又学了下FreeRTOS,发现了这种嵌入式操作系统都大同小异,无非都是轮盘调度,列队,信号量,邮箱等的东西。而且有个CMSIS可以将几乎所有的嵌入式操作系统囊括进去,所以接下来我又投入FreeRTOS的怀抱,发现这个操作系统也还不错,虽然我也听过其他的操作系统,但是用的多的还是ucOSii和FreeRTOS。 我感觉,操作系统毕竟只是工具,不是最重要的,如何用操作系统实现的功能才是最重要的。

  • 2019-11-30
  • 发表了主题帖: PC串口连续数据帧接收方法

    本帖最后由 lb8820265 于 2019-11-30 22:15 编辑 本次分享内容比较硬核,只有在使用串口做高速数据通信时候才会遇到。 串口可以说是目前最常用通信方式,双方约定好波特率,只需要一根线就能够传输数据,极大的简化了接线。串口传输的方式为一个字节一个字节的发送,完整版的串口有流控引脚,可以用来判断是否发送完成。但是简版的串口只有一根接收线或者发送线,也就没有无法知道串口是否发送一帧完成。 之前我用写过两篇通信协议的文章,采用自己定制的通信协议进行数据的传输。 串口示波器教程(5.1)串口传输协议制定(ASCII字符方式传输) 串口示波器教程(5.2)串口传输协议制定(RTU整数与浮点方式传输) 帖子里面介绍使用自己定义的协议,长时间间隔的传输一帧数据,例如每隔500ms发送一次数据,这样可以有效保障接收的数据为一帧或小于一帧,因为电脑有足够的时间来处理串口数据。但是如果想要一秒内传输更多的数据帧,就要减少一帧数据的间隔时间,那么就会面临许多问题,在PC中串口的数据的接收中断并不是理想的一个字节一个中断,而且就算设置了接收数量触发中断,也是不可靠的,这也许和Windows操作系统是非实时有关。 举个例子,一帧数据为100个字节,下位机连续或者短间隔连续发送,在PC上位机上无论设置为什么触发条件,每次触发接收都会有以下的几种情况出现。 接收到一帧数据(接到100字节,一帧数据) 接收到多帧数据(例如接到200字节,两帧数据) 接收到不到一帧数据(例如接收到50字节,半帧数据) 接收到一帧多数据(例如接收到150字节,一帧半数据) 每次接收到的数据字节数不定,这个就非常糟心了。但也不是没有办法,使用列队的知识再加上一些策略可以解决这个问题。一帧的协议有很多,比如通用的MavLink和Modbus,他们都有很多支持,方便扩展,这里自定义一帧的格式如下: 帧头 数据个数(指令+数据内容) 指令 数据内容(可无) 帧尾13 10 0xFE(254) 1~255 0~255 0~254个字节 0x0D 0x0A 帧头(一个字节),帧头的作用是方便从一大堆数据中找到有用数据帧的开始,一般是一个出现较少的数,这里选择0xFE(254), 数据个数(一个字节),数据个数的作用是告诉接收方,我接下来会发送这么多有效数据,由于一个字节能表示的最大的数是255,所以该部分的取值范围是1~255. 指令(一个字节),指令的作用是告诉接收方我接下来的数据是什么内容或者一些控制信息,可以取的范围是0~255. 数据内容(0到254字节),该部分是实际的数据内容,根据前面“字节个数”该部分可以有0~254个字节。 帧尾(两个字节),帧尾的作用是告诉接收方,一帧的数据传输完毕,同时也可以用于校验,帧头到帧尾的数据个数要等于“数据个数”中的值,否者是无效数据。     为了更好的描述该方法,这里用图示介绍,如下图。 图中左边的是有用数据接收的列队,表示一帧数据,用RX_Data_Final来表示,右边是接收回调函数中的接受列队,用RX_Data来表示。P_1表示指针在有用列队的位置,End_1表示该有用列队应该的结束位置,通常通信协议里面的数据个数可以推出End_1的大小。P_2表示指针指在接收列队的位置,End_2表示接收列队的结束的位置,通常接收的数据个数就是等于End_2。 大体思路就是,首先搜帧头,搜到后一边复制数据到有用列队一边搜索帧尾,搜索到帧尾后判断个数是否满足。如果满足就将说明一帧数据接收完毕,进行数据处理,然后接着搜索帧头,在MATLAB的APP Designer中的代码如下。     该代码可以完美的解决前面所说的四种情况,当然也不排除,一堆乱码中也会出现符合协议的情况看,不过这个概率非常小,帧头,帧尾,和数据个数,一共4个字节都要满足,每个字节都有256中可能性,也就是出现这种情况的概率为256的4次方分之一,可以忽略不计了。 有关APP Designer制作串口的教程,请参考我的帖子:MATLAB APP Designer串口调试工具编写 此内容由EEWORLD论坛网友lb8820265原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-09-24
  • 发表了主题帖: 当BLE遇到MEMS——LSM6DSL驱动移植到NRF52832

    NRF52832自带了很多的外设的驱动;在nRF5_SDK_XX\components\drivers_ext文件夹中,可惜没有ST芯片的驱动。         接下来介绍ST的MEMS驱动移植到NRF52832的方法。 下载驱动库          首先下载NRF52832的驱动库,在官网下载SDK12.3的版本,现在并不是最新的,但是比较精简。         然后下载LSM6DSL的驱动库,进入ST的官网,搜索X-CUBE-MEMS1,将该固件下载下来,要是官网出bug,可以通过我之前的文章方法下载。 在STM32CubeExpansion_MEMS1_V6.2.0\Drivers\BSP\Components路径下,有各个传感器的驱动,由于X-NUCLEO-IKS01A这样的板子都是使用的I2C通信接口,我个人不喜欢I2C接口,买了个有SPI接口的LSM6DSL模块。        复制LSM6DSL_ACC_GYRO_driver.c和LSM6DSL_ACC_GYRO_driver.h两个文件就够了,其实最需要的只是头文件里面的寄存器定义,因为库文件的功能最终也就是操作寄存器。 SPI通信接口移植           SPI通信,最重要的就是读写函数的编写,如下: SPI初始化 SPI回调函数       SPI回调函数用一个全局变量用来判断SPI是否传输完成。 LSM6DSL初始化      我只使用了库函数中的寄存器,没有使用库函数,然后每次写入寄存器都读出来,确保每次都写入成功。  获取传感器的值     读出传感器的值,采用一次性全部读出的方法,这样最高效,库函数中是一个一个的读取,这样不推荐。然后是将寄存器的原始值转化为实际值,也即是乘以Sensitivity,库函数的方法是每次都从寄存器中读取Sensitivity,这样没有必要,直接将该值变成常量然后相乘,可以更少的操作SPI,提高效率。     最后就是将读取出来的值,进行姿态解算,姿态解算详细可以参考我的这篇帖子。     最后可以使用Jscope来查看波形,方法参考我之前的帖子。 GitHub工程下载地址:https://github.com/flyloong/NRF52832_LSM6DSL 此内容由EEWORLD论坛网友lb8820265原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-09-21
  • 回复了主题帖: SensorTile物联网开发套件(9)——DIY无线语音控制

    皮卡皮卡~ 发表于 2019-9-19 11:25 视频怎么看不了啊
    这个我也不知道是怎么回事,我看了优酷中还有,你可以优酷中搜索“SensorTile语音控制”,然后用户名“lb8820265”的视频就是了。

统计信息

已有444人来访过

  • 芯币:1803
  • 好友:17
  • 主题:75
  • 回复:400
  • 课时:--
  • 资源:21

留言

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


安拉木 2018-12-30
网卡了,点了几下没反应,发了很多留言,不好意思了
查看全部