STM32(在线使用 Mbed)在较高的模拟输入频率下显示延迟

Posted

技术标签:

【中文标题】STM32(在线使用 Mbed)在较高的模拟输入频率下显示延迟【英文标题】:STM32 (using Mbed online) showing delay at higher analog input frequency 【发布时间】:2019-10-13 13:31:19 【问题描述】:

我不熟悉控制器的使用。 我正在设置一个 STM32F769 控制器(使用 Mbed 在线编译器),我的目标是获得一个 PWM 输出,它根据模拟输入改变其频率。我做了一些基本的编码,但有一个问题。当我用模拟输入 1Hz 频率检查示波器上的输出时,它工作正常,但是当我用 100Hz 模拟输入检查它时,输出有延迟,我得到错误的值。我不明白为什么,因为这个板更快(216 MHZ),我不应该遇到这样的问题。 (如果有人也可以解释一下,是否可以在 216MHz 或其他最大频率下使用该板?以及如何使用?)

第一次使用


 meas_r=0;
 for(int i=1;i<=1024;i++)
              
    meas_r = meas_r+analog_value.read(); 
 
 meas_r=meas_r/1024;
 meas_v = meas_r * 3300;
 out_freq=50000+(meas_v*50);   
 pulse.period( 1.0 / out_freq);  
 

它应该适用于 100Hz 模拟输入,因为它适用于 1Hz。

【问题讨论】:

您的 RCC 配置是什么。 检查这些链接,这些是用于树莓派的,但会给你一些想法。 raspberrypi.stackexchange.com/questions/54150/… raspberrypi.stackexchange.com/questions/87846/… 不做任何操作只切换引脚的结果。 【参考方案1】:

216MHz 可能是您的处理器可以运行的最大时钟频率,但这并不意味着它可以从其端口输入/输出那么多频率。

延迟是由读取模拟值和计算所需的数学运算所花费的时间引起的。您正在使用多个乘法和除法,这比几乎任何硬件设备的加法和减法都更复杂。显然,您也在使用库/库(pulse.period()、analog_value.read()),在这些乘法和除法之上还有一些隐藏的计算。最后,您的设备也可能正在使用其他东西(只有您知道这一点)。所有这些计算都需要时间。在较低的频率下,您可能无法注意到延迟,但是当频率足够高时,可以注意到延迟。 还要考虑多次读取模拟值所需的时间错误的信号和周期是由于延迟和其他一些不确定性造成的。如果处理器也在处理其他任务,那么很难预测完成所有任务所需的时间。由于处理器逐行执行指令并在新的计算开始之前等待先前的计算完成,因此会导致时序上的一些不确定性。 外围设备的数据路径和频率(从外围设备获取输入)在时序不确定性和延迟中起着至关重要的作用。

如果时间和精度对于解决你的问题真的很重要,如果你不能用 DSP、MPU、MCU、CPU、GPU 等解决问题,我建议你使用 FPGA 来解决问题。

【讨论】:

控制器只运行那段代码,与任何其他硬件无关(仅函数发生器和示波器)。我可能需要为 ADC 设置采样频率,但我不知道如何计算和选择它。以及如何在此处实现。 您使用的是片上ADC还是板载ADC?这也可能对您有所帮助electronics.stackexchange.com/questions/311326/… 正在使用什么样的ADC? 感谢您的回复,您所说的 ADC 类型是什么意思? 我在引脚 A0 使用 STM32F769 的内部 ADC。由于我缺乏知识,我无法从您在评论中提到的帖子中获得足够的想法,我该如何计算 ADC 采样频率?

以上是关于STM32(在线使用 Mbed)在较高的模拟输入频率下显示延迟的主要内容,如果未能解决你的问题,请参考以下文章

ROS之STM32来啦

使用 mbed 框架在 STM32 上运行 GMP 的串行 printf

ROS + STM32 + mbed

mbed + platformio.org:建议?

ROS+mbed

大小端存储