返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[以太网/USB/其他总线] 总线响应时间调测的快要吐了

[复制链接]
 楼主| dffzh 发表于 2025-5-13 11:14 | 显示全部楼层 |阅读模式
<
本帖最后由 dffzh 于 2025-5-13 13:11 编辑

#申请原创#
@21小跑堂

产品用于工业自动化领域,所以对总线响应时间的实时性要求比较高,为了调优这个总线响应时间,在基于MCU和ADC芯片的SPI数据读取以及MCU和从站芯片的SPI通信交互这块,可真的是煞费苦心,听我慢慢道来!
1、使用不同方案并测试MCU和ADC芯片的SPI通信时间
(1)使用硬件SPI + STM32 HAL库标准发送和接收函数
10M速率,采集4个通道,使用IO口电平翻转的方法进行测试;
耗时200us左右

标准库的发送和接收函数耗时:
发送:HAL_SPI_Transmit  // 3.5us
接收:HAL_SPI_Receive   // 7.35us
(2)使用软件模拟SPI  
采集4个通道,耗时140us左右

采集一次,ADC驱动函数需发送2个字节+接收6个字节:

优化ADC采集函数:
采集4个通道,大部分最短耗时106us


2、MCU和从站芯片的SPI通信时间测试
(1)使用标准SPI + HAL库标准发送和接收函数
10M速率,使用IO口电平翻转的方法进行测试;
运行一次协议栈的中断服务程序,耗时1.28ms左右;

所以此时如果在上位机上设置扫描周期1ms,即PDI中断周期是1ms,模块是无法进行连接到主站的。
(2)使用标准SPI+自编的发送和接收函数
运行一次协议栈的PDI中断服务程序PDI_Isr,耗时442us左右;
用PLC主机实测,扫描周期配置为500us时,模块无法正常运行;屏蔽PDI函数里的部分与通信相关的代码,中断执行一次400us左右,然后扫描周期配置为500us时,模块可以正常运行。修改机制后测试:
之前的PDI函数是放在PDI外部中断里执行的,现在设计为在中断里只设置标志位,而将该函数放到main里运行;用主机实测,扫描周期配置为500us时,模块可以正常运行。然后简单进行了这种情况的滤波滞后时间测试,结果如下表所示;
  扫描周期  
滤波滞后时间
  500us  
52ms
  600us  
29ms
  700us  
20ms
  800us  
16ms
  900us  
15ms
  1000us  
13ms
从测试可以看出,扫描周期配置为500us时,滞后时间太长,无法达到要求;即修改的机制虽然可以保证中断执行正常,但因PDI_Isr接口执行时间不变,滤波滞后时间较长。扫描周期>=1000us基本可以符合需求。
(3)使用软件模拟SPI
运行一次协议栈的PDI中断服务程序,耗时582us左右;
上位机上设置扫描周期>=1ms,模块可以连接到主站。以下是三种方案的运行PDI函数的时间对比:
  方案  
运行时间
  硬件SPI + HAL库函数  
1.28ms
  硬件SPI + 自编函数  
442us
  软件SPI  
582us

3、协议栈优化前后的时间测试
对运行在main主程序里的协议栈接口MainLoop的运行频次进行了优化,其优化方案为:如果设置了滤波使能,则每运行50次ADC采集及数据处理接口后再运行1次协议栈【按时间计算的话,大概是每隔5ms多运行1次】;对比测试了优化前后的滞后时间,分别是33ms14ms,如下图所示:

4、滤波设置后的滞后时间测试
对程序设计进行了以下优化:
1、 减少main主程序里的协议栈运行频次;即提高ADC采集和数据处理接口的运行频次;
2、 MCU和ADC的通信机制改为模拟SPI;即缩短标准SPI字节处理之间的寄存器标志位等待时间;
3、 优化ADC采集数据的驱动函数接口;即提高ADC数据采集接口的执行速度;
4、 MCU和ESC的通信机制改为标准SPI+自编函数;即提高SPI传输数据的速度;

实测滤波设置后的滞后时间:一般在13ms-14ms左右,如下图,扫描周期配置1000us,进行了不同电压的测试:

反正这个产品的总线响应时间调测,我当时真的是快要调测到吐了......
不知道朋友们有木有在时间优化方便改程序改到不想改的地步?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

21小跑堂 打赏了 50.00 元 2025-05-20
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

[url=home.php?mod=space&uid=760190]@21小跑堂[/url] :是的,二姨的经验值得学习  发表于 2025-5-21 08:50
对比测试硬件SPI + HAL库函数  、 硬件SPI + 自编函数 、软件SPI 三种方式的运行时间,找到更合适的采样方式。根据二姨的经验,使用DMA+寄存器操作,完全摒弃库函数,可以将速度更好的提升,特别是HAL库,为了降低用户使用难度,库函数变的臃肿,执行效率低下。高速场景还需掌握寄存器的操作。  发表于 2025-5-20 17:47
zjsx8192 发表于 2025-5-14 08:18 | 显示全部楼层
软件模拟SPI还采集快点?不应该啊
William1994 发表于 2025-5-14 08:43 | 显示全部楼层
太慢了吧.
莫非你下一步要上DMA?
dukedz 发表于 2025-5-14 09:23 | 显示全部楼层
本帖最后由 dukedz 于 2025-5-14 09:27 编辑

仅使用 hal 初始化、直接寄存器操作 spi dma 传输,最快
示例代码:https://github.com/dukelec/cdstep/

用 hal 操作 spi dma,接收和发送分别来两次中断,一次是dma完成一半的中断,一次是dma完成中断,总共 4 次中断
自己寄存器操作 spi dma,写+读 仅一次 dma 接收中断即可
 楼主| dffzh 发表于 2025-5-14 09:29 | 显示全部楼层
本帖最后由 dffzh 于 2025-5-14 09:31 编辑
zjsx8192 发表于 2025-5-14 08:18
软件模拟SPI还采集快点?不应该啊

步骤1中是因为HAL库的SPI发送和接收API接口有很多异常处理,时间上会稍微慢点
 楼主| dffzh 发表于 2025-5-14 09:30 | 显示全部楼层
William1994 发表于 2025-5-14 08:43
太慢了吧.
莫非你下一步要上DMA?

是的,本来准备用DMA了,后面芯片部门修改了MCU和ESC芯片之间的SPI通信驱动代码,优化了时间

评论

xch
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :使用DMA方式的代码占用空间比中断方式少很多。  发表于 2025-5-15 09:03
[url=home.php?mod=space&uid=1167]@xch[/url] :现在产品成本把控大,MCU芯片的烧录引脚都已复用I2C功能,内存空间所剩不多。  发表于 2025-5-15 08:51
xch
估计是没用过DMA。所以要“准备”半年。  发表于 2025-5-14 09:42
 楼主| dffzh 发表于 2025-5-14 09:31 | 显示全部楼层
dukedz 发表于 2025-5-14 09:23
仅使用 hal 初始化、直接寄存器操作 spi dma 传输,最快
示例代码:https://github.com/dukelec/cdstep/

好的,非常感谢!
时光贩卖机 发表于 2025-5-14 12:31 | 显示全部楼层
真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享!
 楼主| dffzh 发表于 2025-5-15 08:53 | 显示全部楼层
时光贩卖机 发表于 2025-5-14 12:31
真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享 ...

是的,所以工业总线一般都是称现场总线,对PLC和从站模块的总线响应速度要求比较高
cooldog123pp 发表于 2025-5-15 13:13 | 显示全部楼层
感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。
 楼主| dffzh 发表于 2025-5-21 08:49 | 显示全部楼层
cooldog123pp 发表于 2025-5-15 13:13
感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。 ...

主要是优化通信响应时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

1164

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部