2015-11-12 3 views

ответ

0

Аппаратные возможности Atmel ATMega Pulse-wide modulation (PWM) в основном поддерживают изменение рабочего цикла. Частоты можно выбирать только из нескольких фиксированных вариантов.

Существует очень хорошее и подробное объяснение на arduino.stackexchange.com. Посмотрите сообщение: How can I set two PWM at two different frequencies?.

+0

Неверно, вы можете изменять частоту, используя TIMER1 с режимом правильной фазы и частоты. Вы можете выводить частоты от 0,119 до 4 МГц. [Проверить этот ответ] (http://stackoverflow.com/a/41769490/4932683) – cyberponk

0

Вы можете изменить значение штырька 9 PWM на 70 Гц, изменив значения IRC1 и OCRA1.

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); 

СОВЕТ: Вы можете использовать другие значения FREQ для других частот.

Просто помните, что чем выше частота, тем ниже разрешение рабочего цикла.

ПРИМЕЧАНИЕ: Любой код Arduino, который использует TIMER1, не будет работать после этого (или будет работать неустойчиво). Arduino использует TIMER1 для Servo-библиотеки.