Attiny 9上的脉冲宽度调制(PWM)

时间:2017-05-25 13:23:38

标签: avr pwm attiny

我正在使用Attiny 9。 enter image description here

我将LED连接到PB1。 我写了下面的代码并将其上传到Attiny 9。

#define F_CPU 800000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define D0 PB1

int main(void)
{
  power_adc_disable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  TCCR0A |= (1<<WGM00)|(1<<WGM01)|(1<<COM0B1);
  TCCR0B |= (1<<WGM03)|(1<<WGM02)|(1<<CS00);

  DDRB |= 1<<D0;

  PORTB |= 1<<D0;
  _delay_ms(3000);
  PORTB &= ~(1<<D0);

  for (uint8_t i = 255; 247 < i; --i)
  {
    OCR0B = i;
    _delay_ms(70);
  }

  for (uint8_t i= 247; -1 < i; --i)
  {
    OCR0B = i;
    _delay_ms(4);
  }

  while(1){
    sleep_enable();
    sleep_cpu();
  }

  return 0;
}

我希望LED变亮和变暗。但在我上传代码后,LED会持续亮起。我还阅读了Attiny 9的数据表。我按照如何使用PWM。但它不起作用。

怎么了?

1 个答案:

答案 0 :(得分:2)

该代码存在许多问题。

  1. 您正在将处理器置于关机模式,根据数据表,它会禁用时钟并且只能发生异步事件。
  2. 您将其设置为使用快速PWM模式,OCR0A作为顶部,但您没有在任何地方设置OCR0A。如果您的计时器数不够高,您将不会生成任何比较匹配。从您的循环中可以看出,您希望计时器计数到255。
  3. 您只需在while循环之前更改PWM的占空比,因此即使您的PWM设置正确,您也无法看到您想要的LED脉冲。
  4. 这是一个链接,给出了如何设置PWM并更改其占空比的示例: http://allaboutavr.com/index.php/2017/05/13/chapter-5-timers-and-pwm-pulse-width-modulation/

    这样的事情:

    #include <avr/io.h>
    #include <util/delay.h>
    
    #define D0 PB1
    
    int main(void)
    {
        DDRB |= 1<<D0;
    
        TCCR0A |= (1<<WGM00)|(1<<COM0B1);
        TCCR0B |= (1<<WGM02)|(1<<CS00);
    
        while (1) {
            for (uint8_t i = 0; i < 255; i++) {
                OCR0B = i;
                _delay_ms(4);
            }
    
            for (uint8_t i = 255; i >= 0; i--) {
                OCR0B = i;
                _delay_ms(4);
            }
        }
    }