ATMEGA328P Arduino Uno:通过 AVR 编程调整 LED 的亮度

时间:2021-06-02 20:14:13

标签: arduino avr

int led_pin = 9;
int duty_cycle = 63; //in %
int freq_OC = 16000; //in Hz
int freq_clk = 16000000; //in Hz
int prescaler = 1;

void setup() {

  //setting the port B pin (D9) as output for OC1A to override the normal port functionality
  DDRB = DDRB|(1 << led_pin);

  //clearing the counter/timer registers
  TCCR1A = 0;
  TCCR1B = 0;

  //setting the prescaler 1
  TCCR1B = TCCR1B|(1 << CS10);

  //setting the mode 14 fast PWM
  TCCR1B = TCCR1B|((1 << WGM13)|(1 << WGM12));
  TCCR1A = TCCR1A|(1 << WGM11);

  //setting the fast PWM in non-inverting mode
  TCCR1A = TCCR1A|(1 << COM1A1);

  ICR1 = (freq_clk/(freq_OC*prescaler)) - 1;
  OCR1A = ICR1/(100/duty_cycle);
  
}

void loop() {
  
}

为什么当引脚 D9 被初始化为上面写的输出引脚 OC1A 时,此代码不起作用?但它适用于...

DDRB = DDRB|(1 << PB1);

有什么原因吗?就 ATMEGA328P 的数据表而言,它引用了“如果将 COM1X1:0 位中的一个或两个写入 1,OC1X 将覆盖它所连接的 I/O 引脚的正常端口功能”。那么这是否意味着 PB1(或 D9)引脚不再用作 I/O 引脚,因此我无法使用变量名称对其进行初始化?

1 个答案:

答案 0 :(得分:0)

DDRB 是一个 8 位寄存器,其中没有第 9 位。 您将 led_pin 变量设置为 9,因此操作 DDRB = DDRB|(1 << led_pin) 无效。

ATmega328P 上没有 D9 引脚。但看起来你在谈论 Arduino 板。你可以谷歌“Arduino UNO Pinout”。例如。 this

您可以看到板子的 D9 引脚连接到 MCU 的 PB1 引脚。因此,您必须使用 DDRB |= (1 << 1)(使用值 1,而不是 9)