完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
很多低端MCU没有像STM32 那样拥有强大脉冲捕获测频率,那么MCU只能依靠自身有的资源来实现这个功能,比较通用的方法是使用了外部中断+定时器来实现,该方法经过我在实际项目中的使用来看,频率50/60Hz 完全没问题,最好加个滤波算法,效果会更好。 一、实现原理 思路:
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 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2951 浏览 16 评论
3455 浏览 1 评论
8984 浏览 16 评论
4045 浏览 18 评论
1094浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 07:12 , Processed in 0.456086 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号