问题标签 [cmsis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 无法在 STM32 上使用 CMSIS 进行 CFFT 频率分级?
目前,我正在尝试通过使用 STM32F411RE 板上的 CMSIS 包来实现一个程序来查找 3 个频率(xs = 30.1 kHz、ys = 28.3 kHz 和 zs = 25.9 kHz)。我无法让复数 FFT (CFFT) 和复数幅度正常工作。
根据频率箱,我生成一个包含这些频率的数组,以便我可以手动查找信号 xs、ys 和 zs 所在的索引箱。然后,我使用该索引查看 3 个 fft 结果(Xfft、Yfft、Zfft)以找到这些信号的结果,但它们不匹配。
我使用以下功能顺序:
DMA ADC 缓冲区: 将
ADC 输入更改为浮动 Xfft
CFFT_F32:
复数幅度HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
中的频率箱 :binfreqs
arm_cfft_f32(&arm_cfft_sR_f32_len1024, Xfft, 0, 0);
arm_cmplx_mag_f32(Xfft, Xdsp, fftLen);
信号处理
我不知道如何计算 cfft 和复数幅度的这种组合的频率区间,因为我希望数组的偶数索引保存实际值,而数组的奇数索引保存虚相位值。我引用了一些1 2 3 个示例,但无法弄清楚我的代码做错了什么。
然而,根据图像,当应用 30.1 kHz 的输入信号时,301 bin 索引或 602 bin 索引都不会保持预期的相应输出?
编辑:
此后,我尝试实现此处给出的 arm_cfft_f32 示例。后一个示例完全被破坏了,因为默认情况下不再包含外部 10 kHz 数据集,并且尝试包含它是不可能的,因为程序的行为很差,并且一直在错误地返回甚至根本不存在的返回数据类型。因此我不能使用为此给出的示例程序:它似乎也已经过时了 4 年,所以这并不奇怪。
arm_max_f32() 函数也被证明没有成效,因为它通过使用模拟生成的信号不断追踪在 bin 0 处生成的噪声。手动将此 bin 0 设置为等于 0 会扰乱算法,该算法开始指向随机值,这些随机值甚至不是系统中存在的最大值。
即使手动查看 CFFT 数据和幅度,它们似乎也无法正常工作。整个频谱部分都有随机噪声值,而示波器确认大结果应该只出现在 0 Hz 和所选信号发生器频率(因此对应于频率仓)。
使用 CMSIS 对我来说非常令人沮丧,因为可用的文档和示例很少,然后由于其中大部分根本无法正常工作(没有重大修改)而进一步减少。
stm32 - 如何在 RTOS 的 Cortex-M3 微控制器中以高频(> 100kHz)运行周期性线程?
我正在使用 STM32F107VC 微控制器实现高频(>100kHz)数据采集系统。它使用 spi 外设与高频 ADC 芯片通信。我必须使用 RTOS。我怎样才能做到这一点?
我尝试过 FreeRTOS,但它的最大滴答频率是 1000Hz,所以我不能使用 FreeRTOS 每 1us 运行一个线程。我也试过 Keil RTX5,它的滴答频率可以高达 1MHz,但我在某处研究过,不建议将滴答频率设置为高,因为它会增加整体上下文切换时间。所以我该怎么做?谢谢。
c - 了解嵌入式 C 中命令 *__SIMD32(pIn)++ 的执行
我需要了解 *__SIMD32(pIn)++ 的解决方案
定义如下所述。
一步一步,我们如何达到输出,输出是什么?
我尝试在互联网上搜索解释,但找不到任何解释。
c - CMSIS_OS2.c 无法编译
我正在使用 FreeRTOS 开发一个 C 项目,但我想使用抽象层 CMSIS_OS2 对其进行更新。问题是我的 FreeRTOS 配置文件,我没有启用所有选项,所以例如我只使用
所以不会编译所有 NONE dynamique 函数(例如:xTaskCreate)。
但在 cmsis_os2.c 中,所有函数都必须存在才能编译
所以我不知道如何管理这个问题,因为我不想启用所有 FreeRTOSConfig.h 选项。
任何想法都值得赞赏。
杰罗姆
c++ - Compilation of CMSIS-DSP application, .a library not recognized
I am using GNU MCU ECLIPSE and the ARM toolchain to target CortexM MCUs, and I want to use functions from CMSIS DSP library. I have downloaded the library from the repository from https://github.com/ARM-software/CMSIS_5, added to the compiler settings the paths to the includes, and in the linker options I have added the folder C:/workspace/CMSIS/DSP/Lib/GCC as path to search for libraries, and added 'arm_cortexM3l_math' to the libraries. When I try to build I get the error
I don't understand why can't the linker read the library in .a format. I have tried with a clean eclipse installation both on windows and linux and with both the GNU MCU Eclipse ARM Embedded GCC and the GNU ARM Embedded Toolchain. Build tools for windows are also correctly installed.
c - 如何正确归一化 q15 定点中的 pid 系数
我正在使用 STM32F4 微控制器上的 CMSIS 库开发 PID 控制器。我无法真正理解 PID 参数的归一化。现在我有了 PID 控制器的三个 Kp、Ki、Kd 参数,我必须将它们放入系统中。我知道他们需要标准化,所以我必须从整数转换为 q15。问题来了。就我而言,我有:
据我了解,我需要找到一个因子以使这些数字在 -32768...32767 中可表示,因此我将2^13
其用作因子:
我不明白是否需要除以PID计算的结果。如果我除法,当误差较低时,pid 输出为零:让我们有一个恒定的误差 e(n) = 2。在 PID 计算中(我使用函数 arm_pid_q15() 中描述的公式):
如果y(n-1) = 0
,y(n) = 1392
。如果我除以2^13
因子,我有y(n) = 0
(整数)。
另一方面,如果我不除PID输出,就像将比例增益乘以2^13
因子。
有人可以帮助我理解这一点吗?谢谢。
c - CMSIS DSP FFT 库电平测量缺乏准确性
我尝试使用 CMSIS DSP 库在 STM32F407 上实现 FFT。我的项目基于Tilen MaJerle 库。我使用板载 ADC 对数据进行采样,并使用函数 TM_FFT_AddToBuffer(TM_FFT_F32_t* FFT, float32_t sampleValue) 填充输入缓冲区。此后,我使用函数 TM_FFT_Process_F32(TM_FFT_F32_t* FFT) 处理数据。
和
我在 TM_FFT_Process_F32(...) 函数中添加了一些简单的转换,旨在调整谐波电平。当然,当我排除它们并使用原始 Tilen 代码时,我会得到相同的结果。
如您所见,我尝试了 arm_cfft_f32(...) 和 arm_cmplx_mag_f32(...) 函数。为了我的目的,我还尝试了 arm_rfft_fast_f32(...) 函数并得到了相同的结果。
我的问题是幅度计算的准确性。我的任务期望获得预定谐波的准确电平计算。我用电压表在 ADC 输入上测量带有直流偏移的清晰正弦交流信号。然后我用 FFT lib 测量信号频率,并随着频率的增加得到信号电平的下降。我考虑到对给定采样率的最大测量频率的限制,事实上,CMSIS DSP FFT 不能使用超过 4096 个样本。我还需要小频率步长,例如 1 Hz 用于 100 到 1000 Hz 之间的范围。
在给定的图片中,我向您展示了结果。顺便说一句,频率测量有一些误差。100 Hz 定义为 101Hz,800 Hz – 定义为 808Hz。但这并没有让我很困惑。
蓝线用交流电压表测量。红线是我使用 FFT 库进行的测量。采样率 4096 Hz,样本数 – 4096
对于其他频率范围和采样率,也获得了相同的画面。
现在我看到唯一的正面决定是在数学上将我的结果调整为实际测量值。但这不是一个优雅的解决方案。我很可能忽略了 DSP FFT 分析的一些重要特性,并且缺乏对数学算法的理解。其他 FFT 实现对我来说不是很清楚。使用其他库真的有意义吗,例如,kissFFT 等等?谁有其他库的经验并愿意与我分享?任何建议都受到高度赞赏。
c - 如何将 CMSIS DSP 库中的转换函数添加到 Makefile?
我编写了一个使用 CMSIS DSP 库中的 arm_cfft_f32 函数的代码。如何将 CMSIS DSP 库添加到我的项目的 Makefile?
STM32CubeMX 为 STM32F407 芯片生成的 Makefile。我将 .c 和 .h 从 CMSIS 的统计、转换和过滤函数文件夹复制到我的项目文件中 \Src 和 \Inc。
在 STM32CubeMX 生成的 C_SOURCES 下的 Makefile 中,我添加了:
通过将 arm_max_f32.c 和 arm_cmplx_mag_f32.c 添加到 Makefile,编译没有问题。但是,当我在项目中添加 arm_cfft_f32 时。我得到这个编译错误,
interrupt - (STM32L476RG)标志设置(osThreadFlagsSet)在中断(GPIO EXTI)中执行时使微控制器崩溃
我目前正在学习 CMSIS-RTOS v2,但我遇到了一个困扰我的问题,我找不到我需要的答案。
我使用 STM32L476-Disco 板和操纵杆中心按钮作为中断。我的中心操纵杆中断有一个非常简单的中断回调:
当我调用 osThreadFlagsSet 时,微控制器冻结,没有其他任何事情发生。这就是我放置 HAL_GPIO_TogglePin 的原因:查看 mcu 是否仍在响应。
我知道我的中断正确重置,因为当我只拨动引脚时,我可以正确切换 LED。
ThId_Led_Blink 是一个 ThreadId
我已经检查了我的调试器中的 ID 设置是否正确并且它是(它不为空)。
如您所见,我已经尝试过使用 osEvenFlagsSet 并且得到了相同的结果。
当我检查 CMSIS_RTOS v2 文档时,它确实指定可以从 ISR 调用 osThreadFlagsSet,但我不确定在这种情况下我是否需要做其他事情才能正确设置标志并解决 ISR 时的问题绞刑。
谢谢你的帮助