11-05-2013 02:11 PM
Hi
Anyone knows how to generate a sine wave signal using the LabView Interface? I think it should work using a PWM-output and a RLC filter of some kind to filter out the square wave leaving only the sine wave.
However I cannot find a way to generate the right signal. I am looking for frequencies in the range from 1Hz to 500Hz.
I am pretty lost.
11-05-2013 05:40 PM
Here is an article that shows how to use an Arduino uno to build a wave form generator.
You could simplify it and just build the sine wave capability.
A more complex approach uses DDS IC
<http://interface.khm.de/index.php/lab/experiments/arduino-dds-sinewave-generator/>
Another approach is to use an Arduino Due.
<http://arduino.cc/en/Tutorial/DueSimpleWaveformGenerator>
hrh1818
11-06-2013 01:43 AM
Hi hrh1818.
Thank for the answer. I do not want any pots, it should all be controlled from LabView. I tried to implement a slightly modified version of the code in the second link. It does create a sine wave. The problem is however that I am not able to communicate with the arduino throgh LabView (error 5002). I need to do that because in my project the Arduino should control a lot of other things than just creating a sine wave.
This is the code from the second link. Can you figure out why it disable communication with the LabView Interface? Is it because of the serial.print command ??
Søren
/*
*
* DDS Sine Generator mit ATMEGS 168
* Timer2 generates the 31250 KHz Clock Interrupt
*
* KHM 2009 / Martin Nawrath
* Kunsthochschule fuer Medien Koeln
* Academy of Media Arts Cologne
*/
#include "avr/pgmspace.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))
int ledPin = 13; // LED pin 7
int testPin = 7;
int t2Pin = 6;
byte bb;
double dfreq;
// const double refclk=31372.549; // =16MHz / 510
const double refclk=31376.6; // measured
// variables used inside interrupt service declared as voilatile
volatile byte icnt; // var inside interrupt
volatile byte icnt1; // var inside interrupt
volatile byte c4ms; // counter incremented all 4ms
volatile unsigned long phaccu; // pahse accumulator
volatile unsigned long tword_m; // dds tuning word m
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
Serial.begin(115200); // connect to the serial port
Serial.println("DDS Test");
pinMode(6, OUTPUT); // sets the digital pin as output
pinMode(7, OUTPUT); // sets the digital pin as output
pinMode(11, OUTPUT); // pin11= PWM output / frequency output
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.o Hz
tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word
}
void loop()
{
while(1) {
if (c4ms > 250) { // timer / wait fou a full second
c4ms=0;
dfreq=analogRead(0); // read Poti on analog pin 0 to adjust output frequency from 0..1023 Hz
cbi (TIMSK2,TOIE2); // disble Timer2 Interrupt
tword_m=pow(2,32)*dfreq/refclk; // calulate DDS new tuning word
sbi (TIMSK2,TOIE2); // enable Timer2 Interrupt
Serial.print(dfreq);
Serial.print(" ");
Serial.println(tword_m);
}
sbi(PORTD,6); // Test / set PORTD,7 high to observe timing with a scope
cbi(PORTD,6); // Test /reset PORTD,7 high to observe timing with a scope
}
}
//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM, 16000000/510 = 31372.55 Hz clock
void Setup_timer2() {
// 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 31372,550 KHz = 32uSec
// 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,7); // Test / set PORTD,7 high to observe timing with a oscope
phaccu=phaccu+tword_m; // soft DDS, phase accu with 32 bits
icnt=phaccu >> 24; // use upper 8 bits for phase accu as frequency information
// read value fron ROM sine table and send to PWM DAC
OCR2A=pgm_read_byte_near(sine256 + icnt);
if(icnt1++ == 125) { // increment variable c4ms all 4 milliseconds
c4ms++;
icnt1=0;
}
cbi(PORTD,7); // reset PORTD,7
11-06-2013 02:05 PM
In your test of Martin Nawrath Sine wave generator are you trying to communicate with Martin's sketch using LIFA? If so then don't forget when you upload Martin's code, Martin's code erases LIFA base and LIFA is no longer available.
hrh1818
11-06-2013 05:45 PM
An alternate approach to generating a sine wave with Arduino is to use a DDS IC. Here is a module that uses a an AD9833 DDS IC.
This module has a 3 wire SPI interface so it is compatible with LIFA. No potentiometer is required. However, you are trading dollars for programming time. You would need to add a custom program to LIFA to get Martin Nawrath sine wave generator to work with LIFA.
AD9853 data sheet
<http://www.analog.com/static/imported-files/data_sheets/AD9833.pdf>
Programming the AD9833. Application Note 1070
<http://www.analog.com/static/imported-files/application_notes/AN-1070.pdf>
hrh1818
11-16-2013 09:23 AM
HI ketelsen,
I am also doing an DDS function generator using arduino and then use labview as a interface,I think can u leave me the email address?maybe we can share or discuss the detail..