STM32F103过零法测任意交流信号频率(小于40K)

        对于信号频率的测量有许多方法,精度最高、最可靠的方法自然是利用FFT。但实际上对于低频信号,如果仅仅是测频则并不需要用到FFT这样复杂的算法,毕竟对于小白来说FFT的算法基本都是在网上复制粘贴的(没错是我)。下面就提供一种利用STM32的AD实现的测频方法。

        受限于STM32的AD的采样频率,在精度要求的范围内采样信号最好不超过40K。下面先讲一下什么是过零法测频率。

 过零法

         顾名思义,过零法就是先找到交流信号的两个过零时刻,就是从负半周期向正半周期转换的时刻,或者是从正半周期向负半周期转换的时刻,通过计算这两个时刻之间的时间即可得到交流信号半个周期的时间,换算一下便可以得到交流信号的频率。

算法实现

        由于STM32的AD不能测量负电压,所以对于负半周期的信号ADC的采样值会恒定为0,那么只要我们一直等待,直到ADC的测量电压不为0时,我们便得到了第一个过零时刻,这是我们要开启定时器。之后我们继续等待,直到ADC的测量电压再次为零,我们便得到了第二个过零时刻,这时候我们关闭定时器,读取定时器的值便可以得到交流信号半个周期内的时间。

代码

        以下是主要算法的代码:

if(KEY0)		//按键按下 
		{
			while(KEY0);		//等待按键松开
			for(i=0;i<50;i++)		//循环50次
			{
			  temp = 1;
				while(temp!=0)		//等待信号为0,即信号进入负半周期
				{
					temp = Get_Adc1(ADC_Channel_1);//PA1
				}

				temp = 0;
				
				while(temp<=0)		//等待信号大于0,即信号进入正半周期,此时为第一个过零时刻
				{
					temp = Get_Adc1(ADC_Channel_1);//PA1
				}	
			
				TIM_Cmd(TIM4,ENABLE);		//开启定时器
				temp = 1;
				
				while(temp!=0)		//等待信号小于0,即信号进入负半周期,此时为第二个过零时刻
				{
					temp = Get_Adc1(ADC_Channel_1);//PA1
				}
								
				cnt = TIM4->CNT;		//读取定时器的值
				TIM_Cmd(TIM4, DISABLE);		//关闭定时器
				TIM4->CNT = 0;			//计数器清零
				
				fre[i] = 500000/((cnt*0.125f)+(TIME*7500));		//频率换算
				TIME = 0;
				
			}
			//信号求平均,去最大、最小值
			for(i=0;i<50;i++)
			for(k=0;k<50-i;k++)
			{
				if(fre[k]>fre[k+1])
				{
					temp2 = fre[k];
					fre[k] = fre[k+1];
					fre[k+1] = temp2;
				}
			}
			
			for(i=21;i<=30;i++)
			{
				FRE += fre[i]; 
			}
			//打印频率
			printf("%f\r\n",FRE/10);
			FRE = 0;
		}

测量结果

频率范围误差
100Hz以下测不准
100Hz~1KHz小于0.5%
1KHz~10KHz小于2%
10KHz~40KHz小于3%

         这里使用一个按键进行控制(不支持连续按),按键每按下一次,串口打印一次信号的频率。输入信号的IO口为PA1。需要工程文件的可以在下面留下邮箱(手动狗头)。

  • 22
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 123
    评论
### 回答1: STM32F103MINI板是一款主流的嵌入式微控制器开发板,它有广泛的应用领域,在众多领域都需要测量频率。 首先,我们需要了解如何使用STM32F103MINI板来测量频率。可以使用它的定时器来实现对外部信号的计数。需要注意的是,频率越高,计数溢出的次数就越多,因此需要选择合适的计时器和计数值来确保准确度。 其次,我们需要确定要测量的频率范围和精确度要求,从而选择适当的计时器分频系数和定时器计数器的精确度。在处理频率测量数据时,需要使用适当的算法对数据进行处理,以获得准确的频率值。 最后,当我们实际进行频率测量时,需要首先对所选的模式进行初始化和配置,然后启动定时器计数,并处理计数器溢出的情况。通过计算计数器的溢出次数和定时器计数器值,就可以计算出被测量信号频率。 总之,对于STM32F103MINI板的频率测量,需要对外部信号的计数和处理,以及算法处理和实时计算,因此需要有一定的硬件电子和编程技能。 ### 回答2: STM32F103MINI是一款嵌入式微控制器,用于电子产品中的控制和处理器。它具有高性能,简单易用,可靠性高等优点,因此被广泛应用。在使用STM32F103MINI板进行频率测试时,需要对板子上的定时器进行配置,以下是具体步骤: 1.选择一个计数频率,比如1MHz,并将其连接到板子的输入引脚。 2.启动定时器,并设置为计数模式。 3.在定时器计数器到达最大计数值时,打开一个输出引脚,即Pulse。 4.使用示波器来记录Pulse信号。 5.使用示波器来测量两个Pulse信号之间的时间差,从而计算出频率。 当我们完成了上面的步骤后,我们就可以测量出我们所连接的信号频率。这个方法适用于测量电子电路中的频率,比如电机转速、电子钟等。 总之,使用STM32F103MINI板进行频率测试是一项非常有价值的技能,可以帮助我们更好地理解和掌握电子电路的工作原理。同时,它也是电子爱好者必备的基础技能之一。 ### 回答3: STM32F103MINI是一种功能强大的嵌入式微控制器,可以用于各种应用,包括测量频率。在STM32F103MINI板上测量频率的方法有很多种,下面将介绍其中几种比较常用的方法: 1. 使用定时器:STM32F103MINI板有多个定时器,可以利用其中一个定时器来测量频率。具体实现方法是在定时器的计数器溢出时,产生一个中断,由中断服务程序来对输入的信号计数。通过计数器累计的次数和定时器的时钟周期数之间的比例可以计算出输入信号频率。 2. 计数器:另一种方法是使用STM32F103MINI板的计数器功能。在计数器的计数过程中,每当输入信号变化时,计数器会增加或减少一个计数器的值。通过计数器的计数值和计数器触发的时间可以计算出输入信号频率。 3. 外部计数器:有一些STM32F103MINI板可以通过外部计数器来测量频率。外部计数器有自己的时钟输入信号,并且在输入信号周期的每次变化时计数器会增加或减少一个计数器的值。通过外部计数器计数器的计数值和定时器的时钟周期数之间的比例可以计算出输入信号频率。 总的来说,在STM32F103MINI板上测量频率的方法有很多,可以根据具体的应用需求选择合适的方法来实现。需要注意的是,在测量频率时需要考虑输入信号的波形和幅度、采样率、测量精度等因素,以确保测量结果的准确性和可靠性。
评论 123
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值