0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【英飞凌PSoC 6 RTT开发板试用】语音识别之二:音频采集

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-07-11 07:43 次阅读

一. 音频采集

原理图

从原理图看到有6路模拟输入,分别对应

P10.0~P10.5, VREF为模拟参考电压。

image.png

image.png

使用的是MAX4466的MIC,接到ADC0,如下图所示

image.png

image.png

image.png

配置模拟采集引脚

image.png

代码

Adc.c

#include "cy_pdl.h"
#include "cyhal.h"
#include "cybsp.h"
#include "cy_retarget_io.h"

#define VPLUS_CHANNEL_0  (P10_0)
/* Conversion factor */
#define MICRO_TO_MILLI_CONV_RATIO        (1000u)

/* Acquistion time in nanosecond */
#define ACQUISITION_TIME_NS              (116680u)

/* ADC Scan delay in millisecond */
#define ADC_SCAN_DELAY_MS                (200u)

/*******************************************************************************
*       Enumerated Types
*******************************************************************************/
/* ADC Channel constants*/
enum ADC_CHANNELS
{
  CHANNEL_0 = 0,
  NUM_CHANNELS
} adc_channel;

/*******************************************************************************
* Global Variables
*******************************************************************************/
/* ADC Object */
cyhal_adc_t adc_obj;

/* ADC Channel 0 Object */
cyhal_adc_channel_t adc_chan_0_obj;

/* Default ADC configuration */
const cyhal_adc_config_t adc_config = {
        .continuous_scanning=false, // Continuous Scanning is disabled
        .average_count=1,           // Average count disabled
        .vref=CYHAL_ADC_REF_VDDA,   // VREF for Single ended channel set to VDDA
        .vneg=CYHAL_ADC_VNEG_VSSA,  // VNEG for Single ended channel set to VSSA
        .resolution = 12u,          // 12-bit resolution
        .ext_vref = NC,             // No connection
        .bypass_pin = NC };       // No connection

/* Asynchronous read complete flag, used in Event Handler */
static bool async_read_complete = true;
#define NUM_SCAN                    (1000)
#define NUM_CHANNELS                (1)
/* Variable to store results from multiple channels during asynchronous read*/
int32_t result_arr[NUM_CHANNELS * NUM_SCAN] = {0};

static void adc_event_handler(void* arg, cyhal_adc_event_t event)
{
    if(0u != (event & CYHAL_ADC_ASYNC_READ_COMPLETE))
    {
        /* Set async read complete flag to true */
        async_read_complete = true;
    }
}

int adc_init(void)
{
    /* Variable to capture return value of functions */
    cy_rslt_t result;

    /* Initialize ADC. The ADC block which can connect to the channel 0 input pin is selected */
    result = cyhal_adc_init(&adc_obj, VPLUS_CHANNEL_0, NULL);
    if(result != CY_RSLT_SUCCESS)
    {
        printf("ADC initialization failed. Error: %ld\\n", (long unsigned int)result);
        CY_ASSERT(0);
    }

    /* ADC channel configuration */
    const cyhal_adc_channel_config_t channel_config = {
            .enable_averaging = false,  // Disable averaging for channel
            .min_acquisition_ns = ACQUISITION_TIME_NS, // Minimum acquisition time set to 1us
            .enabled = true };          // Sample this channel when ADC performs a scan

    /* Initialize a channel 0 and configure it to scan the channel 0 input pin in single ended mode. */
    result  = cyhal_adc_channel_init_diff(&adc_chan_0_obj, &adc_obj, VPLUS_CHANNEL_0,
                                          CYHAL_ADC_VNEG, &channel_config);
    if(result != CY_RSLT_SUCCESS)
    {
        printf("ADC first channel initialization failed. Error: %ld\\n", (long unsigned int)result);
        CY_ASSERT(0);
    }

    /* Register a callback to handle asynchronous read completion */
     cyhal_adc_register_callback(&adc_obj, &adc_event_handler, result_arr);

     /* Subscribe to the async read complete event to process the results */
     cyhal_adc_enable_event(&adc_obj, CYHAL_ADC_ASYNC_READ_COMPLETE, CYHAL_ISR_PRIORITY_DEFAULT, true);

     printf("ADC is configured in multichannel configuration.\\r\\n\\n");
     printf("Channel 0 is configured in single ended mode, connected to the \\r\\n");
     printf("channel 0 input pin. Provide input voltage at the channel 0 input pin \\r\\n");
     return 0;
}

int adc_samp(void)
{
    /* Variable to capture return value of functions */
    cy_rslt_t result;

    /* Variable to store ADC conversion result from channel 0 */
    int32_t adc_result_0 = 0;


        /* Clear async read complete flag */
        async_read_complete = false;

        /* Initiate an asynchronous read operation. The event handler will be called
         * when it is complete. */
        memset(result_arr,0,sizeof(result_arr));
        cyhal_gpio_write_internal(CYBSP_USER_LED,true);
        result = cyhal_adc_read_async_uv(&adc_obj, NUM_SCAN, result_arr);
        if(result != CY_RSLT_SUCCESS)
        {
            printf("ADC async read failed. Error: %ld\\n", (long unsigned int)result);
            CY_ASSERT(0);
        }
        while(async_read_complete == false);
        cyhal_gpio_write_internal(CYBSP_USER_LED,false);
        /*
         * Read data from result list, input voltage in the result list is in
         * microvolts. Convert it millivolts and print input voltage
         *
         */
        for(int i=0; i< NUM_SCAN; i++)
        {
            adc_result_0 = result_arr[i] / MICRO_TO_MILLI_CONV_RATIO;
            printf("/*%4ld*/\\r\\n", (long int)adc_result_0);
        }

    return 0;
}

Adc.h

#ifndef ADC_H
#define ADC_H

int adc_init(void);
int adc_samp(void);

#endif

Main.c调用

adc_init();

adc_samp();

时钟

时钟源是100Mhz,12分频=8.33M,满足1.8MHz~18MHz之间的要求

默认是按照8M配置

image.png

image.png

采样时间

采样前后翻转LED用示波器测量时间

int adc_samp(void)
{
    /* Variable to capture return value of functions */
    cy_rslt_t result;

    /* Variable to store ADC conversion result from channel 0 */
    int32_t adc_result_0 = 0;


        /* Clear async read complete flag */
        async_read_complete = false;

        /* Initiate an asynchronous read operation. The event handler will be called
         * when it is complete. */
        memset(result_arr,0,sizeof(result_arr));
        cyhal_gpio_write_internal(CYBSP_USER_LED,true);
        result = cyhal_adc_read_async_uv(&adc_obj, NUM_SCAN, result_arr);
        if(result != CY_RSLT_SUCCESS)
        {
            printf("ADC async read failed. Error: %ld\\n", (long unsigned int)result);
            CY_ASSERT(0);
        }
        while(async_read_complete == false);
        cyhal_gpio_write_internal(CYBSP_USER_LED,false);
        /*
         * Read data from result list, input voltage in the result list is in
         * microvolts. Convert it millivolts and print input voltage
         *
         */
        for(int i=0; i< NUM_SCAN; i++)
        {
            adc_result_0 = result_arr[i] / MICRO_TO_MILLI_CONV_RATIO;
            printf("/*%4ld*/\\r\\n", (long int)adc_result_0);
        }

    return 0;
}

采样1000次,分别设置采样时间为2uS和1uS对比。

#define ACQUISITION_TIME_NS (2000u)

10.28mS

image.png

#define ACQUISITION_TIME_NS (1000u)

9.32mS

image.png

10.28-9.32=0.96mS 1000次约1mS,1次刚好是1uS。

而1000次除去采样时间其他时间为8.32mS,即一次8.32uS。

因为前面设置了时钟为8.33MHz, 从前面时序一节可以看到,除去采样时间,其他转换时间等需要14个CLK,所以需要14/8.33uS=1.7uS. 剩余的8.32-1.7为数据搬运,软件处理等时间。

采样值正确性

1.545V和示波器采集为1.54V差不多是正确的,这里没有高精度万用表就不对测试精度了,只测试了正确性。

image.png

image.png

音频采集

一次采集1000次然后串口打印,使用SerialStudio可视化显示

int adc_samp(void)
{
    /* Variable to capture return value of functions */
    cy_rslt_t result;

    /* Variable to store ADC conversion result from channel 0 */
    int32_t adc_result_0 = 0;


        /* Clear async read complete flag */
        async_read_complete = false;

        /* Initiate an asynchronous read operation. The event handler will be called
         * when it is complete. */
        memset(result_arr,0,sizeof(result_arr));
        cyhal_gpio_write_internal(CYBSP_USER_LED,true);
        result = cyhal_adc_read_async_uv(&adc_obj, NUM_SCAN, result_arr);
        if(result != CY_RSLT_SUCCESS)
        {
            printf("ADC async read failed. Error: %ld\\n", (long unsigned int)result);
            CY_ASSERT(0);
        }
        while(async_read_complete == false);
        cyhal_gpio_write_internal(CYBSP_USER_LED,false);
        /*
         * Read data from result list, input voltage in the result list is in
         * microvolts. Convert it millivolts and print input voltage
         *
         */
        for(int i=0; i< NUM_SCAN; i++)
        {
            adc_result_0 = result_arr[i] / MICRO_TO_MILLI_CONV_RATIO;
            printf("/*%4ld*/\\r\\n", (long int)adc_result_0);
        }

    return 0;
}

串口打印到PC,可视化显示如下

image.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英飞凌
    +关注

    关注

    66

    文章

    2147

    浏览量

    138351
  • PSoC
    +关注

    关注

    12

    文章

    170

    浏览量

    91785
  • 音频
    +关注

    关注

    29

    文章

    2832

    浏览量

    81307
  • 语音识别
    +关注

    关注

    38

    文章

    1719

    浏览量

    112523
  • 开发板
    +关注

    关注

    25

    文章

    4928

    浏览量

    97143
  • RTT
    RTT
    +关注

    关注

    0

    文章

    65

    浏览量

    17079
收藏 人收藏

    评论

    相关推荐

    英飞凌PSoC 6】新建RTT工程

    介绍英飞凌PSoC 6 RTT开发板环境创建
    的头像 发表于 04-24 15:29 1879次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> <b class='flag-5'>6</b>】新建<b class='flag-5'>RTT</b>工程

    英飞凌PSoC 6 RTT开发板试用语音识别之一:移植CMSIS-DSP库-FFT测试

    后面会基于本开发板实现语音识别,需要使用到FFT等关键算法,所以先移植CMSIS-DSP库,并进行FFT的测试。
    的头像 发表于 07-11 00:10 3653次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> <b class='flag-5'>6</b> <b class='flag-5'>RTT</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>】<b class='flag-5'>语音</b><b class='flag-5'>识别</b>之一:移植CMSIS-DSP库-FFT测试

    【大联大品佳 Nuvoton ISD9160语音识别试用申请】基于大联大品佳 Nuvoton ISD9160 语音识别开发板的微型冰箱数据采集

    项目名称:基于大联大品佳 Nuvoton ISD9160 语音识别开发板的微型冰箱数据采集试用计划:申请理由本人在本科、硕士及工作阶段有8年单片机
    发表于 08-10 17:40

    [CB5654智能语音开发板测评] 语音识别开发板的比较

    随着语音识别技术的发展,带有语音识别处理功能的开发板也逐渐丰富起来,目前供用户进行测评的开发板
    发表于 03-09 08:11

    【新品发布】英飞凌PSoC 6 RTT物联网开发板内容详解

    4月12日,英飞凌联合 RT-Thread 发布PSoC™ 62 with CAPSENSE™ evaluation kit开发板 (以下简称PSoC
    发表于 04-13 13:46

    【资料下载】英飞凌PSoC 6 RTT物联网开发板

    Infineon Psoc6-evaluationkit-062S2 说明开发板免费试用活动:https://bbs.elecfans.com/jishu_2349212_1_1.html简介本文
    发表于 04-13 13:38

    【新品试用英飞凌PSoC 6 RTT开发板试用活动

    概述、软件调试、硬件接入、视频演示,不少于500字+2张图片。 2)报告形式:标题格式 【评测活动标题+自拟标题】示例: 【英飞凌PSoC 6 RTT
    发表于 04-13 15:26

    英飞凌PSoC 6 RTT开发板试用

    单周期乘法和MPU,可以充分发挥 PSoC6 双核芯片性能。 该开发板核心 板载资源 如下: MCU:CY8C624ABZI-S2D44,Cortex-M4主频 150MHz,Cortex-M0主频
    发表于 05-30 20:47

    英飞凌PSoC 6 RTT开发板试用】+开箱测试

    英飞凌PSoC 6 RTT开发板试用】+开箱测试 硬件资源介绍
    发表于 06-05 01:06

    【飞凌RZ/G2L开发板试用体验】飞凌RZ/G2L的开发板试用测评报告 — 视频采集开发

    开发板 试用测评报告 — 视频采集开发 大信(QQ:8125036)         在 电子 发烧友 论坛 上看到飞凌RZ/G2L的
    的头像 发表于 10-24 17:01 1430次阅读
    【飞凌RZ/G2L<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验】飞凌RZ/G2L的<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>测评报告<b class='flag-5'>二</b> — 视频<b class='flag-5'>采集</b><b class='flag-5'>开发</b>

    英飞凌联合 RT-Thread 发布 PSoC™ 62 with CAPSENSE ™ evaluation kit开发板

    近日,RT-Thread 社区团队打造了新品开发板英飞凌联合 RT-Thread 发布  PSoC 62 with CAPSENSE evaluation kit开发板 (以下简称
    的头像 发表于 04-13 01:35 1789次阅读

    基于PSOC6开发板构建的智能小车

    本项目是基于Psoc6-evaluationkit-062S2开发板构建的智能小车。该开发板由RT-Thread与英飞凌联合推出,集成了一颗32位双核CPU子系统,包括150MHz的A
    发表于 07-28 15:14 767次阅读
    基于<b class='flag-5'>PSOC6</b><b class='flag-5'>开发板</b>构建的智能小车

    英飞凌开发板模块评测任务大挑战-SPI驱动测试

    使用PSoC™ 62 with CAPSENSE™ evaluation kit开发板适配的RTT SPI驱动,做显示测试。
    发表于 08-10 15:44 675次阅读
    <b class='flag-5'>英飞凌</b><b class='flag-5'>开发板</b>模块评测任务大挑战-SPI驱动测试

    英飞凌测评】英飞凌PSoC™ 62开发板试用报告-LCD ILI9341 8080 DEMO

    # Infineon Psoc6-evaluationkit-062S2 说明 ## 简介 本文档为 `RT-Thread` 为 `PSoC6 CY8CKIT-062S2-43012` 开发板提供
    的头像 发表于 03-07 21:07 650次阅读
    【<b class='flag-5'>英飞凌</b>测评】<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b>™ 62<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>报告-LCD ILI9341 8080 DEMO

    玩转PSoC 6 RTT积木式开发套件,实现毫米波雷达等实用功能

    本期英飞凌手工课,将由来自英飞凌的工程师Jenson给大家带来PSoC62withCAPSENSEevaluationkit(下称PSoC6RTT
    的头像 发表于 03-20 08:35 855次阅读
    玩转<b class='flag-5'>PSoC</b> <b class='flag-5'>6</b> <b class='flag-5'>RTT</b>积木式<b class='flag-5'>开发</b>套件,实现毫米波雷达等实用功能