Skip to content

Commit e21c57b

Browse files
committed
examples/Waveform_Generator.ino: Update example.
* Add new command to stop DAC ("k"). * Print memory usage. * Increase max frequency to 128KHz. * Use a smaller DMA buffer size and rework the wave generators to support it.
1 parent 17811ad commit e21c57b

File tree

1 file changed

+69
-36
lines changed

1 file changed

+69
-36
lines changed

examples/Beginner/Waveform_Generator/Waveform_Generator.ino

+69-36
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,51 @@
11
// This example generates different waveforms based on user input on A12/DAC1.
22

33
#include <Arduino_AdvancedAnalog.h>
4+
#include <mbed_stats.h>
45

5-
#define N_SAMPLES (256)
6-
#define DEFAULT_FREQUENCY (16000)
6+
#define N_SAMPLES (64)
7+
#define DEFAULT_FREQUENCY (32000)
78

89
AdvancedDAC dac1(A12);
910
uint8_t SAMPLES_BUFFER[N_SAMPLES];
10-
size_t dac_frequency = DEFAULT_FREQUENCY;
1111

12-
void generate_waveform(int cmd)
13-
{
12+
uint32_t get_current_heap() {
13+
mbed_stats_heap_t heap_stats;
14+
mbed_stats_heap_get(&heap_stats);
15+
return heap_stats.current_size;
16+
}
17+
18+
void print_menu() {
19+
Serial.println();
20+
Serial.println("Enter a command:");
21+
Serial.println("t: Triangle wave");
22+
Serial.println("q: Square wave");
23+
Serial.println("s: Sine wave");
24+
Serial.println("r: Sawtooth wave");
25+
Serial.println("k: stop DAC");
26+
Serial.println("+: Increase frequency");
27+
Serial.println("-: Decrease frequency");
28+
}
29+
30+
void generate_waveform(int cmd) {
31+
static bool dac_started = false;
32+
static size_t dac_frequency = DEFAULT_FREQUENCY;
33+
static size_t starting_heap = get_current_heap();
34+
1435
switch (cmd) {
1536
case 't':
1637
// Triangle wave
1738
Serial.print("Waveform: Triangle ");
18-
for (int i=0; i<N_SAMPLES; i++){
19-
SAMPLES_BUFFER[i] = abs((i % 255) - 127);
39+
for (int i=0, j=N_SAMPLES-1; i<N_SAMPLES; i++, j--){
40+
SAMPLES_BUFFER[i] = abs((i - j) * 256 / N_SAMPLES);
2041
}
2142
break;
2243

2344
case 'q':
2445
// Square wave
2546
Serial.print("Waveform: Square ");
2647
for (int i=0; i<N_SAMPLES; i++){
27-
SAMPLES_BUFFER[i] = (i % 255) < 127 ? 127 : 0;
48+
SAMPLES_BUFFER[i] = i < (N_SAMPLES / 2) ? 0 : 255;
2849
}
2950
break;
3051

@@ -38,36 +59,59 @@ void generate_waveform(int cmd)
3859

3960
case 'r':
4061
// Sawtooth
41-
Serial.print("Waveform: Sawtooth");
62+
Serial.print("Waveform: Sawtooth ");
4263
for (int i=0; i<N_SAMPLES; i++){
43-
SAMPLES_BUFFER[i] = i;
64+
SAMPLES_BUFFER[i] = i * (256 / N_SAMPLES);
4465
}
4566
break;
4667

4768
case '+':
4869
case '-':
4970
Serial.print("Current frequency: ");
50-
51-
if (cmd == '+' && dac_frequency < 64000) {
52-
dac_frequency *= 2;
71+
72+
if (cmd == '+' && dac_frequency < 128000) {
73+
dac_frequency *= 2;
5374
} else if (cmd == '-' && dac_frequency > 1000) {
54-
dac_frequency /= 2;
75+
dac_frequency /= 2;
5576
} else {
56-
break;
77+
break;
5778
}
5879

5980
// Change frequency.
6081
dac1.frequency(dac_frequency * N_SAMPLES);
6182
break;
62-
83+
84+
case 'k':
85+
dac1.stop();
86+
dac_started = false;
87+
break;
88+
6389
default:
6490
Serial.print("Unknown command ");
6591
Serial.println((char) cmd);
6692
return;
6793
}
68-
69-
Serial.print(dac_frequency/1000);
70-
Serial.println("KHz");
94+
95+
if (cmd == 'k') {
96+
Serial.println("DAC stopped!");
97+
print_menu();
98+
} else {
99+
Serial.print(dac_frequency/1000);
100+
Serial.println("KHz");
101+
102+
if (dac_started == false) {
103+
// Initialize and start the DAC.
104+
if (!dac1.begin(AN_RESOLUTION_8, dac_frequency * N_SAMPLES, N_SAMPLES, 32)) {
105+
Serial.println("Failed to start DAC1 !");
106+
while (1);
107+
}
108+
dac_started = true;
109+
}
110+
}
111+
112+
Serial.print("Used memory: ");
113+
Serial.print(get_current_heap() - starting_heap);
114+
Serial.println(" bytes");
71115
}
72116

73117
void setup() {
@@ -77,32 +121,21 @@ void setup() {
77121

78122
}
79123

80-
81-
Serial.println("Enter a command:");
82-
Serial.println("t: Triangle wave");
83-
Serial.println("q: Square wave");
84-
Serial.println("s: Sine wave");
85-
Serial.println("r: Sawtooth wave");
86-
Serial.println("+: Increase frequency");
87-
Serial.println("-: Decrease frequency");
88-
124+
// Print list of commands.
125+
print_menu();
126+
127+
// Start generating a sine wave.
89128
generate_waveform('s');
90-
91-
// DAC initialization
92-
if (!dac1.begin(AN_RESOLUTION_8, DEFAULT_FREQUENCY * N_SAMPLES, N_SAMPLES, 32)) {
93-
Serial.println("Failed to start DAC1 !");
94-
while (1);
95-
}
96129
}
97130

98131
void loop() {
99132
if (Serial.available() > 0) {
100133
int cmd = Serial.read();
101134
if (cmd != '\n') {
102-
generate_waveform(cmd);
135+
generate_waveform(cmd);
103136
}
104137
}
105-
138+
106139
if (dac1.available()) {
107140
// Get a free buffer for writing.
108141
SampleBuffer buf = dac1.dequeue();

0 commit comments

Comments
 (0)