Changed the way Amplitude and frequency scaling works
Amplitude scaling now changes the amplitude of the signal itself instead of outputting a separate signal. Added a new pre-defined parameter called sample resolution. It enables the ability to skip a certain number of elements in the waveform array which allows for higher frequency waveforms.
This commit is contained in:
71
src/main.cpp
71
src/main.cpp
@@ -25,6 +25,10 @@
|
|||||||
|
|
||||||
//uncomment to enable serial output for debugging
|
//uncomment to enable serial output for debugging
|
||||||
#define enable_serial_debug
|
#define enable_serial_debug
|
||||||
|
/* Changes the number of array points to sample. If 1, it will sample every point.
|
||||||
|
* If 2, it will sample every other point,. If four it will sample every 4 points, etc.
|
||||||
|
*/
|
||||||
|
#define sample_resolution 4
|
||||||
|
|
||||||
#define waveform_pin DAC0
|
#define waveform_pin DAC0
|
||||||
#define amplitude_pin DAC1
|
#define amplitude_pin DAC1
|
||||||
@@ -47,26 +51,27 @@ int waveforms[waveform_num][600] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// A dynamic waveform that can change its values based on some scalar. This gets initialized at the start of the program
|
||||||
|
int dynamic_waveform[600];
|
||||||
|
|
||||||
//Setup encoders and their corresponding variables
|
//Setup encoders and their corresponding variables
|
||||||
Encoder amp_encoder(22, 23);
|
Encoder amp_encoder(22, 23);
|
||||||
long new_amp = 64;
|
long new_amp = 10;
|
||||||
long old_amp = 64;
|
long old_amp = 10;
|
||||||
Encoder period_encoder(24, 25);
|
Encoder period_encoder(24, 25);
|
||||||
long new_period = 10;
|
long new_period = 4;
|
||||||
long old_period = 10;
|
long old_period = 4;
|
||||||
Encoder waveform_encoder(26, 27);
|
Encoder waveform_encoder(26, 27);
|
||||||
long new_waveform = 2;
|
long new_waveform = 2;
|
||||||
long old_waveform = 2;
|
long old_waveform = 2;
|
||||||
int waveform_select = 2;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
unsigned int millis_period = 13;
|
|
||||||
//Used to debounce the trigger input
|
//Used to debounce the trigger input
|
||||||
boolean has_single_pulsed = false;
|
boolean has_single_pulsed = false;
|
||||||
unsigned long deb_timer = 0;
|
unsigned long deb_timer = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Cycle through the waveform samples over a given period of time
|
/* Cycle through the waveform samples over a given period of time
|
||||||
* The time scalar argument changes how many samples it will skip.
|
* The time scalar argument changes how many samples it will skip.
|
||||||
* A value of 1 will not skip any samples, a value of 2 will use every 2nd sammple, and a value of 5 will use every 5th sample.
|
* A value of 1 will not skip any samples, a value of 2 will use every 2nd sammple, and a value of 5 will use every 5th sample.
|
||||||
@@ -84,11 +89,26 @@ void generate_waveform(int time_scalar){
|
|||||||
//Loop through all of the samples in the array and output them to Dac 0
|
//Loop through all of the samples in the array and output them to Dac 0
|
||||||
for(int i = 0; i < 600; i=i+time_scalar){
|
for(int i = 0; i < 600; i=i+time_scalar){
|
||||||
while(micros()-timer < sample_period);
|
while(micros()-timer < sample_period);
|
||||||
analogWrite(waveform_pin, waveforms[new_waveform][i]);
|
analogWrite(waveform_pin, dynamic_waveform[i]);
|
||||||
timer = micros();
|
timer = micros();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Recalculates the waveform given a new amplitude percentage
|
||||||
|
void recalc_waveform(float percent_amplitude){
|
||||||
|
float amp_scalar = float(percent_amplitude)/10; // Create ampltidue scalar between 0.1 and 1
|
||||||
|
float offset = 2048 - 2048*amp_scalar; //Generate offset to keep the waveform DC offset the same
|
||||||
|
|
||||||
|
// Scale the array and give it its new offset
|
||||||
|
for(int i = 0; i < 600; i++){
|
||||||
|
dynamic_waveform[i] = (int)(waveforms[new_waveform][i]*amp_scalar + offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
//The sync pin can be run into an oscilliscope's trig channel to easiy find the waveform
|
//The sync pin can be run into an oscilliscope's trig channel to easiy find the waveform
|
||||||
pinMode(sync_pin, OUTPUT);
|
pinMode(sync_pin, OUTPUT);
|
||||||
@@ -108,14 +128,19 @@ void setup() {
|
|||||||
#ifdef enable_serial_debug
|
#ifdef enable_serial_debug
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.print("Ampltidue: ");
|
Serial.print("Ampltidue: ");
|
||||||
Serial.println(map(new_amp, 0, 127, 0, 4095));
|
Serial.println(new_amp*10);
|
||||||
Serial.print("Period: ");
|
Serial.print("Period: ");
|
||||||
Serial.println(new_period);
|
Serial.println(new_period);
|
||||||
Serial.print("Waveform #: ");
|
Serial.print("Waveform #: ");
|
||||||
Serial.println(new_waveform);
|
Serial.println(new_waveform);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Loads currently selected waveform into the dynamic waveform
|
||||||
|
for(int i = 0; i < 600; i++) dynamic_waveform[i] = waveforms[new_waveform][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
// Read in encoder values
|
// Read in encoder values
|
||||||
new_amp = amp_encoder.read()/4;
|
new_amp = amp_encoder.read()/4;
|
||||||
@@ -126,20 +151,22 @@ void loop() {
|
|||||||
//Handles ampltidue encoder
|
//Handles ampltidue encoder
|
||||||
if(new_amp != old_amp){
|
if(new_amp != old_amp){
|
||||||
// Make sure the value is within a valid range
|
// Make sure the value is within a valid range
|
||||||
if(new_amp > 127){
|
if(new_amp > 10){
|
||||||
//128 ampltidue steps should be enough granularity
|
//128 ampltidue steps should be enough granularity
|
||||||
new_amp = 127;
|
new_amp = 10;
|
||||||
amp_encoder.write(new_amp*4);
|
amp_encoder.write(new_amp*4);
|
||||||
}
|
}
|
||||||
if(new_amp < 0){
|
if(new_amp < 1){
|
||||||
new_amp = 0;
|
new_amp = 1;
|
||||||
amp_encoder.write(new_amp*4);
|
amp_encoder.write(new_amp*4);
|
||||||
}
|
}
|
||||||
old_amp = new_amp;
|
old_amp = new_amp;
|
||||||
|
//If serial is enabled, output some serial data
|
||||||
#ifdef enable_serial_debug
|
#ifdef enable_serial_debug
|
||||||
Serial.print("Ampltidue: ");
|
Serial.print("Ampltidue (%): ");
|
||||||
Serial.println(map(new_amp, 0, 127, 0, 4095));
|
Serial.println(new_amp*10);
|
||||||
#endif
|
#endif
|
||||||
|
recalc_waveform(new_amp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Handles period encoder
|
//Handles period encoder
|
||||||
@@ -150,14 +177,15 @@ void loop() {
|
|||||||
period_encoder.write(new_period*4);
|
period_encoder.write(new_period*4);
|
||||||
}
|
}
|
||||||
//Anything less than three will cause errors
|
//Anything less than three will cause errors
|
||||||
if(new_period < 3){
|
if(new_period < 4){
|
||||||
new_period = 3;
|
new_period = 4;
|
||||||
period_encoder.write(new_period*4);
|
period_encoder.write(new_period*4);
|
||||||
}
|
}
|
||||||
old_period = new_period;
|
old_period = new_period;
|
||||||
|
//If serial is enabled, output some serial data
|
||||||
#ifdef enable_serial_debug
|
#ifdef enable_serial_debug
|
||||||
Serial.print("Period: ");
|
Serial.print("Period (ms): ");
|
||||||
Serial.println(new_period);
|
Serial.println((float)(new_period)/sample_resolution);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,18 +201,17 @@ void loop() {
|
|||||||
waveform_encoder.write(new_waveform*4);
|
waveform_encoder.write(new_waveform*4);
|
||||||
}
|
}
|
||||||
old_waveform = new_waveform;
|
old_waveform = new_waveform;
|
||||||
|
// If serial is enabled, output some serial data
|
||||||
#ifdef enable_serial_debug
|
#ifdef enable_serial_debug
|
||||||
Serial.print("Waveform #: ");
|
Serial.print("Waveform #: ");
|
||||||
Serial.println(new_waveform);
|
Serial.println(new_waveform);
|
||||||
#endif
|
#endif
|
||||||
|
recalc_waveform(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a synch signal so an oscilliscope can more easily read irregular pulses
|
// Creates a synch signal so an oscilliscope can more easily read irregular pulses
|
||||||
digitalWrite(sync_pin, !digitalRead(sync_pin));
|
digitalWrite(sync_pin, !digitalRead(sync_pin));
|
||||||
|
|
||||||
// Output a signal to control the amplitude
|
|
||||||
analogWrite(amplitude_pin, map(new_amp, 0, 127, 0, 4095));
|
|
||||||
|
|
||||||
// Check to see if the single pulse pin has been pulled LOW
|
// Check to see if the single pulse pin has been pulled LOW
|
||||||
if(!digitalRead(single_pulse_flag_pin)){
|
if(!digitalRead(single_pulse_flag_pin)){
|
||||||
if(deb_timer-millis() > 100){
|
if(deb_timer-millis() > 100){
|
||||||
|
|||||||
Reference in New Issue
Block a user