stm32f1单片机上用FFT测量信号频率(高精度、过程详细)

您所在的位置:网站首页 反相器最大信号频率怎么算 stm32f1单片机上用FFT测量信号频率(高精度、过程详细)

stm32f1单片机上用FFT测量信号频率(高精度、过程详细)

2024-07-07 08:00:25| 来源: 网络整理| 查看: 265

在STM32F1系列单片机上面实现FFT

最近需要做一台基于stm32的示波器。如果测量信号参数,用单片机上面一些传统的方法局限性还是比较大,就开始琢磨直接上FFT。本文将以一个实例来介绍如何使用STM32提供的DSP库函数进行FFT。

开始是下载stm32的DSP库,提供一个下载地址: 链接:https://pan.baidu.com/s/1M28W7WXNsO3QVfkZunh7rg 提取码:s7kb 下载并解压文件: 可以看到官方提供的是256点和1024点FFT,关于FFT的点数,我以前有个误区,以为点数和采样频率有关,看了相关资料后发现两者没有本质上的关系,但是点数影响测量的分辨率。 将DSP库移植到Keil工程里面: 两个库都是汇编写了,看不明白就没有仔细看了 分析一下两个FFT函数:

void cr4_fft_256_stm32(void *pssOUT, void *pssIN, u16 Nbin); void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, u16 Nbin); // *pssOUT是FFT之后输出频域的数组,*pssIN为输入的时域采样信号数组,Nbin为FFT点数

在信号与系统或数字信号处理课程里面经常遇到FFT相关运算题目,根据经验,时域信号通常是实数,但是计算后得到的频域数据往往是虚数,同样按照官方库的说明,输入、输出两个数组都应该是32位的,高16位存储实部,低16位存储虚部。因此在定义数组时:

// long是32位 long InBufArray[NPT]={0}; //定义输入数组 long OutBufArray[NPT/2]; //定义输出数组 long MagBufArray[NPT/2]; //幅值

此库只能单纯的进行FFT运算,如果想要得到信号的频率等信息还要计算各次谐波的幅度值。需用到以下函数:

void GetPowerMag() { signed short lX,lY; float X,Y,Mag; unsigned short i; for(i=0; i TIM_TimeBaseStructure.TIM_Period = ARR; //用了宏定义 TIM_TimeBaseStructure.TIM_Prescaler = PSC; TIM_TimeBaseStructure.TIM_ClockDivision = 0x00; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //要配成PWM模式,用来触发ADC1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 60; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能 TIM_Cmd(TIM1, DISABLE); }

注意定时器1在配置完成后不能马上使能,而要失能,在所有初始化完成后再使能。

/*********ADC1的配置********/ void ADC1_Init(void) { ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; //由定时器1触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5); //采样周期取最短 ADC_Cmd(ADC1, ENABLE); ADC_ExternalTrigConvCmd(ADC1, ENABLE); //外部触发使能 ADC_DMACmd(ADC1, ENABLE); } void ADC1_DMA1_Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; //DMA中断服务函数 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC1对应地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Value; //存储数据数组地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_LEN; //数据长度 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); }

此处配置了DMA中断服务函数,DMA的模式是循环读取模式,内存大小n自定义,所以单片机ADC在定时器触发之后,读取到n个数据就自动进入DMA中断服务函数。在进入服务函数之后,我们失能DMA,然后进行FFT运算,最后使能DMA。由于官方只提供了256点和1024点函数。于是我们将存储ADC数据大小的内存改为256或1024,正好可以让每次进入中断服务函数里面进行FFT的运算效果最好。

DMA中断服务函数:

void DMA1_Channel1_IRQHandler(void) { u16 i = 0; DMA_Cmd(DMA1_Channel1, DISABLE); DMA_ClearITPendingBit(DMA_IT_HT); DMA_ClearITPendingBit(DMA1_IT_TC1); //清除中断标志位 for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭