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
main.cpp@0:ece4ec581d2b, 2015-12-26 (annotated)
- Committer:
- nanase
- Date:
- Sat Dec 26 07:20:53 2015 +0000
- Revision:
- 0:ece4ec581d2b
First commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |