【求助】基于STM32F103的FFT相位差测量系统

这个代码输出不了测量后的相位差数据,但是不知道哪里有错误。

各位大佬麻烦帮帮忙【哭哭哭】

加了限幅滤波代码就更跑不动了,不知道该怎么办。

#include "stm32f10x.h"
#include "arm_math.h"
#include "math.h"
#include "key.h"
#include "stdio.h"
#include "delay.h"
#include "oled.h"
#include "bmp.h"
#include "led.h"
#include "sys.h"
#include "usart.h"    

#define M_PI 3.14159265358979323846264338327
#define SIGNAL_LENGTH     1024
#define SIGNAL_GPIO_PORT  GPIOA
#define SIGNAL_PIN_1      GPIO_Pin_6   // PA6
#define SIGNAL_PIN_2      GPIO_Pin_7   // PA7
#define THRESHOLD 2000 // 限幅阈值

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能 GPIO 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 GPIO 引脚为输入模式
    GPIO_InitStructure.GPIO_Pin = SIGNAL_PIN_1 | SIGNAL_PIN_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SIGNAL_GPIO_PORT, &GPIO_InitStructure);
}

extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;


// 定义输入信号数组
float32_t inputSignal1[SIGNAL_LENGTH];
float32_t inputSignal2[SIGNAL_LENGTH];
        
// 定义 FFT 输出缓冲区
float32_t fftOutput1[SIGNAL_LENGTH];
float32_t fftOutput2[SIGNAL_LENGTH];

float32_t filteredSignal1[SIGNAL_LENGTH]; // 经过限幅滤波后的信号1
float32_t filteredSignal2[SIGNAL_LENGTH]; // 经过限幅滤波后的信号2

void generateSignals(void) 
{
    // 生成信号1(以正弦波为例)
    for (int i = 0; i < SIGNAL_LENGTH; i++) 
    {
        inputSignal1[i] = 1.5* sin(2 * M_PI * 50*i);
    }
  
    // 生成信号2(以正弦波为例)
    for (int i = 0; i < SIGNAL_LENGTH; i++) 
    {
        inputSignal2[i] = 1.5 * sin(2 * M_PI * 50*i+ M_PI/2);
    }
}

int main(void)
{
    // 初始化 GPIO 引脚
    GPIO_Configuration();

    // 初始化输入信号
    generateSignals();
    
    // 初始化DAC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    DAC_InitTypeDef DAC_InitStructure;
    DAC_StructInit(&DAC_InitStructure);
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);
    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);
    
    int index = 0;
    delay_init();
    uart_init(115200);
    LED_Init();
    KEY_Init();
    u8 key_val = 0;

    // 无限循环发送信号
    while (1)
    {
        // 输出信号1
        DAC_SetChannel1Data(DAC_Align_12b_R, (uint16_t)(inputSignal1[index] + 2048));
        // 输出信号2
        DAC_SetChannel2Data(DAC_Align_12b_R, (uint16_t)(inputSignal2[index] + 2048));

        // 更新index并延时
        index = (index + 1) % SIGNAL_LENGTH;
        for (uint32_t i = 0; i < 10000; i++); // 延时一段时间

        // 执行FFT
        arm_cfft_f32(&arm_cfft_sR_f32_len1024, inputSignal1, 0, 1);
        arm_cfft_f32(&arm_cfft_sR_f32_len1024, inputSignal2, 0, 1);
        
        // 计算相位谱
        float32_t phaseSpectrum1[SIGNAL_LENGTH];
        float32_t phaseSpectrum2[SIGNAL_LENGTH];
        for (int i = 0; i < SIGNAL_LENGTH; i++)
        {
            float32_t real1 = inputSignal1[i];
            float32_t imag1 = 0;
            phaseSpectrum1[i] = atan2f(real1, imag1);

            float32_t real2 = inputSignal2[i];
            float32_t imag2 = 0;
            phaseSpectrum2[i] = atan2f(real2, imag2);
        }

        // 计算相位差
        float32_t phaseDifference = phaseSpectrum1[0] - phaseSpectrum2[0];
        phaseDifference = fmod(phaseDifference, 2 * M_PI);
        if (phaseDifference > M_PI) {
            phaseDifference -= 2 * M_PI;
        } else if (phaseDifference < -M_PI) {
            phaseDifference += 2 * M_PI;
        }

        // 检测按键
        key_val = KEY_Scan(0);
        if(key_val == KEY0_PRES)
        {
            printf("相位差是:%.3f\r\n", phaseDifference);
        }
        else if(key_val == KEY1_PRES)
        {
            printf("重置\r\n");
        }
    }
}
 

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于STM32FFT测量相位差的方法可以参考以下步骤: 1. 首先,使用STM32的ADC模块采集两个信号的波形数据。可以使用多通道DMA转换来实现这一步骤\[1\]。 2. 接下来,使用FFT算法对采集到的波形数据进行频谱分析。可以使用基于STM32F4的FFT算法来实现这一步骤\[1\]。 3. 在得到频谱数据后,可以通过计算相位差来求得两个信号之间的相位差。可以使用公式 phase_diff = 180 * acos(2 * Ixy / sqrt(4 * Ix * Iy)) / pi 来计算相位差\[3\]。 4. 最后,将计算得到的相位差显示在LCD屏幕上,可以使用LCD_ShowNum函数来实现\[2\]。 综上所述,基于STM32FFT测量相位差的方法包括采集波形数据、进行FFT分析、计算相位差并显示结果。 #### 引用[.reference_title] - *1* [基于STM32F4的FFT+测频率幅值相位差,波形显示,示波器,时域频域分析相关工程](https://blog.csdn.net/qq_50027598/article/details/126045155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32相位差(根据时间差)](https://blog.csdn.net/qq_64157010/article/details/130675672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [基于stm32的两路正弦波相位差测量](https://blog.csdn.net/weixin_43656566/article/details/90086294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值