stm32 FFT Demo

Started by tha, August 12, 2014, 04:16:13 AM

Previous topic - Next topic

tha

ลองเอาตัวอย่าง fft demo ที่เป็น keil มาใช้ Coocox แทน ไฟล์ cr4_fft_64_stm32.s ใช้ GCC แทน แค่นี้ก็สามารถทำงานได้ debug ได้แล้วครับ
http://www.mediafire.com/download/8fimmamgorsl4us/FFT_Demo.rar
รู้สึกว่า text โชว์ sine, dual sine จะสลับกันกับกราฟ ส่วนรายละเอียดก็ต้องลองศึกษาดูครับ  ไม่เข้าใจตรงไหนมาช่วยกันวิเคราะห์กันครับหรือท่านใดทราบช่วยอธิบายด้วยก็จะดี ส่วนตัวผู้ทำก็ยังไม่ค่อยแน่นเหมือนกัน  ;D
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32F10xxx%20DSP%20library%20FFT%20algorithm&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=2485
อันนี้เป็นคู่มือของ STM32F10xxx DSP library ที่ใช้อยู่นี่ ซึ่งยังไม่ใช่ CMSIS DSP รุ่นใหม่ ซึ่งก็อยากลองไปดัดแปลงไปใช้อยู่เหมือนกัน(ต้องศึกษาเพราะมีหลายรูปแบบ)
http://blog.tkjelectronics.dk/2010/02/stm32-oscilloscope/
และอีกหนึ่งตัวอย่างที่อยากทำตามโดยใช้ Coocox แทน

tha

อันนี้ทดลองใช้ CMSIS DSP Radix-4 Complex FFT Functions แบบ q16 แทนครับ ค่า real กับค่า imagin จะแยกกัน สามารถแสดงค่าบนกราฟได้เหมือน DSP Library รุ่นเก่า  (บอร์ดผม RedBull stm32f103zet)
http://www.mediafire.com/download/0tlk1y3way1x2nz/FFT_Demo_1.rar

รายละเอียดดูใน CMSIS Library index.htm ไฟล์
การใช้ CMSIS DSP Library ผมดูตัวอย่างมาจากโปรเจคนี้ครับ
http://www.coocox.org/forum/topic.php?id=4052

tha

ลืมไปอย่าง คือเราต้อง define ARM_MATM_CM3 (ไปที่ Configuration -> compile -> Defined Symbols กด Add แล้วพิมพ์ ARM_MATH_CM3 แล้ว enter เข้าไปตามรูป



เพราะไม่งั้นจะ compile ไม่ผ่าน จะติดเนื่องจากไฟล์ arm_math.h จะไม่ #include "core_cm3.h" ซึ่งเป็น mcu ที่เราใช้งานเข้าไป

#if defined (ARM_MATH_CM4)
#include "core_cm4.h"
#elif defined (ARM_MATH_CM3)
#include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
#include "core_cm0.h"
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
#endif


tha

อันนี้ใช้ CMSIS DSP Complex Magnitude function แทน powerMag((NPT*2),"2SIDED"); ฟังชั่น คำนวณหาขนาดที่ความถี่ต่างๆ
http://www.mediafire.com/download/bg6rxhwe6y12ads/FFT_Demo_2.rar

tha

ลองเอาตัวอย่าง Frequency bin example ที่มีให้ใน CMSIS DSP Library (สามารถดูรายละเอียดได้ใน CMSIS Document) มาทำใน stm32f4discovery โดยใช้ Coocox CoIDE ซึ่งเราจะใช้ libarm_cortexM4lf_math.a แทนไฟล์ต่างๆ ของ CMSIS DSP Library (ไปที่ configuration -> Link -> Linked Libraries กด Add แล้วพิมพ์ libarm_cortexM4lf_math เข้าไป ส่วน Configuration -> Compile -> option FPU : FPU hard, Defined Symbols กด Add แล้วพิมพ์  ARM_MATH_CM4, __FPU_USED, __FPU_PRESENT เข้าไป) ซึ่งก็สามารถทำงานได้ถูกต้อง และสามารถ debug ดูค่าได้ ไม่แน่ใจว่าสามารถดูการทำงานของ FPU registers ได้ด้วยหรือเปล่า?

http://www.mediafire.com/download/eufao8bbbqkepso/arm_fft_bin_example.rar

อันนี้คือตัวอย่างที่เขาทำตั้งแต่ CoIDE ยังไม่ได้ support stm32f407vg
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fUndefined%20reference%20to%20%60sqrtf%27%20-%20STM32F4%20DSP%20library&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=3134
ของเราไม่ต้องเพิ่ม library อื่นๆเข้าไป เพียงแต่เลือก use base C library แค่นั้นก็พอ

tha

ลองทำ Oscilloscope ตามอย่าง TKJElectronics แต่โชว์กราฟตามแนวตั้ง (Coocox stm32f103zet Redbull board)
http://www.mediafire.com/download/5755k3y5j74yq6b/Oscilloscope_3.rar
เดี๋ยวต่อไปจะลอง modify โดยใช้ TIM มาใช้ในการ sampling ซึ่งน่าจะลดความซับซ้อนลง

tha

ลองใช้ TIM2 ในการ sampling ADC ก็จะแน่นอนขึ้น ไม่ต้องคำนวณให้ยุ่งยาก
http://www.mediafire.com/download/rtur4wb4noa6yxh/Oscilloscope_4.rar
มีปัญหาเกี่ยวกับ touch screen เวลากดขึ้นเป็นครั้งที่ 6 แล้วจะเกิด HardFault ลองดีบักดูแล้ว น่าจะเกิดจากสาเหตอะไรครับ ลองแก้ไปหลายอย่างก็ยังไม่หาย

tha

sine wave generator for PC ใช้ตัวไหนดีครับ พอดีไม่มีตัวกำเนิด sine wave ที่เปลี่ยนความถี่ได้ สำหรับเอาไว้วัดและเปรียบเทียบค่า