查看: 4520|回复: 6

[原创] OM13090_LPC54114简易频谱(附hex文件)

[复制链接]
  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9415
    最后登录
    2022-5-12
    发表于 2018-1-11 00:20:07 | 显示全部楼层 |阅读模式
    本帖最后由 小马哥-1650185 于 2018-1-11 19:01 编辑

    随便瞎玩的。。。

    本测试基于官方sdk的 dmic_dam例程,增加了oled驱动,和fft算法。。。。
    下来显示个图片玩玩吧


    IMG_20180111_183749.jpg


    然后进入频谱章节。。。。。。 IMG_20180111_184054.jpg
    大概就是这样子喽,声音通过数字麦克采集,54114 开启dma 采集128个点,然后进入fft运算,得到声音信号中的不同频率成分,送oled显示

    串口打印信息如下:

    QQ截图20180111184421.jpg

    其实挺简单的,没什么,就是在调试oeld 驱动时候花了一些时间

    oled  io配置

    1. typedef struct {
    2.         uint8_t                port;
    3.         uint8_t                pin;
    4.         uint32_t        modefunc;
    5.         bool                init_state;
    6. } SPI_BB_IO_T;

    7. gpio_pin_config_t oled_config = {
    8.                 kGPIO_DigitalOutput, 0,
    9. };
    10. static const SPI_BB_IO_T bb_io[] = {
    11.         {        1,                1,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        true        },                //        SPI SSEL
    12.         {        0,                19,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        false        },                //        SPI SCK
    13.         {        0,                20,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        false        },                //        SPI MOSI
    14.         {        1,                15,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        true        },                //        OLED DATA/CMD
    15.         {        1,                14,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        true        },                //        OLED nRESET
    16.         {        1,                12,                (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN),        false        },                //        OLED VPP control
    17. };
    18. static const uint32_t bb_io_ct = sizeof(bb_io) / sizeof(SPI_BB_IO_T);

    19. static void init_pinmux(void)
    20. {
    21.         uint32_t i;

    22.         for (i=0; i<bb_io_ct; i++) {
    23.                 IOCON_PinMuxSet(IOCON, bb_io[i].port, bb_io[i].pin, bb_io[i].modefunc);
    24.         }
    25. }

    26. static void init_gpio(void)
    27. {
    28.         uint32_t i;

    29.         for (i=0; i<bb_io_ct; i++) {
    30.                 GPIO_PinInit(GPIO, bb_io[i].port, bb_io[i].pin, &oled_config);
    31. //                GPIO->DIR[bb_io[i].port] |= 1UL << bb_io[i].pin;
    32.     GPIO_PinWrite(GPIO, bb_io[i].port, bb_io[i].pin, bb_io[i].init_state);

    33.         }
    34. }
    复制代码

    oled 相关寄存器
    1. static uint8_t init_seq[] = {
    2.         0xae,                //        Display OFF
    3.         0xd5,                //        Set D-clock
    4.         0x50,                //        100Hz
    5.         0x20,                //        Set row address
    6.         0x81,                //        Set contrast control
    7.         0xc0,
    8.         0xa0,                //        Segment remap
    9.         0xa4,                //        Set Entire Display ON
    10.         0xa6,                //        Normal display
    11.         0xad,                //        Set external VPP
    12.         0x80,
    13.         0xc0,                //        Set Common scan direction
    14.         0xd9,                //        Set phase length
    15.         0x25,
    16.         0xdb,                //        Set Vcomh voltage
    17.         0x28,                //        0.687*VPP
    18. //        0xaf                //        Display ON
    19. };
    复制代码

    自己写的一些方法。。。
    1. void OLED_Draw_Point(int32_t x1,int32_t y1, uint16_t color);
    2. uint16_t OLED_Get_Point_Vaule( int x1, int y1);
    3. void OLED_Clear (uint16_t color);
    4. void OLED_Clear_Fbp( unsigned short color);
    5. void OLED_Draw_Line(int x1,int y1,int x2,int y2, uint16_t color);
    6. void OLED_Draw_Line_1(int x1, int y1, int x2, int y2, uint16_t color);
    7. void OLED_Draw_box(int x1, int y1,int x2,int y2, unsigned short color);
    8. void OLED_Draw_Rectangle(int x1, int y1, int x2, int y2, uint16_t color);
    9. void OLED_Darw_Circle(int xc, int yc,int r, uint16_t color, int fill);
    10. void OLED_Darw_Circle_1( int cx, int cy, int radius, uint16_t color, int fill);
    11. void OLED_fill_Box(int x1,int y1,int x2,int y2, uint16_t color);
    12. void OLED_Darw_BAR(int x0,int y0,int w,float data,int data_max,int h_max, uint16_t color);
    13. void OLED_Move_BAR(int x,int y,int w,int num,int len,float* data,int data_max,int h_max, uint16_t color);
    14. void OLED_Move_BAR_dynamic(int x,int y,int w,int num,int len,float* data,float* data_old,int data_max,int h_max, uint16_t color);
    15. void OLED_Draw_wave(int x,int y,int data_max, short h_max, uint16_t * p, unsigned short color);

    16. void OLED_Show_Char(int x,int y,uint16_t font,uint16_t color,uint16_t backcolor,uint8_t num);
    17. void OLED_Show_String( int x,int y,uint16_t font,uint16_t color,uint16_t backcolor, char *p);
    18. void OLED_Show_HZ_Char(int x,int y,uint16_t font,uint16_t color,uint16_t backcolor,uint16_t num);
    19. void OLED_Show_HZ_String( int x,int y,uint16_t font,uint16_t color,uint16_t backcolor,unsigned char *p);
    20. void OLED_Printf( int x,int y,uint16_t font,uint16_t color,uint16_t backcolor, char *p);

    21. void OLED_Draw_Image(int x, int y, uint16_t color,uint16_t backcolor, const unsigned char* pic_array);
    复制代码

    主循环代码
    1. while (1)
    2.     {
    3.                         if(dmic_hwvad_ok == true)
    4.                         {
    5. //                                OLED_Clear(0);
    6.                                 dmic_hwvad_ok= false;
    7.                                 DMIC_TransferReceiveDMA(DMIC0, &g_dmicDmaHandle, &receiveXfer, APP_DMIC_CHANNEL);
    8.                                 
    9.                                 if(g_Transfer_Done == true)
    10.                                 {
    11.                                         g_Transfer_Done = false;
    12.                                         PRINTF("Transfer completed\r\n");
    13.                                         PRINTF("----DMIC----From----DMA------To------CPU:\r\n");
    14.                                                 for (i = 0; i < BUFFER_LENGTH; i++)
    15.                                                 {
    16.                                                         PRINTF("%5d , ", g_rxBuffer[i]);
    17.                                                         if(((i!=0)&&((i+1)%8 == 0)) ||(i ==BUFFER_LENGTH-1 )) PRINTF("\r\n");
    18.                                                 }
    19.                                                 PRINTF("\r\n--------------------M.G.F----------------------\r\n");
    20.                                 }
    21.                                        
    22. //                                OLED_Draw_wave(0,63,65536,63,g_rxBuffer_old,BLACK);                                
    23. //                                OLED_Draw_wave(0,0,65536,63,g_rxBuffer,WHITE);               
    24. //                                memcpy(g_rxBuffer_old,g_rxBuffer,sizeof(g_rxBuffer));                        
    25.                                         //把数据送入结构体comp对象的实部,虚部等于零.
    26.                                 for(uint8_t j=0;j<FFT_N;j++)
    27.                                 {   
    28.                                          //实部初始化为需要fft变换的数据
    29.                                          DMIC_Buffer[j].real= g_rxBuffer[j]>>4;
    30.                                         //虚部初始化为0
    31.                                          DMIC_Buffer[j].imag= 0;               
    32.                                 }
    33.                                 
    34.                                         FFT(DMIC_Buffer);//fft变换
    35.                                         fft_result(DMIC_Buffer);//求分次谐波模值存入复数的实部
    36.                                         THD_signle(DMIC_Buffer,DMIC_Voltage);//分次谐波值

    37.                                         PRINTF("----FFT----FFT----FFT------\r\n");
    38.                                         for (i = 0; i < 128; i++)
    39.                                         {
    40.                                                 PRINTF("%05d, ", (unsigned int)DMIC_Buffer[i].real);

    41.                                                 if(((i!=0)&&((i+1)%8 == 0)) ||(i ==128-1 )) PRINTF("\r\n");
    42.                                         }
    43.                                         PRINTF("----FFT----FFT----FFT------\r\n");
    44.                                                 
    45.                                 OLED_Move_BAR(2,100,2,62,125,DMIC_Voltage+2,100,80, WHITE);        
    46.                                 
    47.                                 OLED_Update_Display();

    48.                                 }
    49.                                                 
    50.     }
    复制代码

    最后附上hex文件吧,有官方板子的可以下进去玩玩
    lpc54114_oled_ frequency spectrum.rar (30.42 KB, 下载次数: 3)
    好好
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2018-1-11 11:22:01 来自手机 | 显示全部楼层
    赞一个哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-1-16 12:20
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    653

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1667
    最后登录
    2022-5-2
    发表于 2018-1-12 11:07:54 | 显示全部楼层
    好东西啊
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2018-1-12 11:37:48 | 显示全部楼层
    厉害,要是配合VFD显示波形应该更漂亮了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-21 22:51
  • 签到天数: 369 天

    连续签到: 1 天

    [LV.9]以坛为家II

    7

    主题

    2716

    帖子

    7

    金牌会员

    Rank: 6Rank: 6

    积分
    1824
    最后登录
    2019-3-21
    发表于 2018-1-12 13:21:25 | 显示全部楼层
    这个挺有意思的,可惜就是没这个板子
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2018-1-15 09:10:48 | 显示全部楼层
    谢谢分享
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2018-7-31 08:40
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    299

    主题

    876

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14840
    最后登录
    2020-3-1
    发表于 2018-1-15 09:43:54 | 显示全部楼层
    顶一波~感觉又更新了~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 00:40 , Processed in 0.091959 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表