最新AVR单片机占空比及频率测量学习笔记资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信号占空比测量及频率计算
测量信号频率只要得到信号的两个上升沿或者下降沿之间所用的时间即可。

占空比指一个信号高电平和这个信号周期时间的比值,测量信号占空比只需测量信号一下降沿和上升沿之间的距离即可。

测量边沿可以采用AVR单片机外部中断,中断可以设置成边沿触发,设置为上升沿触发或者下降沿触发。

同时启用一个定时器,用定时器的计数值取得相应的时间。

定时器初始化:只需将定时器打开,单片机晶振为16M时,AVR单周期及可计算定时器每曾一所用的时间。

例如用8分频时,每加1用时0.5us。

void Timer1_init(void)
{
CLI(); //disable all interrupts
TCNT1H = 0x00; //清零计数值
TCNT1L = 0x00;
TIMSK |=(1<<TOIE1); //开启溢出中断
TIMSK |=(1<<TICIE1); //开启捕获中断
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 |=(1<<TOIE1); //开启溢出中断
TIMSK |=(1<<TICIE1); //开启捕获中断
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; //将标志位清零
}
}。

相关文档
最新文档