Invert PWM pulses

Hi everyone, I am using Arduino Uno for this project. I modified an existing code that generates 3 pwm pulses, 120deg out of phase from each other, to create three additional pulses inverted from the three pulses originally created. In this case, Pin 11 and pin 6 should be inverted. Pin 10 and pin 5 should be inverted, and pin 9 and 3 should be inverted. The original program worked (with pins 11, 10, and 9 defined) but the new one doesn't because once I upload the new program my previous three pulses don't show anymore. So I don't have any pulses. My code is shown below. Any help would be greatly appreciated.

Thank you

// Source:http://digitalcommons.calpoly.edu/cgi/viewcontent.cgi?article=1129&context=eesp

include "avr/pgmspace.h"

include "avr/io.h"

// table of 256 sine values / one sine period / stored in flash memory PROGMEM prog_uchar sine256[] = { 127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};

define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

define PWM_OUT_1 11 // PWM output on pin 11

define PWM_OUT_2 10 // PWM output on pin 10

define PWM_OUT_3 9 // PWM output on pin 9

define PWM_OUT_4 6 // PWM output on pin 6

define PWM_OUT_5 5 // PWM output on pin 5

define PWM_OUT_6 3 // PWM output on pin 3

define LED_PIN 13 // LED status on pin 13

define TEST_PIN 7 // Scope trigger on pin 7

define POTEN_IN 0 // Potentiometer on pin 0

define OFFSET_1 85 // Offset for second-phase

define OFFSET_2 170 // Offset for third-phase

int val_1=0; //initialize variable to read pin 11 status int val_2=0; //initialize variable to read pin 10 status int val_3=0; //initialize variable to read pin 9 status double dfreq; const double refclk = 31376.6; // measured const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant // variables used inside interrupt service declared as volatile volatile uint8_t icnt; // var inside interrupt volatile uint8_t icnt1; // var inside interrupt volatile uint8_t c4ms; // counter incremented every 4ms volatile uint32_t phase_accum; // phase accumulator volatile uint32_t tword_m; // dds tuning word m //*************************************************

void setup() { pinMode(LED_PIN, OUTPUT); // sets the digital pin as output Serial.begin(115200); // connect to the serial port Serial.println("DDS Test"); pinMode(TEST_PIN, OUTPUT); // sets the digital pin as output pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output pinMode(PWM_OUT_4, OUTPUT); // PWM output /frequency output pinMode(PWM_OUT_5, OUTPUT); // PWM output /frequency output pinMode(PWM_OUT_6, OUTPUT); // PWM output /frequency output // Setup the timers setup_timer1(); setup_timer2(); // disable interrupts to avoid timing distortion cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt dfreq = 1000.0; // initial output frequency = 1000.0 Hz tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word } //*************************************************

void loop() { if (c4ms > 250) // timer / wait for a full second { c4ms = 0; dfreq = analogRead(POTEN_IN); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz cbi (TIMSK2, TOIE2); // disble Timer2 Interrupt tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt Serial.print(dfreq); Serial.print(" "); Serial.println(tword_m); } val_1 = digitalRead(PWM_OUT_1); // read input value if (val_1 == HIGH) { // check if the input is HIGH digitalWrite(PWM_OUT_4, LOW); // Make PIN LOW } else { digitalWrite(PWM_OUT_4, HIGH); // Make Pin High } val_2 = digitalRead(PWM_OUT_2); // read input value if (val_2 == HIGH) { // check if the input is HIGH digitalWrite(PWM_OUT_5, LOW); // Make PIN LOW } else { digitalWrite(PWM_OUT_5, HIGH); // Make Pin High } val_3 = digitalRead(PWM_OUT_3); // read input value if (val_3 == HIGH) { // check if the input is HIGH digitalWrite(PWM_OUT_6, LOW); // Make PIN LOW } else { digitalWrite(PWM_OUT_6, HIGH); // Make Pin High }

}

//*************************************************

// timer1 setup // set prescaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock void setup_timer1(void) { // Timer1 Clock Prescaler to : 1 sbi (TCCR1B, CS10); cbi (TCCR1B, CS11); cbi (TCCR1B, CS12); // Timer0 PWM Mode set to Phase Correct PWM cbi (TCCR1A, COM1A0); // clear Compare Match sbi (TCCR1A, COM1A1); cbi (TCCR1A, COM1B0); // clear Compare Match sbi (TCCR1A, COM1B1); sbi (TCCR1A, WGM10); // Mode 1 / Phase Correct PWM cbi (TCCR1A, WGM11); cbi (TCCR1B, WGM12); cbi (TCCR1B, WGM13); }

//*************************************************

// timer2 setup // set prscaler to 1, PWM mode to phase correct PWM , 16000000/512 = 31.25kHz clock void setup_timer2(void) { // Timer2 Clock Prescaler to : 1 sbi (TCCR2B, CS20); cbi (TCCR2B, CS21); cbi (TCCR2B, CS22); // Timer2 PWM Mode set to Phase Correct PWM cbi (TCCR2A, COM2A0); // clear Compare Match sbi (TCCR2A, COM2A1); sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM cbi (TCCR2A, WGM21); cbi (TCCR2B, WGM22); } //*************************************************

// Timer2 Interrupt Service at 31.25kHz = 32us // this is the timebase REFCLOCK for the DDS generator // FOUT = (M (REFCLK)) / (2 exp 32) // runtime : 8 microseconds ( inclusive push and pop) ISR(TIMER2_OVF_vect) { sbi(PORTD, TEST_PIN); // Test / set PORTD,TEST_PIN high to observe timing with a oscope phase_accum += tword_m; // soft DDS, phase accu with 32 bits icnt = phase_accum >> 24; // use upper 8 bits for phase accu as frequency information OCR2A = pgm_read_byte_near(sine256 + icnt); // read value fron ROM sine table and send to PWM DAC OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_1)); OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_2)); if (icnt1++ == 125) // increment variable c4ms every 4 milliseconds { c4ms++; icnt1 = 0; } cbi(PORTD, TEST_PIN); // reset PORTD,TEST_PIN }

Please edit your post, select the code, and put it between [code][/code] tags.

You can do that by hitting the # button above the posting area.

How to use this forum

Hi, can you post your code that did have the outputs working.

Tom.... :)

Hi, This is the code with the outputs working

//http://digitalcommons.calpoly.edu/cgi/viewcontent.cgi?article=1129&context=eesp
#include "avr/pgmspace.h"
#include "avr/io.h"
// table of 256 sine values / one sine period / stored in flash memory
PROGMEM prog_uchar sine256[] =
{
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define PWM_OUT_1 11 // PWM output on pin 11
#define PWM_OUT_2 10 // PWM output on pin 10
#define PWM_OUT_3 9 // PWM output on pin 9
#define LED_PIN 13 // LED status on pin 13
#define TEST_PIN 7 // Scope trigger on pin 7
#define POTEN_IN 0 // Potentiometer on pin 0
#define OFFSET_1 85 // Offset for second-phase
#define OFFSET_2 170 // Offset for third-phase
double dfreq;
const double refclk = 31376.6; // measured
const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant
// variables used inside interrupt service declared as volatile
volatile uint8_t icnt; // var inside interrupt
volatile uint8_t icnt1; // var inside interrupt
volatile uint8_t c4ms; // counter incremented every 4ms
volatile uint32_t phase_accum; // phase accumulator
volatile uint32_t tword_m; // dds tuning word m
//*************************************************

void setup()
{
pinMode(LED_PIN, OUTPUT); // sets the digital pin as output
Serial.begin(115200); // connect to the serial port
Serial.println("DDS Test");
pinMode(TEST_PIN, OUTPUT); // sets the digital pin as output
pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output
// Setup the timers
setup_timer1();
setup_timer2();
// disable interrupts to avoid timing distortion
cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
dfreq = 1000.0; // initial output frequency = 1000.0 Hz
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
}
//*************************************************

void loop()
{
if (c4ms > 250) // timer / wait for a full second
{
c4ms = 0;
dfreq = analogRead(POTEN_IN); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
cbi (TIMSK2, TOIE2); // disble Timer2 Interrupt
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
Serial.print(dfreq);
Serial.print(" ");
Serial.println(tword_m);
}
}


//*************************************************

// timer1 setup
// set prescaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock
void setup_timer1(void)
{
// Timer1 Clock Prescaler to : 1
sbi (TCCR1B, CS10);
cbi (TCCR1B, CS11);
cbi (TCCR1B, CS12);
// Timer0 PWM Mode set to Phase Correct PWM
cbi (TCCR1A, COM1A0); // clear Compare Match
sbi (TCCR1A, COM1A1);
cbi (TCCR1A, COM1B0); // clear Compare Match
sbi (TCCR1A, COM1B1);
sbi (TCCR1A, WGM10); // Mode 1 / Phase Correct PWM
cbi (TCCR1A, WGM11);
cbi (TCCR1B, WGM12);
cbi (TCCR1B, WGM13);
}

//*************************************************

// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM , 16000000/512 = 31.25kHz clock
void setup_timer2(void)
{
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);
// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}
//*************************************************

// Timer2 Interrupt Service at 31.25kHz = 32us
// this is the timebase REFCLOCK for the DDS generator
// FOUT = (M (REFCLK)) / (2 exp 32)
// runtime : 8 microseconds ( inclusive push and pop)
ISR(TIMER2_OVF_vect)
{
sbi(PORTD, TEST_PIN); // Test / set PORTD,TEST_PIN high to observe timing with a oscope
phase_accum += tword_m; // soft DDS, phase accu with 32 bits
icnt = phase_accum >> 24; // use upper 8 bits for phase accu as frequency information
OCR2A = pgm_read_byte_near(sine256 + icnt); // read value fron ROM sine table and send to PWM DAC
OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_1));
OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_2));
if (icnt1++ == 125) // increment variable c4ms every 4 milliseconds
{
c4ms++;
icnt1 = 0;
}
cbi(PORTD, TEST_PIN); // reset PORTD,TEST_PIN
}

… and this is the code with my updates, with no working outputs.

//http://digitalcommons.calpoly.edu/cgi/viewcontent.cgi?article=1129&context=eesp
#include "avr/pgmspace.h"
#include "avr/io.h"
// table of 256 sine values / one sine period / stored in flash memory
PROGMEM prog_uchar sine256[] =
{
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define PWM_OUT_1 11 // PWM output on pin 11
#define PWM_OUT_2 10 // PWM output on pin 10
#define PWM_OUT_3 9 // PWM output on pin 9
#define LED_PIN 13 // LED status on pin 13
#define TEST_PIN 7 // Scope trigger on pin 7
#define POTEN_IN 0 // Potentiometer on pin 0
#define OFFSET_1 85 // Offset for second-phase
#define OFFSET_2 170 // Offset for third-phase
int PWM_OUT_4 =6; // PWM output on pin 6
int PWM_OUT_5 =5; // PWM output on pin 5
int PWM_OUT_6 =3; // PWM output on pin 3
int val_1=0;  //initialize variable to read pin 11 status
int val_2=0;  //initialize variable to read pin 10 status
int val_3=0; //initialize variable to read pin 9 status

double dfreq;
const double refclk = 31376.6; // measured
const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant
// variables used inside interrupt service declared as volatile
volatile uint8_t icnt; // var inside interrupt
volatile uint8_t icnt1; // var inside interrupt
volatile uint8_t c4ms; // counter incremented every 4ms
volatile uint32_t phase_accum; // phase accumulator
volatile uint32_t tword_m; // dds tuning word m
//*************************************************

void setup()
{
pinMode(LED_PIN, OUTPUT); // sets the digital pin as output
Serial.begin(115200); // connect to the serial port
Serial.println("DDS Test");
pinMode(TEST_PIN, OUTPUT); // sets the digital pin as output
pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_4, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_5, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_6, OUTPUT); // PWM output /frequency output


// Setup the timers
setup_timer1();
setup_timer2();
// disable interrupts to avoid timing distortion
cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
dfreq = 100.0; // initial output frequency = 100.0 Hz
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
}
//*************************************************

void loop()
{
if (c4ms > 250) // timer / wait for a full second
{
c4ms = 0;
dfreq = analogRead(POTEN_IN); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
cbi (TIMSK2, TOIE2); // disble Timer2 Interrupt
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
Serial.print(dfreq);
Serial.print(" ");
Serial.println(tword_m);
}
val_1 = digitalRead(PWM_OUT_1);  // read input value
  if (val_1 == HIGH) 
  {         // check if the input is HIGH 
    digitalWrite(PWM_OUT_4, LOW);  // Make PIN LOW
    delay(1000);
  } else {
    digitalWrite(PWM_OUT_4, HIGH);  // Make Pin High
    delay(1000);
  }
val_2 = digitalRead(PWM_OUT_2);  // read input value
  if (val_2 == HIGH) 
  {         // check if the input is HIGH 
    digitalWrite(PWM_OUT_5, LOW);  // Make PIN LOW
    delay(1000);    
  } else {
    digitalWrite(PWM_OUT_5, HIGH);  // Make Pin High
    delay(1000);
  }
val_3 = digitalRead(PWM_OUT_3);  // read input value
  if (val_3 == HIGH) 
  {         // check if the input is HIGH 
    digitalWrite(PWM_OUT_6, LOW);  // Make PIN LOW
    delay(1000);
  } else {
    digitalWrite(PWM_OUT_6, HIGH);  // Make Pin High
    delay(1000);
  }

}


//*************************************************

// timer1 setup
// set prescaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock
void setup_timer1(void)
{
// Timer1 Clock Prescaler to : 1
sbi (TCCR1B, CS10);
cbi (TCCR1B, CS11);
cbi (TCCR1B, CS12);
// Timer0 PWM Mode set to Phase Correct PWM
cbi (TCCR1A, COM1A0); // clear Compare Match
sbi (TCCR1A, COM1A1);
cbi (TCCR1A, COM1B0); // clear Compare Match
sbi (TCCR1A, COM1B1);
sbi (TCCR1A, WGM10); // Mode 1 / Phase Correct PWM
cbi (TCCR1A, WGM11);
cbi (TCCR1B, WGM12);
cbi (TCCR1B, WGM13);
}

//*************************************************

// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM , 16000000/512 = 31.25kHz clock
void setup_timer2(void)
{
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);
// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}
//*************************************************

// Timer2 Interrupt Service at 31.25kHz = 32us
// this is the timebase REFCLOCK for the DDS generator
// FOUT = (M (REFCLK)) / (2 exp 32)
// runtime : 8 microseconds ( inclusive push and pop)
ISR(TIMER2_OVF_vect)
{
sbi(PORTD, TEST_PIN); // Test / set PORTD,TEST_PIN high to observe timing with a oscope
phase_accum += tword_m; // soft DDS, phase accu with 32 bits
icnt = phase_accum >> 24; // use upper 8 bits for phase accu as frequency information
OCR2A = pgm_read_byte_near(sine256 + icnt); // read value fron ROM sine table and send to PWM DAC
OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_1));
OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_2));
if (icnt1++ == 125) // increment variable c4ms every 4 milliseconds
{
c4ms++;
icnt1 = 0;
}
cbi(PORTD, TEST_PIN); // reset PORTD,TEST_PIN
}

The differences are:

*** a.cpp   2014-10-06 08:09:46.220970695 +1100
--- b.cpp   2014-10-06 08:10:05.892970653 +1100
***************
*** 15,20 ****
--- 15,27 ----
  #define POTEN_IN 0 // Potentiometer on pin 0
  #define OFFSET_1 85 // Offset for second-phase
  #define OFFSET_2 170 // Offset for third-phase
+ int PWM_OUT_4 =6; // PWM output on pin 6
+ int PWM_OUT_5 =5; // PWM output on pin 5
+ int PWM_OUT_6 =3; // PWM output on pin 3
+ int val_1=0;  //initialize variable to read pin 11 status
+ int val_2=0;  //initialize variable to read pin 10 status
+ int val_3=0; //initialize variable to read pin 9 status
+ 
  double dfreq;
  const double refclk = 31376.6; // measured
  const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant
***************
*** 35,47 ****
  pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output
  pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output
  pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output
  // Setup the timers
  setup_timer1();
  setup_timer2();
  // disable interrupts to avoid timing distortion
  cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
  sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
! dfreq = 1000.0; // initial output frequency = 1000.0 Hz
  tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
  }
  //*************************************************
--- 42,59 ----
  pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output
  pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output
  pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output
+ pinMode(PWM_OUT_4, OUTPUT); // PWM output /frequency output
+ pinMode(PWM_OUT_5, OUTPUT); // PWM output /frequency output
+ pinMode(PWM_OUT_6, OUTPUT); // PWM output /frequency output
+ 
+ 
  // Setup the timers
  setup_timer1();
  setup_timer2();
  // disable interrupts to avoid timing distortion
  cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
  sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
! dfreq = 100.0; // initial output frequency = 100.0 Hz
  tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
  }
  //*************************************************
***************
*** 59,64 ****
--- 71,104 ----
  Serial.print(" ");
  Serial.println(tword_m);
  }
+ val_1 = digitalRead(PWM_OUT_1);  // read input value
+   if (val_1 == HIGH) 
+   {         // check if the input is HIGH 
+     digitalWrite(PWM_OUT_4, LOW);  // Make PIN LOW
+     delay(1000);
+   } else {
+     digitalWrite(PWM_OUT_4, HIGH);  // Make Pin High
+     delay(1000);
+   }
+ val_2 = digitalRead(PWM_OUT_2);  // read input value
+   if (val_2 == HIGH) 
+   {         // check if the input is HIGH 
+     digitalWrite(PWM_OUT_5, LOW);  // Make PIN LOW
+     delay(1000);    
+   } else {
+     digitalWrite(PWM_OUT_5, HIGH);  // Make Pin High
+     delay(1000);
+   }
+ val_3 = digitalRead(PWM_OUT_3);  // read input value
+   if (val_3 == HIGH) 
+   {         // check if the input is HIGH 
+     digitalWrite(PWM_OUT_6, LOW);  // Make PIN LOW
+     delay(1000);
+   } else {
+     digitalWrite(PWM_OUT_6, HIGH);  // Make Pin High
+     delay(1000);
+   }
+ 
  }

What are the delays for?

Ok?

I added the delays at the last minute to see if they would make a difference. With and without the delays, the outputs don't work.

thanks,

Can anyone help, please?

You already have it working with 3 pins. You could create a new sketch with a different name and edit it to use the next 3 pins. Once you get that working you'll know that all 6 pins work OK. Now you could create a third sketch that uses all 6 pins, where the last 3 are the inverted signals of the first 3.

How to invert? The sine array has 256 entries (0-255) representing 0-360 degrees. For the first pin, there is no offset. This is index 0 of the sine array. This represents the first phase at 0 deg. For the second pin, you have offset of 85. This is index 85 of the sine array. This represents the second phase at 120 deg. For the third pin, you have offset of 170. This is index 170 of the sine array. This represents the third phase at 240 deg. For the fourth pin, you have offset of XXX. This is index XXX of the sine array. This represents the fourth phase at 180 deg. For the fifth pin, you have offset of YYY. This is index YYY of the sine array. This represents the fifth phase at 300 deg. For the sixth pin, you have offset of ZZ. This is index ZZ of the sine array. This represents the sixth phase at 60 deg.

I'll let you figure out the XXX, YYY and ZZ values and how to update the 3rd sketch to use all six pins. You should end up with 6 phases, 60 degrees phase to phase.

Good luck...

Hi Dlloyd, Thank you for the hints. I am following the route you suggested, which is to get the other three pulses to work independently. Now I am struggling with getting those to work. All I did was add new lines and comment the first three that worked previously (so that I can uncomment them in the third step.) Do you understand why the new three pulses don't work? Thank you again for your help,

//http://digitalcommons.calpoly.edu/cgi/viewcontent.cgi?article=1129&context=eesp
#include "avr/pgmspace.h"
#include "avr/io.h"
// table of 256 sine values / one sine period / stored in flash memory
PROGMEM prog_uchar sine256[] =
{
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
//#define PWM_OUT_1 11 // PWM output on pin 11
//#define PWM_OUT_2 10 // PWM output on pin 10
//#define PWM_OUT_3 9 // PWM output on pin 9
#define PWM_OUT_4 6 // PWM output on pin 6
#define PWM_OUT_5 5 // PWM output on pin 5
#define PWM_OUT_6 3 // PWM output on pin 3
#define LED_PIN 13 // LED status on pin 13
#define TEST_PIN 7 // Scope trigger on pin 7
#define POTEN_IN 0 // Potentiometer on pin 0
//#define OFFSET_1 85 // Offset for second-phase
//#define OFFSET_2 170 // Offset for third-phase
#define OFFSET_3 128 // Offset for fourth-phase
#define OFFSET_4 213 // Offset for fifth-phase
#define OFFSET_5 43 // Offset for sixth-phase

double dfreq;
const double refclk = 31376.6; // measured
const uint64_t twoTo32 = pow(2, 32); // compute value at startup and use as constant
// variables used inside interrupt service declared as volatile
volatile uint8_t icnt; // var inside interrupt
volatile uint8_t icnt1; // var inside interrupt
volatile uint8_t c4ms; // counter incremented every 4ms
volatile uint32_t phase_accum; // phase accumulator
volatile uint32_t tword_m; // dds tuning word m
//*************************************************

void setup()
{
pinMode(LED_PIN, OUTPUT); // sets the digital pin as output
Serial.begin(115200); // connect to the serial port
Serial.println("DDS Test");
pinMode(TEST_PIN, OUTPUT); // sets the digital pin as output
//pinMode(PWM_OUT_1, OUTPUT); // PWM output /frequency output
//pinMode(PWM_OUT_2, OUTPUT); // PWM output /frequency output
//pinMode(PWM_OUT_3, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_4, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_5, OUTPUT); // PWM output /frequency output
pinMode(PWM_OUT_6, OUTPUT); // PWM output /frequency output


// Setup the timers
setup_timer1();
setup_timer2();
// disable interrupts to avoid timing distortion
cbi (TIMSK0, TOIE0); // disable Timer0 !!! delay() is now not available
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
dfreq = 100.0; // initial output frequency = 100.0 Hz
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
}
//*************************************************

void loop()
{
if (c4ms > 250) // timer / wait for a full second
{
c4ms = 0;
dfreq = analogRead(POTEN_IN); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
cbi (TIMSK2, TOIE2); // disble Timer2 Interrupt
tword_m = twoTo32 * dfreq / refclk; // calulate DDS new tuning word
sbi (TIMSK2, TOIE2); // enable Timer2 Interrupt
Serial.print(dfreq);
Serial.print(" ");
Serial.println(tword_m);
}

}


//*************************************************

// timer1 setup
// set prescaler to 1, PWM mode to phase correct PWM, 16000000/512 = 31.25kHz clock
void setup_timer1(void)
{
// Timer1 Clock Prescaler to : 1
sbi (TCCR1B, CS10);
cbi (TCCR1B, CS11);
cbi (TCCR1B, CS12);
// Timer0 PWM Mode set to Phase Correct PWM
cbi (TCCR1A, COM1A0); // clear Compare Match
sbi (TCCR1A, COM1A1);
cbi (TCCR1A, COM1B0); // clear Compare Match
sbi (TCCR1A, COM1B1);
sbi (TCCR1A, WGM10); // Mode 1 / Phase Correct PWM
cbi (TCCR1A, WGM11);
cbi (TCCR1B, WGM12);
cbi (TCCR1B, WGM13);
}

//*************************************************

// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM , 16000000/512 = 31.25kHz clock
void setup_timer2(void)
{
// Timer2 Clock Prescaler to : 1
sbi (TCCR2B, CS20);
cbi (TCCR2B, CS21);
cbi (TCCR2B, CS22);
// Timer2 PWM Mode set to Phase Correct PWM
cbi (TCCR2A, COM2A0); // clear Compare Match
sbi (TCCR2A, COM2A1);
sbi (TCCR2A, WGM20); // Mode 1 / Phase Correct PWM
cbi (TCCR2A, WGM21);
cbi (TCCR2B, WGM22);
}
//*************************************************

// Timer2 Interrupt Service at 31.25kHz = 32us
// this is the timebase REFCLOCK for the DDS generator
// FOUT = (M (REFCLK)) / (2 exp 32)
// runtime : 8 microseconds ( inclusive push and pop)
ISR(TIMER2_OVF_vect)
{
sbi(PORTD, TEST_PIN); // Test / set PORTD,TEST_PIN high to observe timing with a oscope
phase_accum += tword_m; // soft DDS, phase accu with 32 bits
icnt = phase_accum >> 24; // use upper 8 bits for phase accu as frequency information
//OCR2A = pgm_read_byte_near(sine256 + icnt); // read value fron ROM sine table and send to PWM DAC
//OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_1));
//OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_2));
OCR2A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_3)); // read value fron ROM sine table and send to PWM DAC
OCR1A = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_4));
OCR1B = pgm_read_byte_near(sine256 + (uint8_t)(icnt + OFFSET_5));

if (icnt1++ == 125) // increment variable c4ms every 4 milliseconds
{
c4ms++;
icnt1 = 0;
}
cbi(PORTD, TEST_PIN); // reset PORTD,TEST_PIN
}

Looks like you've jumped ahead a bit too far. Its best to make only a few changes at a time and progress in small increments.

What I meant as the next step would be to make a copy of your working sketch, then verify if it works just by only changing the pin assignments to 6, 5 and 3 instead of 11, 5 and 9.

This would move the same signals to the new pins and if it still works, this would verify that all pins are functional.

You could then experiment by picking one signal and see if you can change its offset / index / phase shift.

If it works, then you could check all your offsets, one at a time, to verify if they work as expected.

etc, etc, etc, until your project is finished.

Actually Dlloyd, I don't think that I went too far. I only replaced the first three pins with the last three to see whether the timers are tied with any digital pins. I am afraid that's the case, reason why I just wanted to invert the first three pins and not deal with the offset ... I could be wrong. Is this possible? Have you gotten something similar to work with the offset??

Thank you

Another hint: Take a look at http://arduino.cc/en/Hacking/PinMapping168 What are the ATmega pin names representing Arduino UNO pins 11, 5 and 9? No need to answer - just a hint.

EDIT

Have you gotten something similar to work with the offset??

Honestly, I don't own an UNO and have no experience programming an AVR type MCU. I have limited experience with the Arduino Due, but that's a totally different beast. The best way to get something working is to research / experiment and get experience to the best of your abilities and things will get easier as you go.