瑞萨单片机之外部中断实现频率采集(三)

很多低端MCU没有像STM32 那样拥有强大脉冲捕获测频率,那么MCU只能依靠自身有的资源来实现这个功能,比较通用的方法是使用了外部中断+定时器来实现,该方法经过我在实际项目中的使用来看,频率50/60Hz 完全没问题,最好加个滤波算法,效果会更好。

一、实现原理

思路:

  1. 定时器定时间隔周期512us,外部中断上升沿触发。
  2. 当第一个上升沿到来时,对计数器清理操作,此时定时器中断就会重新对这个计数器不断计数。
  3. 当第二个上升到来时,就可很快算出两个上升沿之间的间隔时间,间隔时间=cnt*512 us,从而获得周期,间而获取频率。

在这里插入图片描述

二、具体实现

2.1 封装结构

typedef  struct GET_FRE
{
  u32 cnt;        /*计数*/
  u32  cnt_value; /*脉冲计数值*/
  u16 timeout;   /*超时*/
  u16 fre;       /*频率*/
  u8  flag;     	
};

2.2 瑞萨单片机定时中断函数

CS+ 中配置定时间隔时间
在这里插入图片描述
配置好后,点击生成代码即可
在这里插入图片描述

注意:定时器周期512us

__interrupt static void r_tau0_channel0_interrupt(void)
{
   get_fre.cnt++;  
	
 /*******2s 内未检测到电平跳变则清零********/
  get_fre.timeout++;     
  if(get_fre.timeout>=3906)
  {
    get_fre.timeout=0;
    get_fre.fre=0;
    get_fre.cnt=0;
  }
}

2.3 瑞萨单片机外部中断函数

配置外中断,上升沿触发,最高优先级,最后点击生成代码即可
在这里插入图片描述

__interrupt static void r_intc0_interrupt(void)
{
	 get_fre.cnt_value=get_fre.cnt;
	 get_fre.cnt=0;   
	 get_fre.timeout=0;
	 get_fre.flag=1;	
}

2.4 例子

  if(get_fre.flag)
  {
    get_fre.flag=0;

    /*
 	   频率f=1/t 
  	  get_fre.cnt_value<<9 =计数值*512us =周期  此时单位是 us,也就是MHz
  	  f=1000000/t,1 MHz =1000 000 Hz
    */  
    get_fre.fre =(10000000/(get_fre.cnt_value<<9)); //hz  为提高精度比真数据扩大10 
  }

2.5 图片

注意:实际程序中加了滤波算法

单片机采集结果:74.9Hz
请添加图片描述
示波器采集结果:75.08Hz
请添加图片描述
单片机采集结果:108.3Hz
请添加图片描述
示波器采集结果:108.2Hz请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值