总线响应时间调测的快要吐了
本帖最后由 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时,模块可以正常运行。然后简单进行了这种情况的滤波滞后时间测试,结果如下表所示;
扫描周期滤波滞后时间
500us52ms
600us29ms
700us20ms
800us16ms
900us15ms
1000us13ms
从测试可以看出,扫描周期配置为500us时,滞后时间太长,无法达到要求;即修改的机制虽然可以保证中断执行正常,但因PDI_Isr接口执行时间不变,滤波滞后时间较长。扫描周期>=1000us基本可以符合需求。 (3)使用软件模拟SPI运行一次协议栈的PDI中断服务程序,耗时582us左右;上位机上设置扫描周期>=1ms,模块可以连接到主站。以下是三种方案的运行PDI函数的时间对比:
方案运行时间
硬件SPI + HAL库函数1.28ms
硬件SPI + 自编函数442us
软件SPI582us
3、协议栈优化前后的时间测试对运行在main主程序里的协议栈接口MainLoop的运行频次进行了优化,其优化方案为:如果设置了滤波使能,则每运行50次ADC采集及数据处理接口后再运行1次协议栈【按时间计算的话,大概是每隔5ms多运行1次】;对比测试了优化前后的滞后时间,分别是33ms和14ms,如下图所示:
4、滤波设置后的滞后时间测试对程序设计进行了以下优化:1、 减少main主程序里的协议栈运行频次;即提高ADC采集和数据处理接口的运行频次;2、 MCU和ADC的通信机制改为模拟SPI;即缩短标准SPI字节处理之间的寄存器标志位等待时间;3、 优化ADC采集数据的驱动函数接口;即提高ADC数据采集接口的执行速度;4、 MCU和ESC的通信机制改为标准SPI+自编函数;即提高SPI传输数据的速度;
实测滤波设置后的滞后时间:一般在13ms-14ms左右,如下图,扫描周期配置1000us,进行了不同电压的测试:
反正这个产品的总线响应时间调测,我当时真的是快要调测到吐了......不知道朋友们有木有在时间优化方便改程序改到不想改的地步?
软件模拟SPI还采集快点?不应该啊 太慢了吧.
莫非你下一步要上DMA? 本帖最后由 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:31 编辑
zjsx8192 发表于 2025-5-14 08:18
软件模拟SPI还采集快点?不应该啊
步骤1中是因为HAL库的SPI发送和接收API接口有很多异常处理,时间上会稍微慢点 William1994 发表于 2025-5-14 08:43
太慢了吧.
莫非你下一步要上DMA?
是的,本来准备用DMA了,后面芯片部门修改了MCU和ESC芯片之间的SPI通信驱动代码,优化了时间 dukedz 发表于 2025-5-14 09:23
仅使用 hal 初始化、直接寄存器操作 spi dma 传输,最快
示例代码:https://github.com/dukelec/cdstep/
好的,非常感谢! 真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享!
时光贩卖机 发表于 2025-5-14 12:31
真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享 ...
是的,所以工业总线一般都是称现场总线,对PLC和从站模块的总线响应速度要求比较高 感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。 cooldog123pp 发表于 2025-5-15 13:13
感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。 ...
主要是优化通信响应时间
页:
[1]