100% found this document useful (1 vote)
220 views

Arduino 6 PWM

1. This document describes generating PWM signals for a three-phase inverter circuit. It uses sine wave tables to calculate PWM signal values for each of the three phases at 50Hz. 2. The program uses timers and PWM outputs on an Arduino to generate the six PWM signals needed to control the positive and negative sides of each phase. 3. It reads the input voltage, scales it, and uses sine wave tables to calculate the PWM duty cycles for each phase over one half period at 78 time steps. It then outputs these using timers and inverts the signals at the appropriate times to generate the three-phase waveform.

Uploaded by

M Imam Jazuli
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
220 views

Arduino 6 PWM

1. This document describes generating PWM signals for a three-phase inverter circuit. It uses sine wave tables to calculate PWM signal values for each of the three phases at 50Hz. 2. The program uses timers and PWM outputs on an Arduino to generate the six PWM signals needed to control the positive and negative sides of each phase. 3. It reads the input voltage, scales it, and uses sine wave tables to calculate the PWM duty cycles for each phase over one half period at 78 time steps. It then outputs these using timers and inverts the signals at the appropriate times to generate the three-phase waveform.

Uploaded by

M Imam Jazuli
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

//

//
//
//
ut
//
//
//
//
//
//

22.11.2009 - EPP, Group1, Michala Srnova


Generating of PWM signals for three phase inverter circuit
generating of sine signals with freq of 50Hz
the amplitude of these signals will be calculated to desired value (using inp
signal)
input signal: voltage on analog input
output values: PWM signals on all 6 PWM outputs:
1. signal to 1.phase (+ switch)
2. signal to 1.phase (- switch) opposite to signal for 1.phase
3.,4. signals to 2.phase
5.,6. signals to 3.phase

#include "WProgram.h"
void setup();
void loop();
int i; //for cycle
int analogPin = 0; //No. of input pin
int Input=1023; //this value is from ADC: it can be in range:0 - 1023 (0-5V)
float K;
// Constant : is equal Input/1023
float ph0;
// For calculating value of phase 1
float ph1;
// phase 2
float ph2;
// phase 3
//setting of sin table for half-period, 78 samples
//this realization is uneffective due to used memory - because it is possible t
o keep only values of first 60 degrees and
//+only for first phase. Others can be calculated.
//But this microchip hase a lot of memory and his only one role is to generate
PWM. We need to have values up time, and calculations
//which would be necessary (for calculating samples for phase 2 and 3, and for
angles of whole sine wave) are time-consuming
int sinus0[]={0,10,20,31,41,51,61,71,81,91,101,110,119,128,137,146,154,163,
170,178,185,192,199,205,211,217,222,227,231,236,239,243,246,248,25
0,252,
253,254,254,254,254,253,252,250,248,246,243,239,236,231,227,222,21
7,211,
205,199,192,185,178,170,163,154,146,137,128,119,110,101,91,81,71,6
1,
51,41,31,20,10,0};
int sinus1[]={220,225,230,234,238,242,245,247,250,251,253,254,254,254,254,254,25
2,251,
249,246,244,240,237,233,228,224,219,213,207,201,194,188,180,173,16
5,157,
149,140,131,122,113,104,94,85,75,65,55,44,34,24,13,3,6,17,
27,38,48,58,68,78,88,98,107,116,126,134,143,152,160,168,175,183,
190,197,203,209,215,220};
int sinus2[]={220,215,209,203,197,190,183,175,168,160,151,143,134,125,116,107,9
7,88,
78,68,58,48,37,27,17,6,3,14,24,34,45,55,65,75,85,94,
104,113,123,132,140,149,157,165,173,181,188,195,201,207,213,219,2
24,229,
233,237,241,244,247,249,251,252,254,254,255,254,254,253,251,250,2
47,245,
242,238,234,230,225,220};
void setup()
{
//for default settings

//=====setting of timer for fast PWM method====


//frequency PWM is fosc/(8*256) (by 16MHz oscil. = 7812,5)
//timer 0, 8-bit timer, pins 5,6(+) 128us
TCCR0A=0b10110011; // generate inverted PWM signals in output
TCCR0B=0b00000010; // set of source of clock signal + prescaller
//timer 2, 8-bit timer, pins 9,10(+) = same settings as timer0 - 128us
TCCR2A=0b10110011; // generate inverted PWM signals in output
TCCR2B=0b00000010;
//timer 1, 16-bit timer, pins 3, 11(+)
TCCR1A=0b11100001; // set for generate negative values first
TCCR1B=0b00001010;
//setting of PWM ports to output
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(3,OUTPUT);
}
void loop()
{
//whole our code processed in infinity cycle
delay(64);
//change of polarity of phase 1
TCCR0A = TCCR0A ^ 0b01010000;
//cycle for half period
for(i=0; i<78;i++)
{
//reading the value of input voltage
Input=analogRead(analogPin); //Input=1023;
K = Input / 1023.00;
//now Input value is in range: 0-1
//generating of value OCR0x,OCR1x,OCR2x , where for same counter are values
the same
ph0=sinus0[i]*K; //this value should be float
//setting of OCR0x
OCR0A=byte(ph0);
OCR0B=byte(ph0);
//for 2. phase:
if(i==52){
//passed 52 samples, it means, that values of phase two will be negative =>
the setting of generating signals must be changed
//TCCR2A=0b1011 0011; => 0b1110 0011 => for XOR =mask: 0101 0000
TCCR1A = TCCR1A ^ 0b01010000;
}
ph1=sinus1[i]*K;
OCR1A=byte(ph1);
OCR1B=byte(ph1);
//for 3.phase
if(i==26){
//26 samples - change positive to negative and vice versa
TCCR2A = TCCR2A ^ 0b01010000;

}
ph2=sinus2[i]*K;
OCR2A=byte(ph2);
OCR2B=byte(ph2);
//wait for end of now processing cycle - than generate new samples for next
cycle
// flag TOV1=1 when PWM period ends
while(TOV1 != 1){
//check it every 16 micro seconds - with changes in timer, it is 64 times
bigger value
delayMicroseconds(1024);
delay(64);
}
}
}
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}

You might also like