Function Generator made by arduino- Mike Robakidze

Thread Starter

dr micron

Joined Jul 18, 2012
4
Function Generator made by arduino and DAC ic ( PCF8591)
Code written by Mike Robakidze.
Summer 2013

Rich (BB code):
#include "Wire.h"
#include <LiquidCrystal.h> // include the library code:
#define PCF8591 (0x90 >> 1)  // I2C bus address
#define ADC0 0x00  // control bytes for reading individual ADCs

byte value0, value1, value2, value3;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize lib with intf pins
int modulator;    // this changes frequency of a wave

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup()
{
 Wire.begin();
 Serial.begin(9600);
 lcd.begin(16, 2);  // set up the LCD's columns and rows: 
 }
//++++ Sine Wave +++++++++++++++++++++++++++++++++++++++++++++
uint8_t  sine_wave[256] =     // Sine wave *WAVE*
{ 0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
  0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
  0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
  0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
  0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
  0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
  0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
  0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
  0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
  0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
  0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
  0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
  0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
  0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
  0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
  0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
  0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
  0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
  0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
  0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
  0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
  0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
  0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
  0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
  0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
  0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
  0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
  0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
  0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
  0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
  0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D};
//+++++ Square Wave  ++++++++++++++++++++++++++++++++++++++++++++++
uint8_t  sine_wavee[256] =           // Square wave *WAVEE* 
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
//++++++ Triangle Wave ++++++++++++++++++++++++++++++
uint8_t  sine_waveee[256] =  // triangle wave *WAVEEE*
{0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A,
0x2C,0x2E,0x30,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3E,0x40,
0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,0x50,0x52,0x54,0x56,
0x58,0x5A,0x5C,0x5E,0x60,0x62,0x64,0x66,0x68,0x6A,0x6C,
0x6E,0x70,0x72,0x74,0x76,0x78,0x7A,0x7C,0x7E,0x80,0x82,
0x84,0x86,0x88,0x8A,0x8C,0x8E,0x90,0x92,0x94,0x96,0x98,
0x9A,0x9C,0x9E,0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE,
0xB0,0xB2,0xB4,0xB6,0xB8,0xBA,0xBC,0xBE,0xC0,0xC2,0xC4,
0xC6,0xC8,0xCA,0xCC,0xCE,0xD0,0xD2,0xD4,0xD6,0xD8,0xDA,
0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8,0xEA,0xEC,0xEE,0xF0,
0xF2,0xF4,0xF6,0xF8,0xFA,0xFC,0xFE,0xFF, };
//+++ Sawtooth +++++++++++++++++++++++++++
uint8_t  sine_waveeee[256] =  // Sawtooth wave *WAVEEEE*
{
0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A,
0x2C,0x2E,0x30,0x32,0x34,0x36,0x38,0x3A,0x3C,0x3E,0x40,
0x42,0x44,0x46,0x48,0x4A,0x4C,0x4E,0x50,0x52,0x54,0x56,
0x58,0x5A,0x5C,0x5E,0x60,0x62,0x64,0x66,0x68,0x6A,0x6C,
0x6E,0x70,0x72,0x74,0x76,0x78,0x7A,0x7C,0x7E,0x80,0x82,
0x84,0x86,0x88,0x8A,0x8C,0x8E,0x90,0x92,0x94,0x96,0x98,
0x9A,0x9C,0x9E,0xA0,0xA2,0xA4,0xA6,0xA8,0xAA,0xAC,0xAE,
0xB0,0xB2,0xB4,0xB6,0xB8,0xBA,0xBC,0xBE,0xC0,0xC2,0xC4,
0xC6,0xC8,0xCA,0xCC,0xCE,0xD0,0xD2,0xD4,0xD6,0xD8,0xDA,
0xDC,0xDE,0xE0,0xE2,0xE4,0xE6,0xE8,0xEA,0xEC,0xEE,0xF0,
0xF2,0xF4,0xF6,0xF8,0xFA,0xFC,0xFE,//++++++++++++++
0xFE,0xFC,0xFA,0xF8,0xF6,0xF4,0xF2,0xF0,0xEE,0xEC,0xEA,
0xE8,0xE6,0xE4,0xE2,0xE0,0xDE,0xDC,0xDA,0xD8,0xD6,0xD4,
0xD2,0xD0,0xCE,0xCC,0xCA,0xC8,0xC6,0xC4,0xC2,0xC0,0xBE,
0xBC,0xBA,0xB8,0xB6,0xB4,0xB2,0xB0,0xAE,0xAC,0xAA,0xA8,
0xA6,0xA4,0xA2,0xA0,0x9E,0x9C,0x9A,0x98,0x96,0x94,0x92,
0x90,0x8E,0x8C,0x8A,0x88,0x86,0x84,0x82,0x80,0x7E,0x7C,
0x7A,0x78,0x76,0x74,0x72,0x70,0x6E,0x6C,0x6A,0x68,0x66,
0x64,0x62,0x60,0x5E,0x5C,0x5A,0x58,0x56,0x54,0x52,0x50,
0x4E,0x4C,0x4A,0x48,0x46,0x44,0x42,0x40,0x3E,0x3C,0x3A,
0x38,0x36,0x34,0x32,0x30,0x2E,0x2C,0x2A,0x28,0x26,0x24,
0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x14,0x12,0x10,0x0E,
0x0C,0x0A,0x08,0x06,0x04,0x02,0x00};
//+++ Rectified Sine +++++++++++++++++++++++++++
uint8_t  sine_waveeeee[256] =  // Rectified Sine *WAVEEEEE*
{0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
 0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
 0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
 0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
 0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
 0x80
 };
void loop()
{
 Wire.beginTransmission(PCF8591); // wake up PCF8591
 Wire.send(ADC0); // control byte - read ADC0
 Wire.endTransmission(); // end tranmission
 Wire.requestFrom(PCF8591, 2);
 value0=Wire.receive();
 value0=Wire.receive(); 
 float modulator=value0/60; 
 //+++ sine ++++++++++++++++++++++++++++
 if ( digitalRead (13)==HIGH)
 {
 for (int i=0; i<256; i++)
 {
   Wire.beginTransmission(PCF8591); // wake up PCF8591
    Wire.send(0x40);                // control byte - turn on DAC (binary 1000000)
    Wire.send(sine_wave);        // value to send to DAC
    Wire.endTransmission();          // end tranmission
    delay (modulator ); 
  }
  //Serial.println ( "<<Sine Wave>>");
 }
 //else  { Serial.println ( "<<<Choose wave>>>" );}
 
//+++ Square +++++++++++++++++++++++++++++++++
 if ( digitalRead (10)==HIGH)
 {
 for (int i=0; i<256; i++)
  {
    Wire.beginTransmission(PCF8591); // wake up PCF8591
    Wire.send(0x40);                // control byte - turn on DAC (binary 1000000)
    Wire.send(sine_wavee);       // value to send to DAC
    Wire.endTransmission();         // end tranmission
    delay (modulator ) ;
  }
  //Serial.println ( "<<Square Wave>>");
 }
 //else  { Serial.println ( "<<<Choose wave>>>" );}
 
 //+++ triangle +++++++++++++++++++++++++++++++++++++++++++++++++
 if ( digitalRead (9)==HIGH)
 {
 for (int i=0; i<256; i++)
  {
    Wire.beginTransmission(PCF8591); // wake up PCF8591
    Wire.send(0x40);                // control byte - turn on DAC (binary 1000000)
    Wire.send(sine_waveee);        // value to send to DAC
    Wire.endTransmission();          // end tranmission
    delay (modulator ) ; 
}
  //Serial.println ( "<<Triangle Wave>>");
}
 
 //else  { Serial.println ( "<<<Choose wave>>>" ); }
 
 //+++ Sawtooth +++++++++++++++++++++++++++++++++++++++++++++++++
if ( digitalRead (8)==HIGH)
{
 for (int i=0; i<256; i++)
  {
    Wire.beginTransmission(PCF8591); // wake up PCF8591
    Wire.send(0x40);                // control byte - turn on DAC (binary 1000000)
    Wire.send(sine_waveeee);        // value to send to DAC
    Wire.endTransmission();          // end tranmission
    delay (modulator ) ; 
 }
  //Serial.println ( "<<Sawtooth Wave>>");
  //else  { Serial.println ( "<<<Choose wave>>>" ); }
}
//+++ Rectivied Sine ++++++++++++++++++++++++++++++++++++++
if ( digitalRead (7)==HIGH)
{
 for (int i=0; i<256; i++)
  {
    Wire.beginTransmission(PCF8591); // wake up PCF8591
    Wire.send(0x40);                // control byte - turn on DAC (binary 1000000)
    Wire.send(sine_waveeeee);    // value to send to DAC
    Wire.endTransmission();         // end tranmission
    delay (modulator ) ;  
  }
  //Serial.println ( "<<Rectified Wave>>");
  //else  { Serial.println ( "<<<Choose wave>>>" ); }
}     
}
 
Last edited by a moderator:

Thread Starter

dr micron

Joined Jul 18, 2012
4
This is a working code and i am not trying to get help from anybody in this case. the reason i posted it here is that anybody who wants to make their own Function Generator, they can have this code.
Thanks
 

Thread Starter

dr micron

Joined Jul 18, 2012
4
You are right Mr. atferrari. it is unusual.
I did not know how to upload schematic ( pictures, PDF so on) but as soon as i get a chance to get familiar with this website i ll upload the rest of the stuff.
 
Top