Timer avr时间R1 16位快速PWM

Timer avr时间R1 16位快速PWM,timer,avr,pwm,Timer,Avr,Pwm,我使用的是Atmega328p处理器。我尝试使用定时器1进行16位PWM以及使用溢出Intrurupt增加定时器。我的代码如下,我还在make文件中将F_CPU设置为8000000 ul 我希望有一个变量,在规定的时间内计数,然后重置并继续。到目前为止,我预计它会累计7.5秒。我相信我应该有一个8兆赫的时钟频率,然后与快速PWM 1预分频器和ICR1在5000我希望Intrupt发生在1600赫兹。然后我让它累计12000次。我预计这需要7.5秒。但我在57秒左右测量过。我不确定我遗漏了什么,可

我使用的是Atmega328p处理器。我尝试使用定时器1进行16位PWM以及使用溢出Intrurupt增加定时器。我的代码如下,我还在make文件中将F_CPU设置为8000000 ul

我希望有一个变量,在规定的时间内计数,然后重置并继续。到目前为止,我预计它会累计7.5秒。我相信我应该有一个8兆赫的时钟频率,然后与快速PWM 1预分频器和ICR1在5000我希望Intrupt发生在1600赫兹。然后我让它累计12000次。我预计这需要7.5秒。但我在57秒左右测量过。我不确定我遗漏了什么,可能是寄存器设置中的某些内容,但我不确定在哪里。谢谢你的帮助

这是我认为最重要的

//计时器1的值
//WGM 13 12 11 10是
//快速PWM 1 0

TCCR1A |=(1每当我使用内部振荡器时,无论是快(8x)还是慢(8x),我都会检查CKDIV8位设置。几乎总是这样

如果使用外部振荡器或时钟,奇怪的定时通常是由于未在保险丝设置中切换外部时钟,或由于F_CPU设置与实际频率不同

另外,有点离题,但这样的代码是多余的:

TCCR1B &= ~(1 << 2); // set prescaler to 1x CS12
TCCR1B &= ~(1 << 1); // set prescaler to 1x CS11

TCCR1B&=~(1)您是否记得实际编程设备以8MHz运行?否,我以为atmega328的默认值为8MHz。只需取消设置CKDIV8位是否会使设备以8MHz运行?谢谢您的帮助,假设设备运行的是内部RC振荡器,是的。