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
89AdvancedDAC dac1 (A12);
910uint8_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
73117void 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
98131void 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