STM32单片机的输入捕获与FFT测频

控制/MCU

1814人已加入

描述

一、硬件连接

1、电压信号处理电路仿真

STM32单片机

图1.1.1 Proteus仿真图(使用教程)

2、单片机连接

主控MCU:STM32F103ZET6(STM32的介绍),LM293输出连接在PB0上检测电压信号的频率,如图1.1.1与图1.2.1所示。

STM32单片机

图1.2.1 原理图截图

STM32单片机

图1.2.2 管脚功能截图

如图1.2.2所示,注意其中的TIM3_CH2N是PWM捕获比较输出,TIM3_CH3才是输入捕获。

STM32单片机

图1.2.3 内部高级控制定时器框图

二、程序部分

这里通过STM32输入捕获或FFT转换两种方式实现频率的测量,在实际工程中都已实现。STM32输入捕获信号幅度小于2V时,单片机检测不到跳变沿,需硬件对信号适当处理(如图1.1.1)。PB0/ADC8也可用ADC读信号电压值,ADC值为0时进行记录,再次为0就相当于经过了半个周期。计算两次ADC为0的时间差,就可以计算出信号的频率,这种方法不会受限于信号幅度的限制。

1、通过STM32输入捕获

下面的程序采集PB0口(图1.2.1)的电压信号,因频率较低,且要求继电器出口时间小于35mS,采用测周法计算频率。给出主要部分定时器配置与定时器中断程序。因上升沿示波器测试并不陡峭(图1.1.1仿真图也可看出),故取一周波两次下降沿。

注意:后期的处理程序必须捕获到两个下降沿的前提下,才能作相应的处理。采集程序未完成,此时处理会出错。

STM32单片机

图2.1.1 示波器信号

1)定时器配置

void adc_TIM_Init(void){   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定时器   GPIO_InitTypeDef GPIO_InitStructure; //端口   TIM_ICInitTypeDef TIM_ICInitStructure; //输入捕获      //初始化GPIO口  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入模式   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;   GPIO_Init(GPIOB,&GPIO_InitStructure);   GPIO_SetBits(GPIOB,GPIO_Pin_0);      //使能时钟   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //TIM3   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);      //初始化TIM3定时   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);   TIM_TimeBaseStructure.TIM_Prescaler = 17; //1MHz计数脉冲 1uS   TIM_TimeBaseStructure.TIM_Period = 65535;   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);      //初始化TIM3 Channel3输入捕获IC(Input Capture)   TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;   TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling; //下降沿捕获   TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //管脚与寄存器一一对应   TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //有下降沿就捕获,不分频   TIM_ICInitStructure.TIM_ICFilter=0x00; //不打开输入捕获滤波器   TIM_ICInit(TIM3,&TIM_ICInitStructure);   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时中断   TIM_ITConfig(TIM3,TIM_IT_CC3,ENABLE); //允许CC3捕获中断   TIM_Cmd(TIM3,ENABLE);}

-------------------------------- 2)定时溢出和输入捕获中断处理

void TIM3_IRQHandler(void) //TIM3{   static u8 CapStatus=0;//捕获状态,CapStatus=0未捕获到第1个下降沿,CapStatus=1捕获到第1个下降沿   static u8 TIM3_CH3_Capture=0; //总的计数次数   u32 FrequencyTemp=0;      if(TIM_GetITStatus(TIM3,TIM_IT_Update)) //TIM3定时溢出更新中断   {      TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位      if(CapStatus)         TIM3_CH3_Capture++;   }      if(TIM_GetITStatus(TIM3,TIM_IT_CC3)) //RB0输入捕获中断   {      TIM_ClearITPendingBit(TIM3,TIM_IT_CC3); //清除中断标志位      if(!CapStatus)      {         CapStatus=1;         TIM_SetCounter(TIM3,0); //计数器清零      }      else if(CapStatus) //已经捕获到第1个下降沿      {         CapStatus=0;         FrequencyTemp=TIM_GetCapture3(TIM3)+TIM3_CH3_Capture*65536;//计算两个下降沿总计数         TIM3_CH3_Capture=0; //溢出次数清零         TIM_SetCounter(TIM3,0); //计数器清零         FrequencyValue=400000000/FrequencyTemp;//计算频率,比如5000,单位0.01Hz      }   }}

STM32单片机

图2.1.2 继保频率设置

图2.1.2 继保频率设置

STM32单片机

图2.1.3 实际测量值

图2.1.3 实际测量值

2、通过FFT实现

1)概述 下面是采集PC1口(图1.2.1)的小通道电流信号,计算频率,其固件具ST官方DSP库实现FFT,测试固件移步:

FFT(具ST官方DSP库实现)

STM32单片机

图2.2.1 实际测量值

-------------------------------- 2)数据采集 使用STM32F103自带的12位ADC进行数据采集,定时器触发ADC采集,DMA搬运,定时器时间自行设置,采样频率已知。

-------------------------------- 3)功能介绍 通过FFT可以准确测量电压值、电流值、有功功率、无功功率、频率、谐波分量(比如显示2~32次谐波)、相角(电压与电流夹角)。 互感器二次值精确到小数点后2位无压力,电流范围大,硬件增加大小通道、程序分别采集;涌流二次谐波含量最多,故可实现二次谐波制动,

----------------- 已实现FFT的控制板:

STM32单片机

图2.2.2 主控板正面

STM32单片机

图2.2.3 主控板反面

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分