Skip to content

Commit 8b0c7e9

Browse files
committed
Examples: Add waveform generator example.
1 parent 90b47ee commit 8b0c7e9

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// This example generates different waveforms based on user input on A12/DAC1.
2+
3+
#include "AdvancedDAC.h"
4+
5+
#define N_SAMPLES (256)
6+
#define DEFAULT_FREQUENCY (16000)
7+
8+
AdvancedDAC dac1(A12);
9+
uint8_t SAMPLES_BUFFER[N_SAMPLES];
10+
size_t dac_frequency = DEFAULT_FREQUENCY;
11+
12+
void generate_waveform(int cmd)
13+
{
14+
switch (cmd) {
15+
case 't':
16+
// Triangle wave
17+
Serial.print("Waveform: Triangle ");
18+
for (int i=0; i<N_SAMPLES; i++){
19+
SAMPLES_BUFFER[i] = abs((i % 255) - 127);
20+
}
21+
break;
22+
23+
case 'q':
24+
// Square wave
25+
Serial.print("Waveform: Square ");
26+
for (int i=0; i<N_SAMPLES; i++){
27+
SAMPLES_BUFFER[i] = (i % 255) < 127 ? 127 : 0;
28+
}
29+
break;
30+
31+
case 's':
32+
// Sine wave
33+
Serial.print("Waveform: Sine ");
34+
for (int i=0; i<N_SAMPLES; i++){
35+
SAMPLES_BUFFER[i] = sin(2 * 3.14 * (i / (float) N_SAMPLES)) * 127 + 127;
36+
}
37+
break;
38+
39+
case 'r':
40+
// Sawtooth
41+
Serial.print("Waveform: Sawtooth");
42+
for (int i=0; i<N_SAMPLES; i++){
43+
SAMPLES_BUFFER[i] = i;
44+
}
45+
break;
46+
47+
case '+':
48+
case '-':
49+
Serial.print("Current frequency: ");
50+
51+
if (cmd == '+' && dac_frequency < 64000) {
52+
dac_frequency *= 2;
53+
} else if (cmd == '-' && dac_frequency > 1000) {
54+
dac_frequency /= 2;
55+
} else {
56+
break;
57+
}
58+
59+
dac1.stop();
60+
delay(500);
61+
if (!dac1.begin(AN_RESOLUTION_8, dac_frequency * N_SAMPLES, N_SAMPLES, 32)) {
62+
Serial.println("Failed to start DAC1 !");
63+
}
64+
delay(500);
65+
break;
66+
67+
default:
68+
Serial.print("Unknown command ");
69+
Serial.println((char) cmd);
70+
return;
71+
}
72+
73+
Serial.print(dac_frequency/1000);
74+
Serial.println("KHz");
75+
}
76+
77+
void setup() {
78+
Serial.begin(115200);
79+
80+
while (!Serial) {
81+
82+
}
83+
84+
85+
Serial.println("Enter a command:");
86+
Serial.println("t: Triangle wave");
87+
Serial.println("q: Square wave");
88+
Serial.println("s: Sine wave");
89+
Serial.println("r: Sawtooth wave");
90+
Serial.println("+: Increase frequency");
91+
Serial.println("-: Decrease frequency");
92+
93+
generate_waveform('s');
94+
95+
// DAC initialization
96+
if (!dac1.begin(AN_RESOLUTION_8, DEFAULT_FREQUENCY * N_SAMPLES, N_SAMPLES, 32)) {
97+
Serial.println("Failed to start DAC1 !");
98+
while (1);
99+
}
100+
}
101+
102+
void loop() {
103+
if (Serial.available() > 0) {
104+
int cmd = Serial.read();
105+
if (cmd != '\n') {
106+
generate_waveform(cmd);
107+
}
108+
}
109+
110+
if (dac1.available()) {
111+
// Get a free buffer for writing.
112+
SampleBuffer buf = dac1.dequeue();
113+
114+
// Write data to buffer.
115+
for (size_t i=0; i<buf.size(); i++) {
116+
buf[i] = SAMPLES_BUFFER[i];
117+
}
118+
119+
dac1.write(buf);
120+
}
121+
}

0 commit comments

Comments
 (0)