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
- Committer:
- nanase
- Date:
- 2015-12-26
- Revision:
- 0:ece4ec581d2b
File content as of revision 0:ece4ec581d2b:
#include "main.h" LCD_DISCO_F746NG lcd; int16_t sweep_buffer[BufferSize]; double sweep_phase = 0.0; double sweep_freq = MinFreq; void init_audio() { if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_BOTH, AudioVolume, SamplingFreq) == AUDIO_ERROR) error_trap(); NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ, (uint32_t)&AUDIO_OUT_SAIx_DMAx_IRQHandler); BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); } void play_audio() { if (BSP_AUDIO_OUT_Play((uint16_t*)&sweep_buffer, BufferByteSize) == AUDIO_ERROR) error_trap(); } void fill_buffer(uint32_t offset, uint32_t size) { static double sweep_freq_delta = 1.0 + SweepSpeed; double sweep_phase_delta = 1.0 / SamplingFreq; double new_freq; for (int i = 0, j = offset; i < size / 2; i++ ) { int16_t value = (int16_t)(Amplifier * sin(2.0 * PI * sweep_freq * sweep_phase) * 32767.5); sweep_buffer[j++] = value; sweep_buffer[j++] = value; sweep_phase += sweep_phase_delta; } new_freq = sweep_freq * sweep_freq_delta; sweep_phase = sweep_phase * sweep_freq / new_freq; sweep_freq = new_freq; if (sweep_freq > MaxFreq) sweep_freq_delta = 1.0 - SweepSpeed; else if (sweep_freq < MinFreq) sweep_freq_delta = 1.0 + SweepSpeed; } int main() { char strbuf[64]; lcd.Clear(LCD_COLOR_BLACK); lcd.SetBackColor(LCD_COLOR_BLACK); lcd.SetTextColor(LCD_COLOR_WHITE); lcd.SetFont(&Font12); init_audio(); play_audio(); while(1) { sprintf(strbuf, "Freq: %.2f Hz, Phase: %.2f ", sweep_freq, sweep_phase); printlcdAt(strbuf, 0); wait_ms(100); } }