资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
精选优质文档-倾情为你奉上信号占空比测量及频率计算测量信号频率只要得到信号的两个上升沿或者下降沿之间所用的时间即可。占空比指一个信号高电平和这个信号周期时间的比值,测量信号占空比只需测量信号一下降沿和上升沿之间的距离即可。测量边沿可以采用AVR单片机外部中断,中断可以设置成边沿触发,设置为上升沿触发或者下降沿触发。同时启用一个定时器,用定时器的计数值取得相应的时间。定时器初始化:只需将定时器打开,单片机晶振为16M时,AVR单周期及可计算定时器每曾一所用的时间。例如用8分频时,每加1用时0.5us。void Timer1_init(void) CLI(); /disable all interrupts TCNT1H = 0x00; /清零计数值 TCNT1L = 0x00; TIMSK |=(1TOIE1); /开启溢出中断TIMSK |=(1TICIE1); /开启捕获中断 TCCR1B = 0x82; /8分频,自增一用时0.5us,开启输入捕获噪声抑制SETBIT(TCCR1B,ICES1);/设置初始为上升沿捕获 SEI(); /re-enable interrupts在中断函数使用中需先将其初始化,设置为起始的上升沿触发中断,并且开启外部中断及总中断,此时如果外部有上升沿及可触发中断函数。void INT0_Init(void)MCUCR=0x03;/上升沿触发中断GICR =0x40;/开启外部0中断SEI(); /开启总中断在中断函数中,当有上升沿时,就可触发中断,在中断函数中有一标志位flag_Int,通过此标志位来判断是上升沿的中断还是下降沿产生的中断。第一次进入中断后flag_int=0;读取定时器1高低位的数据,同时将中断的触发沿改为下降沿触发,然后将定时器值清零。同时将flag_Int标志位置一,当信号变为下降沿时再次触发中断,此时进入flag_Int=1函数,此时读取定时器值,并将中断改为上升沿中断,此时即可计算 (高电平时间=定时器数值*0.5us)将flag_Int=0,当边沿为上升沿时即可进入if(flag_Int=0),此时读取的定时器时间,及Int_End的值及为脉冲周期。脉冲周期时间=Int_End*0.5us。(定时器16M,8分频)。注意:定时器1为16位,数据高低位分别在TCNT1L 与TCNT1H中,在读取时必须先读取低位,后读取高位。而且要注意不能让定时器溢出,因此对于不同的定时器必须考虑其溢出时间。#pragma vector=INT0_vect_interrupt void Int0_isr(void)u8 h=0,l=0;if(flag_Int=0)/接收到上升沿l=TCNT1L;h=TCNT1H;MCUCR=0x02; /下降沿触发 /清零TCNT1H=0x00;TCNT1L=0x00;Int_End=h*256+l; /清零计数值flag_Int=1;else/接收到下降沿l=TCNT1L;h=TCNT1H;MCUCR=0x03; /上升沿触发Int_Mid=h*256+l;/取得TCNT2值 flag_Int=0;测量脉冲周期及占空比测量使用的另一方法为捕获,本次使用AVR定时器1捕获功能,捕获设置为边沿,捕获时进入捕获中断,在中断时将边沿改变即可取得比外部中断更好的效果。捕获功能就是为测量脉冲占空比及周期而设计的。定时器1初始化时需开启捕获功能及捕获中断,同时期设置捕获的边沿,在定时器对应的捕获端口即可进行对应的边沿捕获。void Timer1_init(void) CLI(); /disable all interrupts TCNT1H = 0x00; /清零计数值 TCNT1L = 0x00; TIMSK |=(1TOIE1); /开启溢出中断TIMSK |=(1TICIE1); /开启捕获中断 TCCR1B = 0x82; /8分频,自增一用时0.5us,开启输入捕获噪声抑制SETBIT(TCCR1B,ICES1);/设置初始为上升沿捕获 SEI(); /re-enable interrupts在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragma vector=TIMER1_CAPT_vect_interrupt void timer1_capt(void)u8 h,l;if(flag_Int=0) /接收到上升沿l=ICR1L; /捕获寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);/更改为下降沿捕获TCNT1H=0x00; /清零计数寄存器TCNT1L=0x00;Int_End=h*256+l; /计算时间flag_Int=1; /置为标位else /接收到下降沿l=ICR1L; /读取捕获数据h=ICR1H;SETBIT(TCCR1B,ICES1);/设置为上升沿捕获Int_Mid=h*256+l; /计算定时器数值 flag_Int=0; /将标志位清零专心-专注-专业
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号