1
1
// This example generates different waveforms based on user input on A12/DAC1.
2
2
3
3
#include < Arduino_AdvancedAnalog.h>
4
+ #include < mbed_stats.h>
4
5
5
- #define N_SAMPLES (256 )
6
- #define DEFAULT_FREQUENCY (16000 )
6
+ #define N_SAMPLES (64 )
7
+ #define DEFAULT_FREQUENCY (32000 )
7
8
8
9
AdvancedDAC dac1 (A12);
9
10
uint8_t SAMPLES_BUFFER[N_SAMPLES];
10
- size_t dac_frequency = DEFAULT_FREQUENCY;
11
11
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
+
14
35
switch (cmd) {
15
36
case ' t' :
16
37
// Triangle wave
17
38
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 );
20
41
}
21
42
break ;
22
43
23
44
case ' q' :
24
45
// Square wave
25
46
Serial.print (" Waveform: Square " );
26
47
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 ;
28
49
}
29
50
break ;
30
51
@@ -38,36 +59,59 @@ void generate_waveform(int cmd)
38
59
39
60
case ' r' :
40
61
// Sawtooth
41
- Serial.print (" Waveform: Sawtooth" );
62
+ Serial.print (" Waveform: Sawtooth " );
42
63
for (int i=0 ; i<N_SAMPLES; i++){
43
- SAMPLES_BUFFER[i] = i;
64
+ SAMPLES_BUFFER[i] = i * ( 256 / N_SAMPLES) ;
44
65
}
45
66
break ;
46
67
47
68
case ' +' :
48
69
case ' -' :
49
70
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 ;
53
74
} else if (cmd == ' -' && dac_frequency > 1000 ) {
54
- dac_frequency /= 2 ;
75
+ dac_frequency /= 2 ;
55
76
} else {
56
- break ;
77
+ break ;
57
78
}
58
79
59
80
// Change frequency.
60
81
dac1.frequency (dac_frequency * N_SAMPLES);
61
82
break ;
62
-
83
+
84
+ case ' k' :
85
+ dac1.stop ();
86
+ dac_started = false ;
87
+ break ;
88
+
63
89
default :
64
90
Serial.print (" Unknown command " );
65
91
Serial.println ((char ) cmd);
66
92
return ;
67
93
}
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" );
71
115
}
72
116
73
117
void setup () {
@@ -77,32 +121,21 @@ void setup() {
77
121
78
122
}
79
123
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.
89
128
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
- }
96
129
}
97
130
98
131
void loop () {
99
132
if (Serial.available () > 0 ) {
100
133
int cmd = Serial.read ();
101
134
if (cmd != ' \n ' ) {
102
- generate_waveform (cmd);
135
+ generate_waveform (cmd);
103
136
}
104
137
}
105
-
138
+
106
139
if (dac1.available ()) {
107
140
// Get a free buffer for writing.
108
141
SampleBuffer buf = dac1.dequeue ();
0 commit comments