Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改Arduino Uno rev 3上数字pwm的频率_Arduino_Pwm - Fatal编程技术网

更改Arduino Uno rev 3上数字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 Uno上数字pwm引脚9的频率更改为70hz。我找到了一些改变管脚频率的代码示例,但没有什么是非常清楚的。有人能解释一下吗?感谢

Atmel ATMega脉宽调制(PWM)硬件功能主要支持改变占空比。频率只能从几个固定选项中选择


在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的频率。