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

SPWM Inverter Onda Seno Code Arduino

This code provides a 3 sentence summary of the document: The Arduino code generates a sine wave output for an SPWM inverter by using lookup tables to vary the duty cycle of two PWM signals based on the position in a sine wave cycle, with an interrupt changing the duty cycle every period. Interrupts are used to increment through the lookup tables every time the timer overflows at the switching frequency of 100kHz to generate the desired sine wave output. Registers are initialized for waveform generation mode 15 and timer settings configured to achieve the desired switching frequency without prescaling.

Uploaded by

led
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
616 views

SPWM Inverter Onda Seno Code Arduino

This code provides a 3 sentence summary of the document: The Arduino code generates a sine wave output for an SPWM inverter by using lookup tables to vary the duty cycle of two PWM signals based on the position in a sine wave cycle, with an interrupt changing the duty cycle every period. Interrupts are used to increment through the lookup tables every time the timer overflows at the switching frequency of 100kHz to generate the desired sine wave output. Registers are initialized for waveform generation mode 15 and timer settings configured to achieve the desired switching frequency without prescaling.

Uploaded by

led
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 4

SPWM

INVERTER CODE

This is the code for the Arduino SPWM inverter for sine wave
output. Download the .zip file or copy+paste from below. Read
comments in the code!
#include <avr/io.h>

#include <avr/interrupt.h>

// Look up tables with 200 entries each, normalised to have max value of 1600 which is the
period of the PWM loaded into register ICR1.

int lookUp1[] = {

50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,

542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,

981 ,1020 ,1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,

1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,

1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 ,1597 ,1599 ,1600 ,

1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,

1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,

1264 ,1233 ,1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,

899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,

446 ,398 ,349 ,300 ,250 ,201 ,151 ,100 ,50 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};

int lookUp2[] = {
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,

50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,

542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,

981 ,1020 ,1058 ,1095 ,1131 ,1166 ,1200 ,1233 ,1264 ,1294 ,

1323 ,1351 ,1377 ,1402 ,1426 ,1448 ,1468 ,1488 ,1505 ,1522 ,

1536 ,1550 ,1561 ,1572 ,1580 ,1587 ,1593 ,1597 ,1599 ,1600 ,

1599 ,1597 ,1593 ,1587 ,1580 ,1572 ,1561 ,1550 ,1536 ,1522 ,

1505 ,1488 ,1468 ,1448 ,1426 ,1402 ,1377 ,1351 ,1323 ,1294 ,

1264 ,1233 ,1200 ,1166 ,1131 ,1095 ,1058 ,1020 ,981 ,940 ,

899 ,857 ,814 ,771 ,726 ,681 ,635 ,589 ,542 ,494 ,

446 ,398 ,349 ,300 ,250 ,201 ,151 ,100 ,50 ,0};

void setup(){

// Register initilisation, see datasheet for more detail.

TCCR1A = 0b10100010;

/*10 clear on match, set at BOTTOM for compA.

10 clear on match, set at BOTTOM for compB.

00

10 WGM1 1:0 for waveform 15.


*/

TCCR1B = 0b00011001;

/*000

11 WGM1 3:2 for waveform 15.

001 no prescale on the counter.

*/

TIMSK1 = 0b00000001;

/*0000000

1 TOV1 Flag interrupt enable.

*/

ICR1 = 1600; // Period for 16MHz crystal, for a switching frequency of 100KHz for 200
subdevisions per 50Hz sin wave cycle.

sei(); // Enable global interrupts.

DDRB = 0b00000110; // Set PB1 and PB2 as outputs.

pinMode(13,OUTPUT);

void loop(){; /*Do nothing . . . . forever!*/}

ISR(TIMER1_OVF_vect){

static int num;

// change duty-cycle every period.

OCR1A = lookUp1[num];

OCR1B = lookUp2[num];

if(++num >= 200){ // Pre-increment num then check it's below 200.

num = 0; // Reset num.

You might also like