Help me to setup the PWM frequency to 10khz

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??? :grin:

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);
Vpv1 = analogRead(A1);
Ipv1 = analogRead(A2);
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!!!

Read this:

thank you for the reply Senso!!
the text is long but i will read it all.

thanks :grin:

 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:

 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?

Check this out, too: Arduino Playground - PwmFrequency
Tops out at 65kHz before you get deeper into the various timer registers.

int D = 0.500; // duty-cycle
 int dD = 0.001; // perturbation

Think of your calculations like this:

int D = 0; // duty-cycle
 int dD = 0; // perturbation

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!! :grin:

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.

Hi, I'm kind of lost at the moment. Could you please post the code to generate the 10 kHz that worked for you?

int P0 = Vpv0*Ipv0;

10-bit value * 10-bit value won't fit into an int.