更改Arduino Uno rev 3上数字pwm的频率
我试图将Arduino Uno上数字pwm引脚9的频率更改为70hz。我找到了一些改变管脚频率的代码示例,但没有什么是非常清楚的。有人能解释一下吗?感谢Atmel ATMega脉宽调制(PWM)硬件功能主要支持改变占空比。频率只能从几个固定选项中选择更改Arduino Uno rev 3上数字pwm的频率,arduino,pwm,Arduino,Pwm,我试图将Arduino Uno上数字pwm引脚9的频率更改为70hz。我找到了一些改变管脚频率的代码示例,但没有什么是非常清楚的。有人能解释一下吗?感谢Atmel ATMega脉宽调制(PWM)硬件功能主要支持改变占空比。频率只能从几个固定选项中选择 在arduino.stackexchange.com上有一个非常好和详细的解释。查看帖子:.Atmel ATMega脉宽调制(PWM)硬件功能主要支持更改占空比。频率只能从几个固定选项中选择 在arduino.stackexchange.com上有
在arduino.stackexchange.com上有一个非常好和详细的解释。查看帖子:.Atmel ATMega脉宽调制(PWM)硬件功能主要支持更改占空比。频率只能从几个固定选项中选择
在arduino.stackexchange.com上有一个非常好和详细的解释。查看帖子:。您可以通过更改IRC1和OCRA1值将引脚9 PWM更改为70Hz
double freq = 70.0; // Set frequency to 70Hz
// Set Timer1 to phase and frequency correct mode. NON-inverted mode
TCCR1A = _BV(COM1A1) | _BV(COM1B1);
// Set Timer1 prescaler to clk/8 (outputs from 15,259Hz to 500000Hz
TCCR1B = _BV(WGM13) | _BV(CS11);
//ICR Register, which controls the PWM total pulse length
double icr = 8000000.0/8.0/freq; //ICR1 = (clk/2)/tmr_prescaler/freq.
ICR1 = round(icr); // defines total PWM length in clock/8
// Now to change the PWM output value (duty cycle):
double pwm_duty = 50.0 // Set PWM duty cycle to 50% (higher precision)
// OR (delete line above or below)
double pwm_duty = 120 /255.0; // is the same as analogWrite(9, 120)
//OCR Registers, which control the PWM duty cycle.
OCR1A = round(icr * pwm_duty/100.0);
OCR1B = round(icr * (100.0-pwm_duty)/100.0);
提示:您可以对其他频率使用其他频率值
请记住,频率越高,占空比分辨率越低
注:
任何使用TIMER1的Arduino代码在此之后都不会工作(或者工作不稳定)。Arduino将定时器1用于伺服库。您可以通过更改IRC1和OCRA1值将引脚9 PWM更改为70Hz
double freq = 70.0; // Set frequency to 70Hz
// Set Timer1 to phase and frequency correct mode. NON-inverted mode
TCCR1A = _BV(COM1A1) | _BV(COM1B1);
// Set Timer1 prescaler to clk/8 (outputs from 15,259Hz to 500000Hz
TCCR1B = _BV(WGM13) | _BV(CS11);
//ICR Register, which controls the PWM total pulse length
double icr = 8000000.0/8.0/freq; //ICR1 = (clk/2)/tmr_prescaler/freq.
ICR1 = round(icr); // defines total PWM length in clock/8
// Now to change the PWM output value (duty cycle):
double pwm_duty = 50.0 // Set PWM duty cycle to 50% (higher precision)
// OR (delete line above or below)
double pwm_duty = 120 /255.0; // is the same as analogWrite(9, 120)
//OCR Registers, which control the PWM duty cycle.
OCR1A = round(icr * pwm_duty/100.0);
OCR1B = round(icr * (100.0-pwm_duty)/100.0);
提示:您可以对其他频率使用其他频率值
请记住,频率越高,占空比分辨率越低
注:
任何使用TIMER1的Arduino代码在此之后都不会工作(或者工作不稳定)。Arduino将计时器1用于伺服库。不正确,您可以使用带有相位和频率校正模式的计时器1更改频率。您可以输出0119到4MHz的频率。不正确,您可以使用具有相位和频率正确模式的计时器1更改频率。您可以输出0119到4MHz的频率。