AVR单片机中,如果不用PWM,那么如果控制定时器输出一个脉冲和一串脉冲,怎么控制定时器输出脉冲的频
答案:2 悬赏:0 手机版
解决时间 2021-02-11 10:53
- 提问者网友:骑士
- 2021-02-11 05:12
是不是产生中断的频率越高,定时器发脉冲的频率也就高呢?
最佳答案
- 五星知识达人网友:廢物販賣機
- 2021-02-11 05:37
1.当定时中断到来时,可以对某个I/O进行置位或者清零来达到输出脉冲的目的。
如:
10ms的定时中断,当第一次中断来时,在PA0上输出高电平;
第二次中断时,在PA0上输出低电平;
这样就可以输出频率一定,占空比也一定的脉冲串或者单片脉冲(如检测某个状态,当符合时,才输出高/低电平)。
我们可以看到,这样做可能很麻烦,特别是在占空比或者周期要时刻改变的情况下,就更复杂了,要不断的去检测某些状态值,再根据这些值去进行相应的设置。
如果使用PWM,如快速PWM模式,就能很方便的进行更改周期和占空比。
选用哪种方式,当然要看具体实现什么目的了。
2.对于产生中断的频率越高,脉冲频率也会相应的增高(特殊情况除外)。
3.这里以快速PWM模式为例说明:
在模式14的条件下,即WGM13:0=1110,其输入捕捉寄存器当做为TOP值(即当TCNT1的值和此值一样时,则TCNT1返回到0x0000)。比较寄存器用于改变占空比,当TCNT1与此值比较匹配时,则输出引脚上电平发生跳变,达到改变占空比的目的。
改变TOP 就会改变频率,改变比较匹配值,则改变占空比。
补充回答:
1.定时器每次溢出后,其值返回到0x00(8位定时器),所以,如果你的初值不是0x00,就必须由软件重新赋初值。
2.在PWM模式下与我们所用定时器是不一样的,比较匹配后,根据设置来对输出电平进行切换。对于捕捉值,只是定时计数寄存器计数到此值时,则返回到0x0000,即使此时还没有到0xFFFF(捕捉值小于0xFFFF)。
意思是说,这个可以不用手动设置初值,但是如果你想改变周期或者占空比什么的,就得改变这些值了。
以上说明都是以快速PWM为例进行说明的,其它方式可能不一样。
设置好后,由硬件自动切换,不需软件来操作。
如:
10ms的定时中断,当第一次中断来时,在PA0上输出高电平;
第二次中断时,在PA0上输出低电平;
这样就可以输出频率一定,占空比也一定的脉冲串或者单片脉冲(如检测某个状态,当符合时,才输出高/低电平)。
我们可以看到,这样做可能很麻烦,特别是在占空比或者周期要时刻改变的情况下,就更复杂了,要不断的去检测某些状态值,再根据这些值去进行相应的设置。
如果使用PWM,如快速PWM模式,就能很方便的进行更改周期和占空比。
选用哪种方式,当然要看具体实现什么目的了。
2.对于产生中断的频率越高,脉冲频率也会相应的增高(特殊情况除外)。
3.这里以快速PWM模式为例说明:
在模式14的条件下,即WGM13:0=1110,其输入捕捉寄存器当做为TOP值(即当TCNT1的值和此值一样时,则TCNT1返回到0x0000)。比较寄存器用于改变占空比,当TCNT1与此值比较匹配时,则输出引脚上电平发生跳变,达到改变占空比的目的。
改变TOP 就会改变频率,改变比较匹配值,则改变占空比。
补充回答:
1.定时器每次溢出后,其值返回到0x00(8位定时器),所以,如果你的初值不是0x00,就必须由软件重新赋初值。
2.在PWM模式下与我们所用定时器是不一样的,比较匹配后,根据设置来对输出电平进行切换。对于捕捉值,只是定时计数寄存器计数到此值时,则返回到0x0000,即使此时还没有到0xFFFF(捕捉值小于0xFFFF)。
意思是说,这个可以不用手动设置初值,但是如果你想改变周期或者占空比什么的,就得改变这些值了。
以上说明都是以快速PWM为例进行说明的,其它方式可能不一样。
设置好后,由硬件自动切换,不需软件来操作。
全部回答
- 1楼网友:三千妖杀
- 2021-02-11 06:42
额,也不讲明用什么编译器,我用的是gcc,mega16,8m外部晶振
其他看注释,熔丝位设为外部晶振,
#include<avr/io.h> #include<avr/interrupt.h>
int main(void) { ddrb = 0xff; portb = 0xff; tcnt1h = 15535/256; tcnt1l = 15535%256;//计50000次才溢出 timsk |= (1 << toie1);//使能中断 tccr1b |= (1 << cs11);//8分频 sei(); while(1) { } }
volatile unsigned int i; signal(sig_overflow1) { tcnt1h = 15535/256; tcnt1l = 15535%256; i ++; if(i >= 20)//晶振为8m,8分频,每次溢出为跳50000次,1s/((1/8000000)*50000*8)=20 { //所以循环20次 i = 0; portb ^= 0xff; //pb口接led,实现1s翻转。 } }
欢迎追问。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯