How to adjust Arduino PWM frequenciesby macegr in this forum post http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235060559/12 Pins 5 and 6: controlled by Timer 0Setting Divisor Frequency 0x01 1 62500 0x02 8 7812.5 0x03 64 976.5625 0x04 256 244.140625 0x05 1024 61.03515625 TCCR0B = TCCR0B & 0b11111000 | <setting>;http://playground.arduino.cc/Main/TimerPWMCheatsheet http://arduino-info.wikispaces.com/Arduino-PWM-Frequency ICR1 = 10,000 gives f = 100Hz ICR1 = 5000 gives f = 200Hz ICR1 = 2500 gives f = 500Hz ICR1 = 1000 gives f = 1kHz ICR1 = 500 gives f = 2kHz ICR1 = 333 gives f = 3kHz ICR1 = 250 gives f = 4kHz ICR1 = 100 gives f = 10kHz http://www.oxgadgets.com/2011/04/creating-a-variable-frequency-pwm-output-on-arduino-uno.html Turns out that this script does the trick. unsigned long duty1,duty2;// Duty Cycle in terms of a percentage.unsigned long plus;// Value read from A1, in case plus mode is activatedfloat xxx;// Float numbers to calculate duty for PWM 1 and PWM 2float yyy;unsigned long pwm1;// Value read from A0 and A2 to give PWM duty cycle output in terms // of 0-5V unsigned long pwm2;void setup(){pinMode(9, OUTPUT);pinMode(10, OUTPUT);TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode// TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ; //phase/frequency correct mode. SELECT THIS FOR INVERTED OUTPUTS.TCCR1B = _BV(WGM13) | _BV(CS11);// Select mode 8 and select divide by 8 on main clock.}void loop(){// Program that lets different values on A3 choose different values of frequency, e.g. 100,200,400,500,1k,2k,3k,4k,10k, //etc in relation with a free input. if (analogRead(A3) <100) ICR1 = 10000; // 100Hz - Default value to 100Hz for A3 = 0Vif (analogRead(A3) <200 && analogRead(A3) > 100) ICR1 = 5000; // 200Hzif (analogRead(A3) <300 && analogRead(A3) > 200) ICR1 = 2500; // 400Hzif (analogRead(A3) <400 && analogRead(A3) > 300) ICR1 = 1000; // 1000Hzif (analogRead(A3) <500 && analogRead(A3) > 400) ICR1 = 500; // 2000Hzif (analogRead(A3) <600 && analogRead(A3) > 500) ICR1 = 333; // 3000Hzif (analogRead(A3) <700 && analogRead(A3) > 600) ICR1 = 250; // 4000Hzif (analogRead(A3) <800 && analogRead(A3) > 700) ICR1 = 100; // 10000Hzif (analogRead(A3) > 800) ICR1 = 1000; // Default value to 1kHz for A3 = 5V//ICR1 = 1000; // for ICR1 = 1000, frequency = 1kHz.pwm1 = analogRead(A2); // read duty from A2 for PWM 2pwm2 = analogRead(A0); // read duty from A0 for PWM 1xxx = float(pwm2);// Turn read values from the POTs to float for mathematical // adjustment.yyy = float(pwm1);xxx = xxx * ICR1;// Multiply with ICR1 and divide by 1023 to give required percentageyyy = yyy * ICR1;xxx = xxx / 1023;yyy = yyy / 1023;//Assign values to OCR Registers, which output the PWM duty cycle.OCR1B = int(xxx);OCR1A = int(yyy);} |
DIY Arduino >