两种测量正弦波的频率的方法分享.doc

上传人:白大夫 文档编号:3366846 上传时间:2019-08-18 格式:DOC 页数:4 大小:22.50KB
返回 下载 相关 举报
两种测量正弦波的频率的方法分享.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《两种测量正弦波的频率的方法分享.doc》由会员分享,可在线阅读,更多相关《两种测量正弦波的频率的方法分享.doc(4页珍藏版)》请在三一文库上搜索。

1、两种测量正弦波的频率的方法分享最近一直尝试各种方法测量一个正弦波的频率,可是都不太理想,老差几个hz,尤其中频,现在先将自己的方法供大家研讨。第一种方法:比较笨的方法,使用了回调函数,但是要设一个变量判断,是否符合条件。#define F_CPU sysclk_get_main_hz()#includeuint32_t frequence;static void my_frq_test_callback(void)if(frequence100)/如果想看结果的话,可以设置一个断点asm(“nop”);PORTA.INT0MASK=PIN1_bm;PORTA.INTCTRL=PORT_INT0

2、LVL_OFF_gc;tc_write_clock_source(/*这里不用tc_disable(启动定时器就行了*/frequence=0;int main(void)sysclk_init();pmic_init();/这里的IOPORT_PULL_UP加上后,不知道为什么会先产生个中断,也请分析一下ioport_configure_pin(IOPORT_CREATE_PIN(PORTA,1),IOPORT_DIR_INPUT|IOPORT_BOTHEDGES|IOPORT_PULL_UP);/这里的定义不知道能否加到上面的定义中,请给点建议PORTA.INT0MASK=PIN1_bm;

3、PORTA.INTCTRL=PORT_INT0LVL_MED_gc;tc_enable(tc_set_wgm(tc_write_period(tc_set_overflow_interrupt_callback(tc_set_overflow_interrupt_level(cpu_irq_enable();dowhile(1);ISR(PORTA_INT0_vect)if(frequence=0)tc_write_clock_source(elsefrequence+;第二种方法:用2个定时器,因为定时器的period的值是uint16_t的,如果超限,会引起程序工作不正常,所以用2个定时器

4、解决一下,第二个定时器一第一个定时器的溢出为时钟信号,没有用到回调函数,简单代码如下:#define F_CPU sysclk_get_main_hz()#includeuint32_t frq;int main (void)/* Insert system clock initialization code here (sysclk_init()。 */board_init();pmic_init();sysclk_init();/定义管脚中断PORTA.DIRCLR=PIN1_bm;PORTA.PIN1CTRL=PORT_ISC_BOTHEDGES_gc;/|PORT_OPC_PULLUP

5、_gc 此处还是不知道用不用上拉PORTA.INT0MASK=PIN1_bm;PORTA.INTCTRL=PORT_INT0LVL_MED_gc;/设置及使能事件sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_EVSYS);EVSYS.CH0MUX = EVSYS_CHMUX_TCC0_OVF_gc;/TCC0为第一个定时器,它的溢出提供给TCD0做为事件时钟tc_enable(tc_enable(tc_set_wgm(tc_set_wgm(/因为系统时钟用的是内部2M的时钟,除以50后,一个是好算事件,一个是最接近时钟溢出的period,period

6、不能超过65535,能有别的好方法 /也希望能指点一下tc_write_period(tc_write_period(tc_set_overflow_interrupt_level(tc_enable_delay(tc_write_clock_source(cpu_irq_enable();do while (tc_is_overflow(frq/=4;/可以在这里设置一个断点看结果,应该在后面对frq置0,方便后面的程序调用,可是如果后面我把frq置0,此时就看到的值也为0,也希望给点 /建议asm(“nop”);/* Insert application code here, after the board has been initialized. */do while (1);ISR(PORTA_INT0_vect)asm(“nop”);if(frq=0)tc_write_clock_source(frq+;以上就是2种测量方法的代码,第二个方法比第一个要快。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1