欢迎来到天天文库
浏览记录
ID:50811473
大小:16.42 KB
页数:3页
时间:2020-03-14
《AVR单片机占空比及频率测量学习笔记.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、信号占空比测量及频率计算测量信号频率只要得到信号的两个上升沿或者下降沿之间所用的时间即可。占空比指一个信号高电平和这个信号周期时间的比值,测量信号占空比只需测量信号一下降沿和上升沿之间的距离即可。测量边沿可以采用AVR单片机外部中断,中断可以设置成边沿触发,设置为上升沿触发或者下降沿触发。同时启用一个定时器,用定时器的计数值取得相应的时间。定时器初始化:只需将定时器打开,单片机晶振为16M时,AVR单周期及可计算定时器每曾一所用的时间。。。例如用8分频时,每加1用时0.5us。voidTimer1_init(void){CLI();//
2、disableallinterruptsTCNT1H=0x00;//清零计数值TCNT1L=0x00;TIMSK
3、=(1<4、=(1<5、NT0_Init(void){MCUCR=0x03;//上升沿触发中断GICR=0x40;//开启外部0中断SEI();//开启总中断}在中断函数中,当有上升沿时,就可触发中断,在中断函数中有一标志位flag_Int,通过此标志位来判断是上升沿的中断还是下降沿产生的中断。第一次进入中断后flag_int==0;读取定时器1高低位的数据,同时将中断的触发沿改为下降沿触发,然后将定时器值清零。同时将flag_Int标志位置一,当信号变为下降沿时再次触发中断,此时进入flag_Int=1函数,此时读取定时器值,并将中断改为上升沿中断,此时即可6、计算(高电平时间=定时器数值*0.5us)将flag_Int=0,当边沿为上升沿时即可进入if(flag_Int==0),此时读取的定时器时间,及Int_End的值及为脉冲周期。脉冲周期时间=Int_End*0.5us。。。。(定时器16M,8分频)。注意:定时器1为16位,数据高低位分别在TCNT1L与TCNT1H中,在读取时必须先读取低位,后读取高位。而且要注意不能让定时器溢出,因此对于不同的定时器必须考虑其溢出时间。#pragmavector=INT0_vect__interruptvoidInt0_isr(void){u8h=07、,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捕获功能,捕获设置为边沿,捕获时进入捕获中8、断,在中断时将边沿改变即可取得比外部中断更好的效果。捕获功能就是为测量脉冲占空比及周期而设计的。定时器1初始化时需开启捕获功能及捕获中断,同时期设置捕获的边沿,在定时器对应的捕获端口即可进行对应的边沿捕获。voidTimer1_init(void){CLI();//disableallinterruptsTCNT1H=0x00;//清零计数值TCNT1L=0x00;TIMSK9、=(1<10、=(1<11、获噪声抑制SETBIT(TCCR1B,ICES1);//设置初始为上升沿捕获SEI();//re-enableinterrupts}在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragmavector=TIMER1_CAPT_vect__interruptvoidtimer1_capt(void){u8h,l;if(flag_Int==0)//接收到上升沿{l=ICR1L;//捕获12、寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);//更改为下降沿捕获TCNT1H=0x00;//清零计数寄存器TCNT1L=0x00;Int_End=h*256+l;//计算时间flag_I
4、=(1<5、NT0_Init(void){MCUCR=0x03;//上升沿触发中断GICR=0x40;//开启外部0中断SEI();//开启总中断}在中断函数中,当有上升沿时,就可触发中断,在中断函数中有一标志位flag_Int,通过此标志位来判断是上升沿的中断还是下降沿产生的中断。第一次进入中断后flag_int==0;读取定时器1高低位的数据,同时将中断的触发沿改为下降沿触发,然后将定时器值清零。同时将flag_Int标志位置一,当信号变为下降沿时再次触发中断,此时进入flag_Int=1函数,此时读取定时器值,并将中断改为上升沿中断,此时即可6、计算(高电平时间=定时器数值*0.5us)将flag_Int=0,当边沿为上升沿时即可进入if(flag_Int==0),此时读取的定时器时间,及Int_End的值及为脉冲周期。脉冲周期时间=Int_End*0.5us。。。。(定时器16M,8分频)。注意:定时器1为16位,数据高低位分别在TCNT1L与TCNT1H中,在读取时必须先读取低位,后读取高位。而且要注意不能让定时器溢出,因此对于不同的定时器必须考虑其溢出时间。#pragmavector=INT0_vect__interruptvoidInt0_isr(void){u8h=07、,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捕获功能,捕获设置为边沿,捕获时进入捕获中8、断,在中断时将边沿改变即可取得比外部中断更好的效果。捕获功能就是为测量脉冲占空比及周期而设计的。定时器1初始化时需开启捕获功能及捕获中断,同时期设置捕获的边沿,在定时器对应的捕获端口即可进行对应的边沿捕获。voidTimer1_init(void){CLI();//disableallinterruptsTCNT1H=0x00;//清零计数值TCNT1L=0x00;TIMSK9、=(1<10、=(1<11、获噪声抑制SETBIT(TCCR1B,ICES1);//设置初始为上升沿捕获SEI();//re-enableinterrupts}在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragmavector=TIMER1_CAPT_vect__interruptvoidtimer1_capt(void){u8h,l;if(flag_Int==0)//接收到上升沿{l=ICR1L;//捕获12、寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);//更改为下降沿捕获TCNT1H=0x00;//清零计数寄存器TCNT1L=0x00;Int_End=h*256+l;//计算时间flag_I
5、NT0_Init(void){MCUCR=0x03;//上升沿触发中断GICR=0x40;//开启外部0中断SEI();//开启总中断}在中断函数中,当有上升沿时,就可触发中断,在中断函数中有一标志位flag_Int,通过此标志位来判断是上升沿的中断还是下降沿产生的中断。第一次进入中断后flag_int==0;读取定时器1高低位的数据,同时将中断的触发沿改为下降沿触发,然后将定时器值清零。同时将flag_Int标志位置一,当信号变为下降沿时再次触发中断,此时进入flag_Int=1函数,此时读取定时器值,并将中断改为上升沿中断,此时即可
6、计算(高电平时间=定时器数值*0.5us)将flag_Int=0,当边沿为上升沿时即可进入if(flag_Int==0),此时读取的定时器时间,及Int_End的值及为脉冲周期。脉冲周期时间=Int_End*0.5us。。。。(定时器16M,8分频)。注意:定时器1为16位,数据高低位分别在TCNT1L与TCNT1H中,在读取时必须先读取低位,后读取高位。而且要注意不能让定时器溢出,因此对于不同的定时器必须考虑其溢出时间。#pragmavector=INT0_vect__interruptvoidInt0_isr(void){u8h=0
7、,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捕获功能,捕获设置为边沿,捕获时进入捕获中
8、断,在中断时将边沿改变即可取得比外部中断更好的效果。捕获功能就是为测量脉冲占空比及周期而设计的。定时器1初始化时需开启捕获功能及捕获中断,同时期设置捕获的边沿,在定时器对应的捕获端口即可进行对应的边沿捕获。voidTimer1_init(void){CLI();//disableallinterruptsTCNT1H=0x00;//清零计数值TCNT1L=0x00;TIMSK
9、=(1<10、=(1<11、获噪声抑制SETBIT(TCCR1B,ICES1);//设置初始为上升沿捕获SEI();//re-enableinterrupts}在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragmavector=TIMER1_CAPT_vect__interruptvoidtimer1_capt(void){u8h,l;if(flag_Int==0)//接收到上升沿{l=ICR1L;//捕获12、寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);//更改为下降沿捕获TCNT1H=0x00;//清零计数寄存器TCNT1L=0x00;Int_End=h*256+l;//计算时间flag_I
10、=(1<11、获噪声抑制SETBIT(TCCR1B,ICES1);//设置初始为上升沿捕获SEI();//re-enableinterrupts}在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragmavector=TIMER1_CAPT_vect__interruptvoidtimer1_capt(void){u8h,l;if(flag_Int==0)//接收到上升沿{l=ICR1L;//捕获12、寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);//更改为下降沿捕获TCNT1H=0x00;//清零计数寄存器TCNT1L=0x00;Int_End=h*256+l;//计算时间flag_I
11、获噪声抑制SETBIT(TCCR1B,ICES1);//设置初始为上升沿捕获SEI();//re-enableinterrupts}在捕获中断函数中,同样通过标志位的置一和清零来区分是上升沿触发和下降沿触发,与采用外部中断方法相似,此时通过ICR1及ICRH来捕获寄存器来读取,产生边沿触发时,将定时器数据捕获数据放入ICR寄存器。#pragmavector=TIMER1_CAPT_vect__interruptvoidtimer1_capt(void){u8h,l;if(flag_Int==0)//接收到上升沿{l=ICR1L;//捕获
12、寄存器h=ICR1H;CLRBIT(TCCR1B,ICES1);//更改为下降沿捕获TCNT1H=0x00;//清零计数寄存器TCNT1L=0x00;Int_End=h*256+l;//计算时间flag_I
此文档下载收益归作者所有