gpt4 book ai didi

arduino-uno - 使用 Timer1 设置 Arduino Uno (ATMEGA328P) PWM

转载 作者:行者123 更新时间:2023-12-02 20:30:35 40 4
gpt4 key购买 nike

我想使用 16MHz Arduino Uno (ATMEGA328P) 设置自定义频率 (12Hz) 和占空比 (20%)。

AVR 计算器产量:

ICR1 = 20833
OCR1A = 4167

我已经阅读了大量的论坛和评论,但由于某种原因我无法让它发挥作用。

下面是我的代码:

void setup()
{
// PB1 is now an output (Pin9 Arduino UNO)
DDRB |= (1 << DDB1);
// PB2 is now an output (Pin10 Arduino UNO)
DDRB |= (1 << DDB2);

// Set PWM frequency/top value
ICR1 = 20833;

// Set PWM duty cycle
OCR1A = 4167;

// Set inverting mode (start low, go high)
TCCR1A |= (1 << COM1A1);
TCCR1A |= (1 << COM1B1);
TCCR1A |= (1 << COM1A0);
TCCR1A |= (1 << COM1B0);

// Set fast PWM Mode
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << WGM13);

// Set prescaler to 64 and starts PWM
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS11);
}

void loop() {
// Refresh PWM frequency
OCR1A = 4167;
}

如果有人可以提供帮助,那就太好了!

谢谢

迪伦

最佳答案

好的,所以我似乎找到了问题所在。我没有正确设置模式 14 下快速 PWM 的寄存器(ATMEGA328P 有 15 个定时器 1 模式)。经过大量实验和进一步阅读,以下是可变频率和占空比的正确设置。 ICR1 表示 TOP 值(控制频率),OCR1A 表示开关值(占空比)。

// ADJUSTABLE VARIABLES
// Strobe frequency
uint16_t timer1Prescaler = 64;
uint8_t strobeFreq = 20,
strobeDutyCycle = 20;

void setup
{
// Set PB1 to be an output (Pin9 Arduino UNO)
DDRB |= (1 << PB1);

// Clear Timer/Counter Control Registers
TCCR1A = 0;
TCCR1B = 0;

// Set non-inverting mode
TCCR1A |= (1 << COM1A1);

// Set fast PWM Mode 14
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << WGM13);

// Set prescaler to 64 and starts PWM
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS11);

// Set PWM frequency/top value
ICR1 = (F_CPU / (timer1Prescaler*strobeFreq)) - 1;
OCR1A = ICR1 / (100 / strobeDutyCycle);
}

void loop()
{
// main loop code
}

注意:使用 Arduino IDE 时,清除定时器/计数器控制寄存器非常重要,因为它在执行 setup() 函数之前会在幕后进行一些设置。

关于arduino-uno - 使用 Timer1 设置 Arduino Uno (ATMEGA328P) PWM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48873501/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com