DISCO-F746NGのAudioOutから正弦波をスイープとして出力します。ダブルバッファリングを使って、リアルタイムにデータ生成をしています。 This program outputs sine sweep from AudioOut on DISCO-F746NG. The program uses double buffering when generates data signals.

Dependencies:   BSP_DISCO_F746NG_patch_fixed LCD_DISCO_F746NG mbed

Committer:
nanase
Date:
Sat Dec 26 07:20:53 2015 +0000
Revision:
0:ece4ec581d2b
First commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nanase 0:ece4ec581d2b 1 #include "main.h"
nanase 0:ece4ec581d2b 2
nanase 0:ece4ec581d2b 3 LCD_DISCO_F746NG lcd;
nanase 0:ece4ec581d2b 4 int16_t sweep_buffer[BufferSize];
nanase 0:ece4ec581d2b 5 double sweep_phase = 0.0;
nanase 0:ece4ec581d2b 6 double sweep_freq = MinFreq;
nanase 0:ece4ec581d2b 7
nanase 0:ece4ec581d2b 8 void init_audio()
nanase 0:ece4ec581d2b 9 {
nanase 0:ece4ec581d2b 10 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, AudioVolume, SamplingFreq) == AUDIO_ERROR)
nanase 0:ece4ec581d2b 11 error_trap();
nanase 0:ece4ec581d2b 12
nanase 0:ece4ec581d2b 13 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ, (uint32_t)&AUDIO_OUT_SAIx_DMAx_IRQHandler);
nanase 0:ece4ec581d2b 14 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
nanase 0:ece4ec581d2b 15 }
nanase 0:ece4ec581d2b 16
nanase 0:ece4ec581d2b 17 void play_audio()
nanase 0:ece4ec581d2b 18 {
nanase 0:ece4ec581d2b 19 if (BSP_AUDIO_OUT_Play((uint16_t*)&sweep_buffer, BufferByteSize) == AUDIO_ERROR)
nanase 0:ece4ec581d2b 20 error_trap();
nanase 0:ece4ec581d2b 21 }
nanase 0:ece4ec581d2b 22
nanase 0:ece4ec581d2b 23 void fill_buffer(uint32_t offset, uint32_t size)
nanase 0:ece4ec581d2b 24 {
nanase 0:ece4ec581d2b 25 static double sweep_freq_delta = 1.0 + SweepSpeed;
nanase 0:ece4ec581d2b 26 double sweep_phase_delta = 1.0 / SamplingFreq;
nanase 0:ece4ec581d2b 27 double new_freq;
nanase 0:ece4ec581d2b 28
nanase 0:ece4ec581d2b 29 for (int i = 0, j = offset; i < size / 2; i++ ) {
nanase 0:ece4ec581d2b 30 int16_t value = (int16_t)(Amplifier * sin(2.0 * PI * sweep_freq * sweep_phase) * 32767.5);
nanase 0:ece4ec581d2b 31 sweep_buffer[j++] = value;
nanase 0:ece4ec581d2b 32 sweep_buffer[j++] = value;
nanase 0:ece4ec581d2b 33
nanase 0:ece4ec581d2b 34 sweep_phase += sweep_phase_delta;
nanase 0:ece4ec581d2b 35 }
nanase 0:ece4ec581d2b 36
nanase 0:ece4ec581d2b 37 new_freq = sweep_freq * sweep_freq_delta;
nanase 0:ece4ec581d2b 38 sweep_phase = sweep_phase * sweep_freq / new_freq;
nanase 0:ece4ec581d2b 39 sweep_freq = new_freq;
nanase 0:ece4ec581d2b 40
nanase 0:ece4ec581d2b 41 if (sweep_freq > MaxFreq)
nanase 0:ece4ec581d2b 42 sweep_freq_delta = 1.0 - SweepSpeed;
nanase 0:ece4ec581d2b 43 else if (sweep_freq < MinFreq)
nanase 0:ece4ec581d2b 44 sweep_freq_delta = 1.0 + SweepSpeed;
nanase 0:ece4ec581d2b 45 }
nanase 0:ece4ec581d2b 46
nanase 0:ece4ec581d2b 47 int main()
nanase 0:ece4ec581d2b 48 {
nanase 0:ece4ec581d2b 49 char strbuf[64];
nanase 0:ece4ec581d2b 50
nanase 0:ece4ec581d2b 51 lcd.Clear(LCD_COLOR_BLACK);
nanase 0:ece4ec581d2b 52 lcd.SetBackColor(LCD_COLOR_BLACK);
nanase 0:ece4ec581d2b 53 lcd.SetTextColor(LCD_COLOR_WHITE);
nanase 0:ece4ec581d2b 54 lcd.SetFont(&Font12);
nanase 0:ece4ec581d2b 55
nanase 0:ece4ec581d2b 56 init_audio();
nanase 0:ece4ec581d2b 57 play_audio();
nanase 0:ece4ec581d2b 58
nanase 0:ece4ec581d2b 59 while(1) {
nanase 0:ece4ec581d2b 60 sprintf(strbuf, "Freq: %.2f Hz, Phase: %.2f ", sweep_freq, sweep_phase);
nanase 0:ece4ec581d2b 61 printlcdAt(strbuf, 0);
nanase 0:ece4ec581d2b 62 wait_ms(100);
nanase 0:ece4ec581d2b 63 }
nanase 0:ece4ec581d2b 64 }