精华内容
下载资源
问答
  • 频率电感电容计算.exe

    2020-02-23 16:15:51
    能快速计算电容、电感频率谐振点。能够加快设计师设计速度,有助于提高产能。 在调试中也可以广泛应该,不用花费时间去人力计算。只需要输入相应频率与数值
  • 傅里叶快速变换 FFT是一个用O(nlog_2 n)的时间将一个用... 最后查出频谱图的最大值的坐标index(应避开零点带来的冲激响应,坐标不能取到零点附近的部分),代入频率计算公式h=60秒*(index)*采样频率/(length(data))。

    傅里叶快速变换 FFT是一个用O(nlog_2 n)的时间将一个用系数表示的多项式转换成它的点值表示的算法,其用于加速多项式高精度乘法的时间O(n^2),是对DFT(离散傅里叶变换)的一个分治的做法。
    调用Matlab自带的fft函数进行运算,得出abs(fft(data-mean(data)))的结果,数据进行了去均值化,减小运算速度,同时data的数量为2的整数次幂,得出频谱图。
    最后查出频谱图的最大值的坐标index(应避开零点带来的冲激响应,坐标不能取到零点附近的部分),代入频率计算公式h=60秒*(index)*采样频率/(length(data))。

    展开全文
  • 此代码旨在使用希尔伯特变换计算瞬时频率 (IF)。
  • 这里要说明的是我并没有在100ms一次的中断里面立即计算结果.这样会导致性能方面的一些影响. 所以只是在中断中循环存储数据然后清零而已,取数据的时候再对数组求和.毕竟取数据的速度要低的多次数也少的多. 引入循环...

    为实现测量频率这个功能,采用STM32的定时器功能,大体方案是用2个定时器来实现,
    TIM4 定时器负责计数.
    TIM2 定时器负责1秒产生一次中断,执行一次脉冲计数采集工作.记录下TIM4的计数值.

    实现过程如下
    先看下时钟频率
    在这里插入图片描述
    配置定时器TIM2
    在这里插入图片描述
    TIM2开中断
    在这里插入图片描述
    关于定时器4是如何计数的,外部时钟模式走的是TI1_ED 时钟线.这里为啥是65536呢? 是因为这个计数器是16位的. 最大只能到65536-1,溢出以后自动到中断值里面.count_over++ 这样就可以计数很大的次数了.当然不中断也可以,还可以定时器级联.这样就要多占用一个定时器了.
    在这里插入图片描述

    后来发现上面这个是错误的,

    不能配置Time4的CH通道,时钟源改成ETR2就可以了。正确的是下面的效果,已验证。
    在这里插入图片描述

    实现代码如下

    void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)
    {
    	///每秒定时器
    	///定时器2.每1秒触发一次中断, 在中断中读取Time4 的脉冲数 
    	if (htim == &htim2 ) //检查TIM2更新中断发生与否
    	{ 
    	        //1.读取Count
    		    count_i = __HAL_TIM_GET_COUNTER(&htim4);
    		    __HAL_TIM_SET_COUNTER(&htim4, 0); //重置定时计数器
    	        //2.加上溢出数.* 36mhz
    		    count_i = count_over * 65536 + count_i;
    	        count_over = 0;
    	}
    
    	//TIM4 外部脉冲信号计数溢出,产生中断的时候就会进来.
    	//脉冲信号经过TIMx_CH1 输入滤波,和边沿检测后,转成TI1F_ED->TRC时钟信号.然后这个Conte 记录的实际上是霍尔传感器的脉冲数.
    	///定时器2.每次触发都是定时器计数超出了最大值,为了保证不丢失计数信息,只需要给溢出标志 count_over++;
    	//if (htim-> Instance ==TIM4 && __HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE)   != RESET)  //检查TIM2的中断是否更新中断,因为很多中断都会调用HAL_TIM_IRQHandler ,所以要区分一下
    	if (htim  == &htim4  )
    	{ 
    		count_over++;
    	}
    }
    
    

    今天发现定时器中断总是进不去.发现了2个问题

    一.生成的配置文件有问题
    需要点好几次NVIC中断,才能生成合格的代码. 生成的tim.c文件中应该有 HAL_NVIC_EnableIRQ(TIM2_IRQn);才能开启中断. 先确认下生成的代码有没有问题, 如果没有那么需要去勾上Nvic中断 再去掉.生成代码来回折腾几次就出来了.

    二 . 定时器开中断没有开启
    ,定时器开中断默认是没有开启的, 而且要在初始化代码里面手动初始化中断.

    void MyInit(void)
    {  
    	HAL_TIM_Base_Start_IT(&htim2);//开中断才会触发中断函数 HAL_TIM_PeriodElapsedCallback
    	HAL_TIM_Base_Start_IT(&htim4);//开中断才会触发中断函数 HAL_TIM_PeriodElapsedCallback
    }
     
    

    TIM Update event 计数更新事件的处理函数在HAL库的写法里面变了.
    在标准库时代是TIM_IRQHandler 里面写,
    后来HAL库发现已经实现了 HAL_TIM_IRQHandler .

    经过查看源代码发现, 在 void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)中调用了HAL_TIM_PeriodElapsedCallback.
    代码如下,那么只要实现 HAL_TIM_PeriodElapsedCallback方法就可以实现对 TIM Update event 的处理.也就是上面的代码.

    void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim){
      ....
      ....
      /* TIM Update event */
      if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
      {
        if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET)
        {
          __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
    #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
          htim->PeriodElapsedCallback(htim);
    #else
          HAL_TIM_PeriodElapsedCallback(htim);
    #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
        }
      }
      ....
      ....
    }
    

    在后来的调试过程中,发现.了另外两个问题.
    第一个是传感器的信号始终得不到, 因为我采用的是3144霍尔传感器, 这种传感器的信号输出引脚是可以直接挂在STM32芯片上Time2的外部始终引脚上的 . 后来在小火箭兄弟的帮助下,找到了问题的原因, 这种传感器要把GPIO mode引脚改成上拉Pull-up. 这样传感器的输出电压才能上来, 因为这个3144霍尔传感器在检测到磁性物体时发出的信号是低电压… 所以在没设置上拉的时候电压达不到,所以就检测不到信号了… (这应该属于低级问题了,我电子和单片机刚入门新手,请谅解),

    另外下面这个图里面的Time2 对于的应该是上文的Time4, 但是配置都是一样的,因为我的程序后来Time4的脉冲采集功能放在了Time2 Time2的定时1秒功能放在了Time1, 所以如下所见了.
    在这里插入图片描述
    第二个问题,测得的频率不及时.
    这个问题是因为我上面的Time1 配置是按照1秒更新一次频率数据, 这1秒一次的速度对于人来讲还行,但是对于某些机器来讲是不行的, 例如四轴飞行器,1S更新一次数据估计都要坠机了. 所以为了更快的得到实时数据,我改成了100ms更新一次数据.
    频率数据的实时性提高了,但是这样又引入了另外一个问题, 如果频率小于10HZ的时候,将无法测量准确. 因为在每100ms采样一次的时候有可能信号还没触发会在下一个100ms采样的时候触发. … 这样会导致10hz以下的频率无法准确测得.为了解决这个问题,我引入了 循环数组,将最近10次的计数值.存储在一个数组中. 100ms采样1次,1秒钟正好采样10次, 所以我创建了一个长度为10的数组,用来存储每次采样获得的霍尔传感器的脉冲次数. 在每次取数据的时候在求和.就得到了1秒钟的脉冲总数…
    这里要说明的是我并没有在100ms一次的中断里面立即计算结果.这样会导致性能方面的一些影响. 所以只是在中断中循环存储数据然后清零而已,取数据的时候再对数组求和.毕竟取数据的速度要低的多次数也少的多.
    引入循环池后的代码如下

    //频率相关的变量
    //int32_t pulse_count=0;
    #define SAMPLECOUNT 10
    //uint32_t count_over=0;
    uint32_t count_Array[SAMPLECOUNT];
    uint8_t count_ArrayIndex=0;
    //频率相关的变量 
    
    //读取转速数据,
    void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)
    {
    	if (htim == &htim2 )
    	{	    ///每0.1秒定时器 
    	        //1.读取霍尔传感器在0.1秒内收到的脉冲计数Count
    		    uint32_t count_i = __HAL_TIM_GET_COUNTER(&htim4);
    		    __HAL_TIM_SET_COUNTER(&htim4, 0); //把这个数值清零重新计数 
    	        if(count_ArrayIndex >= SAMPLECOUNT) {count_ArrayIndex = 0 ;}
    	        count_Array[count_ArrayIndex] = count_i;//pulse_count
    	        count_ArrayIndex ++;
    	} 
    }
    //在主函数中读取频率函数,将1秒内的10次计数求和即可
    int32_t ReadFrequency(void)
    {
    	int32_t Frequency =0;
    	for(int i=0;i<SAMPLECOUNT;i++){
    		Frequency += count_Array[i] ;
    	}
    	return Frequency;
    }
    

    经过测试,此方法非常有效, 可以测得1-10HZ以下的频率, 最高目前测到150KHZ没啥大问题. 而且省去了一个溢出变量和一个判断, 再高的频率我还没有方法测试,因为没有合适的信号发生器…有条件了再测一下.

    后来在经过实际比对的时候又发现一个致命的问题, 频率有点误差, 记录如下表:
    1khz 误差8hz
    2khz 误差15hz
    3khz 误差22hz
    4khz 误差30hz
    5khz 误差38hz
    6khz 误差45hz
    7khz 误差51hz
    8khz 误差60hz
    基本上呈线性误差.
    经过推测,在150khz的时候应该误差在1150左右, 但是实际上在150khz却只有200左右. 说明, 这个误差跟系统代码或逻辑没有什么关系. 因为如果是系统或代码引起的问题一般呈线性或固定误差. 那么这个误差是哪里来的呢?
    经过2个小时的苦思冥想, 终于明白了. 应该是时间问题.这个时间应该是我们的0.1秒定时器的时间不准确导致的. 我们的0.1秒可能就不是标准的0.1秒,有可能比0.1秒多了0.001秒, 10次累积下来就差不多了.所以我就开始调周期定时器的配置,最终改成了下面这个样子
    在这里插入图片描述
    这个小小的修改就把误差从200多降到了非常低的水平. 当然原先的-1是完全不对的.
    这里有个小技巧, 64001000和64010000理论上应该是一样的吧.但实际上不一样.
    这个地方640个时钟周期计数一次和6400个时钟周期计数一次,差了10倍. 在这段时间里面就有可能越过了好多信号. 所以要想时间精准就要减少预分频数.两者的成绩最后任然是0.1秒即可.
    相当于最小的时间片. 时间切得小,就越是精准. 但是下面的计数上限是65536. 不能超过这个数值.
    当然还有最佳的数值应该是100个时钟周期计数一次,计数超过64000就是0.1秒. 这样的时间片最小, 定时也更接近真正的0.1秒. 最终就是下面的配置了.
    在这里插入图片描述

       我又产生了另外一个疑问. 如何才能准确的产生绝对的0.1秒呢? 这似乎是不可能的事情...得和标准的原子时钟做比较.才行了.
    
    展开全文
  • C语言实现的FFT运算(包括计算后信号的幅值,频率,matlab验证结果一样)
  • 对信号进行频域特征提取,先通过傅里叶变换得到信号频谱,再计算频谱特征,包括重心频率,均方频率频率方差
  • STM32F0xx_TIM输入捕获(计算频率)配置详细过程

    万次阅读 多人点赞 2016-06-01 21:59:42
    捕获外部8个脉冲,前后读取一下计数的值,这个值就是外部脉冲的差值,从而计算频率。     配置过程详情 ①RCC时钟 该函数位于 bsp.c 文件下面; 我个人习惯第一步配置时钟,ST官方提供...

    推荐

    分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

     

    我的网站:https://www.strongerhuang.com

    我的知乎:https://www.zhihu.com/people/strongerHuang.com

     

     

    前言

        关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能。

        STM32芯片多数为16位计数,但基本上都有1个或两个32位的定时器,可惜的是我们最常使用的F1系列芯片中没有32位的定时器,F030中也没有,具体请看数据手册。

        今天主要总结关于STM32F0系列输入捕获,捕获信号频率,即所谓逻辑分析仪检测数字频率的功能。

        今天使用32位的TIM2作为捕获的定时器,为什么是32位,原因很简单,就是为了捕获(采集)更宽频率的波形,今天提供的工程可以采集0Hz - 10MHz的波形(建议2MHz一下,串口打印需要时间)。而16位就不行,提醒使用F1的朋友要注意这一点。官方提供的例程也是16位,检测的范围同样有限。

     

    下载

        ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议参考该手册,以后如果你换用一种型号芯片也方便了解。

     

    今天的软件工程下载地址(360云盘):

    https://yunpan.cn/cSztEbetLczKY  访问密码

     

    STM32F0xx的资料可以在我360云盘下载:

    https://yunpan.cn/cS2PVuHn6X2Bj  访问密码 8c37

     

    今天工程测试效果(视频):

    https://yunpan.cn/cSziVGGZbMagj  访问密码 5731

     

    准备工作

        今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。今天将源代码添加在timer.c文件里面,就不需要新建文件了。

     

    捕获原理

        看系统框图,今天使用分频的方式来采集波形,官方提供的例程是没有配置TimeBase参数,也没有分频,分频的好处在于不是非常实时的获取波形,这样有利于提供精度(可以说是计算平均值)。捕获外部8个脉冲,前后读取一下计数的值,这个值就是外部脉冲的差值,从而计算出频率。

     

     

    配置过程详情

    ①RCC时钟

    该函数位于bsp.c文件下面;

    我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。关于RCC时钟的配置比较重要,有好几次我就是由于忘记配置相应RCC时钟,让我找了很久的问题,最后才发现是RCC时钟没有配置。

    注意:

    外设时钟不要随便添加,比如:RCC_APB1外设不要配置在RCC_APB2时钟里面【如:RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);这样能编译过,但是错误的

    我每次都提醒RCC时钟,是因为很多人就是因为时钟而导致软件运行有问题,所以,提醒更多人要注意配置RCC.

     

    ②捕获引脚配置

    该函数位于timer.c文件下面;

    重点注意:

    引脚配置要和对应通道匹配才行(请看数据手册中的引脚说明)。

    复用功能同样也是需要配置。

     

    ③TIM捕获配置

    该函数位于timer.c文件下面;

    这里的分频值配置为一样,方便计算。

     

    ④捕获频率的计算

    该函数位于stm32f0xx_it.c文件下面;

    这个函数就是捕获中断函数,采集8个脉冲的前后中断一次,即读取一下计数值,通过计数值的差就可以算出频率了。

     

    说明

    STM32F0的芯片软件兼容性很好,可以适用于F0其他很多型号的芯片(具体请看手册、或者亲自测试)。

    今天的工程是基于工程“STM32F0xx_TIM基本延时配置详细过程”修改而来,以上实例总结仅供参考,若有不对之处,敬请谅解。

     

     

    最后

    我的网站:https://www.strongerhuang.com

    我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

     

    微信公众号

     

    展开全文
  • 对FFT中的频率与实际频率之间的关系进行了介绍,本文为文字描述,所摘抄来源也已经在文中注明,讲解了实际物理频率、角频率、圆周频率、归一化频率。以及fft变化后的频率与实际频率之间的关系
  • 按组距为300编制频数表,计算频数,频率和累积频率表,并绘制直方图 某厂对50个计件工人某月份工资进行登记,获得以下原始资料(单位:元) 试按组距为300编制频数表,计算频数,频率和累积频率表,并绘制直方图。...

    按组距为300编制频数表,计算频数,频率和累积频率表,并绘制直方图

    某厂对50个计件工人某月份工资进行登记,获得以下原始资料(单位:元)
    试按组距为300编制频数表,计算频数,频率和累积频率表,并绘制直方图。要求写出用R语言进行基本统计的程序(数据可以从mvexec4.xls中获得)。

    (1)获取数据的变量名和数据的长度如何求频数

    大写x是excel中研究数据的变量名,一定要绑定数据attach();
    结束后释放数据detach();
    
    > attach(mvexec4)
    >  > names(mvexec4)
    [1] "X"
    > length(X)
    [1] 50
    >	hist(X,breaks = seq(0,3000,by=300),col = 1:7)
    

    在这里插入图片描述

    breaks = seq(0,3000,by=300)是设置一个区间范围

    求频率

    m<- seq(0,3000,by=300)
    hist(X,m,freq = F,col = 1:7)
    

    #freq = F就是求频率,freq = T就是求频数(hist(X,m,freq = T,col = 1:7))

    在这里插入图片描述
    求累积频率

    > cumsum(X)    #求累积
     [1]  1465  3225  5210  7480 10460 11835 13570 15510 17730 20400 21805 23560
    [13] 25525 27765 30585 31880 33525 35405 37515 40065 41420 43130 45040 47230
    [25] 49830 51095 52720 54585 56680 59200 60425 62030 63875 65915 68345 69520
    [37] 71115 72950 74980 77350 78350 79885 81695 83705 85995 87120 88695 90510
    [49] 92540 94860
    > M <- seq(0,96000,by=3000)
    > hist(Cumsum,M,freq = F,col = 1:12,las=3)
    

    在这里插入图片描述

    展开全文
  • matlab读入一个txt英文文本并将英文字母存入变量,实现了将出现的26个字母大小写统一,计算出了出现的各种字符(包括空格以及非字母的字符)出现的频数及其频率
  • LABVIEW中fft控件使用例程,可以直接求出频率。信号用的里面的生成信号。对于做硬件来说,可以利用单片机采集后,利用串口传给labview,存入数组里,直接对数组进行fft,计算频率时写入采样频率即可。
  • 混叠频率计算方法及计算公式
  • 频率频点计算器

    2018-07-18 17:49:14
    用于计算LTE频点相关的工具 可以计算频带频点,正反都可以推算
  • 在STM32F103单片机上,用定时器捕获模式测量输入PWM波频率,通过捕获两次PWM波上升沿,通过两次上升沿时间差计算PWM波频率
  • 水文频率计算软件

    2018-06-15 09:23:53
    用于水文推算,辅助水文资料分析,数据处理,以及水文频率计算的小软件
  • lc低通滤波器截止频率计算公式 LC串联时, 电路复阻抗 Z = jwL-j(1/wC) 令Im[Z]=0,即 wL=1/(wC) 得 w =根号下(1/(LC)) 此即为谐振角频率,频率自己换算. 并联时 电路复导纳 Y = 1/( jwL)+1/[-j(1/wC)]=j[wC-1/(wL)] 令...
  • SG3525频率计算方法

    2018-10-09 22:45:20
    锯齿波的频率: 将上述频率除以2即为输出波的频率
  • 水文频率计算适线软件
  • 正玄波频率计算

    2018-01-22 09:43:26
    采样率是1us 1到100KHz正玄波周期和频率计算没有什么问题。printf串口直接可以打印周期和频率
  • 一个电感和一个电容组成的LC谐振回路有LC串联回路和LC并联回路两种 。理想LC串联回路谐振时对外呈0阻抗,理想LC并联回路谐振时对外阻抗无穷大。利用这个特性可以用LC回路做成各种振荡电路,选频网络,滤波网络等。
  • STM32 PWM任意频率计算

    千次阅读 2020-03-06 11:12:28
    STM32 PWM任意频率计算 以STM32F103为例总频是72M,定时器频率F与分频PSC、重装值ARR之间的关系为: F=72M(ARR+1)∗(PSC+1)F=\frac{72M}{(ARR+1)*(PSC+1)}F=(ARR+1)∗(PSC+1)72M​ 如果是要根据频率F来计算ARR和PSC...
  • 计算线程时间, 频率,周期,CPU频率

    千次阅读 2018-10-23 18:49:38
    不考虑多核的情况下计算频率 //以微秒计算频率 __int64 getThreadCpuFrequencyInMHZ() { int pri = GetThreadPriority(GetCurrentThread()); SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST)...
  • P3型经验频率曲线计算程序,包括计算软件与使用说明,可以直接导入excel数据进行P3型曲线绘制,全程自动,可直接在程序上调节Cs与Cv值进行适线,简单方便。
  • 一级行星两级平行轴增速齿轮箱的啮合频率matlab计算代码。
  • 水文频率计算并适线,自动计算均值,CV以及拟合度情况
  • 计算连续系统的频率响应,并采用c++的包进行绘图
  • matlab程序,可对肌电信号进行处理。 matlab程序,可对肌电信号进行处理。 matlab程序,可对肌电信号进行处理。 matlab程序,可对肌电信号进行处理。
  • 非常有用的 LC振荡频率计算器LC震荡频率计算工具lc调频振荡计算软件 简单易用,小巧精简,lc振荡频率计算器。调频振荡计算器,收音机频率,高频振荡计算软件,LC振荡频率计算软件。 无线振荡计算 LC计算公式 绿色...
  • 计算瞬时频率

    2012-09-27 09:44:04
    介绍非平稳信号的瞬时频率计算。利用hht算法,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 358,380
精华内容 143,352
关键字:

如何计算频率