Function generator sweep on teensy 3.2 DAC

Status
Not open for further replies.
Hi,

I am new to using teensy, and have been using arduino before for simpler projects.

I'm working on a project where I need to create square wave signal with a sweeping frequency ranging from 20 to 20000 Hz. I need the frequency to bounce back to the startfrequency with a period of 30 seconds. I want the signal to repeat for 30 minutes before it stops.

I want to output the signal through the DAC.

I looked at the avaliable examples related to this, and am trying to reuse the code in Arduino IDE examples/audio/hardwaretesting/tonesweep

Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Bounce.h>

AudioSynthToneSweep myEffect;
AudioOutputI2S      audioOutput;        // audio shield: headphones & line-out

// The tone sweep goes to left and right channels
AudioConnection c1(myEffect, 0, audioOutput, 0);
AudioConnection c2(myEffect, 0, audioOutput, 1);

AudioControlSGTL5000 audioShield;


float t_ampx = 0.8;
int t_lox = 10;
int t_hix = 22000;
// Length of time for the sweep in seconds
float t_timex = 10;
// <<<<<<<<<<<<<<>>>>>>>>>>>>>>>>
void setup(void)
{
  
  Serial.begin(9600);
  while (!Serial) ;
  delay(3000);

  AudioMemory(2);

  audioShield.enable();
  audioShield.volume(0.5);

  Serial.println("setup done");

  if(!myEffect.play(t_ampx,t_lox,t_hix,t_timex)) {
    Serial.println("AudioSynthToneSweep - begin failed");
    while(1);
  }
  // wait for the sweep to end
  while(myEffect.isPlaying());

  // and now reverse the sweep
  if(!myEffect.play(t_ampx,t_hix,t_lox,t_timex)) {
    Serial.println("AudioSynthToneSweep - begin failed");
    while(1);
  }
  // wait for the sweep to end
  while(myEffect.isPlaying());
  Serial.println("Done");
}

void loop(void)
{
}

I'm changing the following
- im not using audioshield,
- im not outputting via i2s, but DAC
- new freq range and period
- waveform1 for square wave signal.
- moving code to loop to repeat infinitely (until I fix an overall time limit)

Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Bounce.h>

AudioSynthToneSweep waveform1;
AudioOutputAnalogStereo  dacs;          //xy=423,362

AudioConnection c1(waveform1, 0, dacs, 0);
AudioConnection c2(waveform1, 0, dacs, 1);

//AudioControlSGTL5000 audioShield;


float t_ampx = 0.8;
int t_lox = 20;
int t_hix = 20000;
// Length of time for the sweep in seconds
float t_timex = 300;
// <<<<<<<<<<<<<<>>>>>>>>>>>>>>>>
void setup(void)
{
  
  Serial.begin(9600);
  while (!Serial) ;
  delay(3000);

  AudioMemory(2);

  Serial.println("setup done");

  if(!waveform1.play(t_ampx,t_lox,t_hix,t_timex)) {
    Serial.println("AudioSynthToneSweep - begin failed");
    while(1);
  }
  // wait for the sweep to end
  while(waveform1.isPlaying());

  // and now reverse the sweep
  if(!waveform1.play(t_ampx,t_hix,t_lox,t_timex)) {
    Serial.println("AudioSynthToneSweep - begin failed");
    while(1);
  }
  // wait for the sweep to end
  while(waveform1.isPlaying());
  Serial.println("Done");
}

void loop(void)
{
}

I compile and upload it, but it does not work.


------------------------------ HARDWARE ----------------------------------------------

I have the following hardware setup ZW pv0.2.1 basic test teensy and 1 amp_bb.jpg

------------------------------ TESTING ----------------------------------------------


I do not get sound when connecting a speaker to the amplifier

I dont get a nice signal when I only have teensy connected to the USB port and probing GND and DAC with an oscilloscope.

I have verified with a multimeter that teensy and the amplifer get 5.1V from the battery powerboost circuit.

I have checked that the speaker works.

Any obvious problems here? Grateful for some support!

Best regards,
Marcus
 
Last edited:
Hi,

I am new to using teensy, and have been using arduino before for simpler projects.

I'm working on a project where I need to create square wave signal with a sweeping frequency ranging from 20 to 20000 Hz. I need the frequency to bounce back to the startfrequency with a period of 30 seconds. I want the signal to repeat for 30 minutes before it stops.

I want to output the signal through the DAC.


Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>
#include <Bounce.h>

AudioSynthToneSweep waveform1;
AudioOutputAnalogStereo  dacs;          //xy=423,362

That last line is wrong for the 3.2. The Teensy 3.2 only has one DAC, so you should use AudioOutputAnalog instead of AudioOutputAnalogStereo. You can only use AudioOutputAnalogStereo on the Teensy 3.5 and 3.6 which has two DACs on A20 and A21.

Here is my sample code to use ToneSweep on the 3.2 (or LC):

Code:
/*
  Demo of the audio sweep function.
  The user specifies the amplitude,
  start and end frequencies (which can sweep up or down)
  and the length of time of the sweep.

  Modified to use the single DAC on the Teensy 3.1/3.2 and the first DAC on the
  Teensy 3.5 or 3.6.  The 3.0, 4.0 and 4.1 Teensies do not have a DAC.

  Pins:		Teensy LC	Teensy 3.2	Teensy 3.5/3.6

  DAC:		A12		A14		A21
  */

#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code (edited by meissner afterwards).
AudioSynthToneSweep	tonesweep;		//xy=102,174
AudioAmplifier		amp;			//xy=324,172
AudioOutputAnalog	dac;			//xy=452,189

AudioConnection		patchCord1 (tonesweep, amp);
AudioConnection		patchCord2 (amp,       0,   dac, 0);
// GUItool: end automatically generated code

const float		t_ampx	= 0.8;
const int		t_lox	= 10;
const int		t_hix	= 22000;
const float		t_timex	= 10;		// Length of time for the sweep in seconds

void setup(void)
{
  // Wait for at least 3 seconds for the USB serial connection
  Serial.begin (9600);
  while (!Serial && millis () < 3000)
    ;

  AudioMemory (8);
  amp.gain (0.5f);

  Serial.println("setup done");

  if (!tonesweep.play (t_ampx, t_lox, t_hix, t_timex)) {
    Serial.println ("ToneSweep - play failed");
    while (1)
      ;
  }

  // wait for the sweep to end
  Serial.println ("Tonesweep up started");
  while (tonesweep.isPlaying ())
    ;

  // and now reverse the sweep
  Serial.println ("Tonesweep down started");
  if (!tonesweep.play (t_ampx, t_hix, t_lox, t_timex)) {
    Serial.println("ToneSweep - play failed");
    while (1)
      ;
  }

  // wait for the sweep to end
  while (tonesweep.isPlaying ())
    ;
  Serial.println("Done");
}

void loop(void)
{
}
 
Status
Not open for further replies.
Back
Top