如何在16位P&F校正PWM中设置定时器1的频率和占空比



我使用的是328p(在内部8MHz上运行(,在约111k Hz或120k Hz的情况下生成平方波,并具有可调节占空比。

我很陌生地做这一水平的硬件操作,所以请原谅我的无知,我花了3天的时间在网上和数据表中查看,但恐怕我对缩写和缩写意味着什么仍然太有限的理解。

到目前为止,我已经在网上和数据表中进行了研究后提出了以下代码。但是我觉得我缺少某些内容,什么寄存器操纵频率?在(DataSheet 20.12.5(阶段和频率正确的PWM模式中,什么寄存器操纵占空比?

void setup(){
    DDRB |= (1 << DDB1); //Set PB1 as output
    OCR1A = (Unsure of what TOP should be here);
    TCCR1A = (1 << WGM10) | (1 << COM1B0) | (1 << COM1A0);
    TCCR1B = (1 << CS10) | (1 << WGM13);
}
void loop(){
    //manipulate duty cycle with other code here
}

我想念什么,或者我应该在这里做什么?我尝试使用在线AVR计时器计算来帮助我获得该频率所需的时钟刻度。它说,共有72个计时器滴答机没有预拉仪,16位计时器将产生111kHz(近似(的方波。跳到73或71的频率超出所需范围。有什么方法可以在AVR上更近?

在与我的一个朋友一起进行了大量研究之后,他也是EE,并且使用嵌入式系统,我们找到了最好的解决方案,可以从328p中获得所需的东西。我将在下面发布有关感兴趣并需要类似内容的任何人的解决方案。

void setup() {
  // put your setup code here, to run once:
  //Set Timer1 for around 109Khz signal
  cli();//stop interrupts
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;//initialize counter value to 0
  //Set register bits 
  TCCR1A = _BV(COM1A1) | _BV(WGM11);
  TCCR1B = _BV(CS10) | _BV(WGM12) | _BV(WGM13);
  ICR1 = 73; // frequency = 8000000/73 = 109.589 kHz
  OCR1A = 0; //0% Duty Cycle or Full Off.
  sei();//allow interrupts
}
void loop() {
  // put your main code here, to run repeatedly:
  OCR1A = 36; //50% Duty Cycle 73/2 = 36.5 Can be changed as needed.
}

此代码设置了计时器1的寄存器,因此它不应干扰Arduino库中的Millis或其他计时功能。我需要操纵一个特定的引脚,而PB1(OC1A((或Arduino Digital Pin 9(是PIN,这将振荡。

您可以根据一些简单的数学将ICR1更改为您需要的任何值,您的时钟频率除以计数器的值等于产生的近似频率。OCR1A设置了信号的占空比。

您的确切频率有限,但是为了我的需要,这可以解决。我仍然能够使用它来驱动我正在使用的传感器。

这是对初始问题的快速答案,并允许我将占空比作为奖金更改。我不记得我们设置的寄存器的确切信息,当我有时间时,我将使用与此有关的数据表更新此答案。

在标题中,您问" Atmega328p如何设置timer1 pwm频率"。您可以通过将最高值设置为所需的内容来调整频率。较小的最高值意味着计数器更快地到达顶部,因此频率更高。您用于计时器的预定器和时钟源确定其计数的速度,因此还会影响频率,频率的范围以及设置频率的分辨率。您的最高价值还决定了设定占空比时的分辨率,因为占空比的整数应小于或等于顶部。

在您的帖子底部附近,您问:"有什么方法可以在AVR上更近吗?"由于您的AVR以8 MHz的速度运行,因此您可以使用其计时器生成的每个频率都将为形式(8 MHz(/N,其中N是一些整数。那是因为计时器无法做任何事情或在您向其提供的时钟源之间更改任何内容。计时器1每微秒的时钟滴答作用8次,每次时钟刻度发生时,它都会提高其计数和/或控制PWM引脚和/或射击中断。我认为您已经使用在线AVR计时器计算器弄清楚了这一点。这是您可以在8 MHz运行的AVR上获得的一些可实现的PWM频率:

  • 8000 kHz/73 = 109.6 kHz
  • 8000 kHz/72 = 111.1 kHz
  • 8000 kHz/71 = 112.7 kHz

如果您需要更精确的频率调整,则需要以一种或另一种方式在系统中获得更快的时钟源。您可以获得更快的微控制器,或者可能会弄清楚如何提供更快的时钟作为微控制器上的计时器的输入。

最新更新