Go Down

### Topic: Help me to setup the PWM frequency to 10khz (Read 2940 times)previous topic - next topic

#### zenilton

##### Aug 18, 2011, 06:18 pm
I am working on a project of a converter for Photovoltaic modules and
I am using an Arduino Uno board to generate a PWM to controll a IGBT.
I need at least 10khz frequency pwm and using analogWrite i get 490 hz.

Can you help me configuring the timers to have a 10khz frequency???

here is the code:

/*
* Two Stage Single Phase Inverter control
*
* JN. Barbosa - MERCEUS - DEE - FCT-UNL
*/

int Vpv0 = 0; // inicials conditions
int Ipv0 = 0;
int P0 = 0;
int Vpv1 = 0;
int Ipv1 = 0;
int P1 = 0;
int D = 0.500; // duty-cycle
int dD = 0.001; // perturbation

void setup()
{
pinMode(3, OUTPUT);  // sets the pin as output
}

void loop()
{
Vpv0 = analogRead(A1); // read the pv voltage
Ipv0 = analogRead(A2); // read the pv current
P0 = Vpv0*Ipv0;                // calculate instant power

delay(1);
P1 = Vpv1*Ipv1;

int dV = Vpv1-Vpv0;
int dP = P1-P0;

if (dP > 0){
if (dV > 0){
D = D+dD;
}else{
D = D-dD;
}
}else {
if (dV > 0){
D = D-dD;
}else{
D = D+dD;
}
}

analogWrite(pwmPin,D*255);
}

Thank you a lot!!!

#### Senso

#1
##### Aug 18, 2011, 06:37 pm
http://hekilledmywire.wordpress.com/2011/08/03/introduction-to-pwm-part-7/

#### zenilton

#2
##### Aug 18, 2011, 07:21 pm
thank you for the reply Senso!!
the text is long but i will read it all.

thanks

#### Anachrocomputer

#3
##### Aug 18, 2011, 07:25 pm
Code: [Select]
` int D = 0.500; // duty-cycle int dD = 0.001; // perturbation`

This isn't going to work. An integer is a whole number, without a fractional or decimal part.  Maybe you meant:

Code: [Select]
` float D = 0.500; // duty-cycle float dD = 0.001; // perturbation`

But, remember that 'float' variables and calculations are much slower than 'int's. Could you scale all your calculations to use integers, say in the range of 0..1023 or 0..255?

#### Bobnova

#4
##### Aug 18, 2011, 10:02 pm
Check this out, too:  http://www.arduino.cc/playground/Code/PwmFrequency
Tops out at 65kHz before you get deeper into the various timer registers.

#### AWOL

#5
##### Aug 18, 2011, 10:43 pm
Code: [Select]
`int D = 0.500; // duty-cycle int dD = 0.001; // perturbation`
Think of your calculations like this:
Code: [Select]
`int D = 0; // duty-cycle int dD = 0; // perturbation`
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

#### zenilton

#6
##### Aug 19, 2011, 12:22 pm
hello guys!!
Anachrocomputer, you are right. I shall use float numbers for dutycycle and perturbation.

AWOL, the perturbation must be greater than zero.

Thank you!!

#### AWOL

#7
##### Aug 19, 2011, 12:45 pm
Quote
AWOL, the perturbation must be greater than zero.

So don't assign a sub-unity value to an integer - it will be truncated to zero.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Go Up

Please enter a valid email to subscribe