嵌入式作業系統設計與實作 - 電吉他調音器
DESCRIPTION
TRANSCRIPT
嵌入式作業系統設計與實作 電吉他調音器
楊震向澐丁士宸李昆憶呂科進鄭聖文
二十六小時的堅持,雖然尚未完成
成果 - 電吉他調音器
系統架構
Stm32F429Discovery
Guitar
Battery
ADC
USB
Buzzer TimerOperating System:
Rtenv Plus
調音器程式流程
音訊輸入
ADC轉換
快速傅立葉轉換(FFT)
音調頻率,可表示為音名
電吉他
電吉他的拾音器是由磁鐵和線圈構成,會產生磁場
當弦被撥動時,磁場會收到干擾,產生電壓
聲音頻率、音名
C D E F G A BDo Re Mi Fa Sol La Si
不同的音調及音高會對應至不同之頻率,以鋼琴中央C而言 ,頻率約為261.6Hz
類比數位轉換(ADC)
● 透過ADC將外部類比訊號轉成離散數位訊號● 採用單一頻道連續取樣模式● 利用DMA來搬移 ADC產生的資料來減少CPU花費在讀寫的時間
● 將取樣的結果做快速傅立葉轉換來取得頻率
開發問題
● DMA的模式無法搞定, Normal mode搬移資料完成後無法重新啟動。
● 若不以DMA完成後再計算,則勢必要定時取樣● 更動排程時間造成作業系統無法預知的行為
開發問題
● 從示波器上看到,電吉他會產生一個正負約0.2mV的正弦波來回振動
● 然而硬體的ADC只能量到最多0 ~ 3.6V之間的電壓,導致負電壓量測不到
問題:如何量到完整的波形?● 答案:調整基準點、波形 -> 以平移放大電路解決
● 將完整波形level-shift到正電壓區● 利用放大電路增加波形的可分辨力
平移、放大電路,使用 OAP
測試 ,感謝工科系、電機系支援!
電路成品
平移、放大電路,使用 OAP
原訊號
調整後
快速傅立葉轉換 (Fast Fourier Transform)
與 Discrete Fourier Transform 一樣,將訊號從time domain 轉換成 frequency domain
DFT 的缺點:運算量過大:N^2
FFT: N lg N
快速傅立葉轉換 (Fast Fourier Transform)
快速傅立葉轉換 (Fast Fourier Transform)
快速傅立葉轉換 (Fast Fourier Transform)
FFT 概念:將 DFT 拆成奇偶兩部分
快速傅立葉轉換 (Fast Fourier Transform)
F(0)
F(1)
F(2)
F(3)
F(4)
F(5)
F(6)
F(7)
0
1
2
3
4
5
6
7
0
2
4
6
1
3
5
7
0
4
2
6
1
5
3
7
開發問題
ARM 有提供 CMSIS DSP Library,可是在開發上遇到重重困難
VFP Register 問題將 compiler 版本更新至 4.8.4 以上
需要開啟 FPU-DARM_MATH_CM4-D__FPU_USED=1 -D__FPU_PRESENT=1-mfpu=fpv4-sp-d16 -mfloat-abi=hard
開發問題
ARM 有提供 CMSIS DSP Library,可是在開發上遇到重重困難
VFP Register 問題將 compiler 版本更新至 4.8.4 以上
需要開啟 FPU-DARM_MATH_CM4-D__FPU_USED=1 -D__FPU_PRESENT=1-mfpu=fpv4-sp-d16 -mfloat-abi=hard
開發問題
編譯 flag 的優化層級為 –O0,造成部分 Library程式碼沒有被優化 -> 硬作 !
開發問題
ARM FFT 調用函式:arm_cfft_f32()所需的arm_bitreversal_32.s,一直沒有被link進來,試過很多方法,依然無解
->毅然決然,到網路上找尋 FFT 4096 的原始碼
開發問題
板子的 floatint point extension 沒有被開啟->還是硬幹
/libraries/CMSIS/Include/core_cm4.h
/libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c
開發問題
ARM 有提供 CMSIS DSP Library,可是在開發上遇到重重困難
VFP Register 問題將 compiler 版本更新至 4.8.4 以上
需要開啟 FPU-DARM_MATH_CM4-D__FPU_USED=1 -D__FPU_PRESENT=1-mfpu=fpv4-sp-d16 -mfloat-abi=hard
節拍器程式流程
計算節拍週期
設定定時器發聲(蜂鳴器)
延遲
單位 :BPM (Beat Per Minute)
表示一個指定的音符,例如四分音符在一分鐘內出現的次數(例如四分音符在一分鐘內出現的次數,120為 BPM值,表示每分鐘演奏 120個四分音符 )
樂譜上常記有音樂速度標記如 :Allegro - 快板( 120 - 168 bpm)Moderato - 中板(90 - 115 bpm)Andante - 行板(76 - 108 bpm)
...Etc
蜂鳴器(Buzzer)
利用timer對一個 GPIO以固定頻率輸出即可發出聲音因此改變 timer的時間就能發出不同高低的聲音
LCD模組 (觸控螢幕 )
優點 :使用者互動界面缺點 :電阻式觸控螢幕 ,流暢度有待加強
LCD繪圖原理
Layer
圖層是一排排的Pixel刷新
如果在更新完就立即顯 ,就會出現閃爍情況
開發問題
圖形更新問題(圖層閃爍 )解決方案 :Double buffer
硬體過新,軟體Library有 bug (ST Library)
開發問題
圖形更新問題(圖層閃爍 )解決方案 :Double buffer
硬體過新,軟體Library有 bug (ST Library)
解決畫面閃爍 - Double buffer
Show layer Hidden layer
解決畫面閃爍 - Double buffer
Hidden layer
Show layer
圖案先繪製到下面的 buffer
解決畫面閃爍 - Double buffer
Hidden layer
Show layer
繪圖完畢
解決畫面閃爍 - Double buffer
Show layer
Hidden layer
圖層交換
Thanks for listening!
Demo Time!