中科蓝讯蓝牙: 530X_532X 等音量系统调节

目录

0. 如果没有声音, 可以打印查看 "数字音量" 和 "模拟音量" 是否正常

1. 530X, 532X 常用音量控制模块图

2. EQ模块前级增益 (有用到EQ才有效, 默认EQ或不启用EQ时,此增益为0DB)

3.  数字音量, 可打印DACVOLCON 低16位查看.

4.  模拟音量: 可打印AUANGCON3 低8位查看. (模拟音量表见后面)  

 5. 程序中对音量的总设置函数: bsp_change_volume(bsp_dac.c中). 

6. 如果音量还小, 还可以留意VDDDAC电源配置电压是否正常

7. 模拟音量对应表


0. 如果没有声音, 可以打印查看 "数字音量" 和 "模拟音量" 是否正常

调试过程中, 经常会遇到没有声音的情况, 可以直接打印一下"数字音量"和模拟音量.

 建议在公共处理函数 func_process中增加如下printf_info打印, 1秒打印一次, 查看数字音量和模拟音量是否正常.

 如果数字音量或模拟音量均是最小, 可以尝试调用dac_fade_in函数淡入声音(此函数会自动淡入数字音量和模拟音量).

//530X,532X,536X,889X等都是这两个寄存器
#define AUANGCON3       SFR_RW (SFR1_BASE + 0x3f*4)  //模拟音量,音量值查看其低7位, 对应增益见本文末尾模拟音量表
#define DACVOLCON       SFR_RW (SFR1_BASE + 0x11*4)  //数字音量,音量值查看其低16位, 最大值0x7FFF (0DB)

AT(.text.func.bt)
void printf_info(void)
{
    static u32 ticks = 0;
    if (tick_check_expire(ticks,1000)) {   //1000ms打印一次
        ticks = tick_get();
        printf("--------------->\nDACVOLCON = 0x%X , AUANGCON3 = 0x%X\n", DACVOLCON&0xFFFF,AUANGCON3&0x7F);
    }
}

AT(.text.func.process)
void func_process(void)
{
    WDT_CLR();
    printf_info();
 ......
} 

1. 530X, 532X 等常用音量控制模块图

530X/532X声音输出最大值可达到2.8V不失真(峰峰值,常规串电容双声道输出)

2. EQ模块前级增益 (有用到EQ才有效, 默认EQ或不启用EQ时,此增益为0DB)

   在配置工具Equalizer中, 可以设置EQ前级增益, 范围(-24~+12)DB

   当音量小时, 可以提高此增益. 

   曾经遇到有台样机, 音量怎么也调不上去, 最后发现是生成的EQ文件, 前级增益配置太小了.

    

3.  数字音量, 可打印DACVOLCON 低16位查看.

   最大值为0x7FFF (对应0DB)    //寄存器为  #define DACVOLCON       SFR_RW (SFR1_BASE + 0x11*4)

   程序中是调用dac_set_dvol 函数进行设置数字音量,参数范围(0~0x7FFF)

4.  模拟音量: 可打印AUANGCON3 低8位查看. (模拟音量表见后面)  

   最大值为0x70, 对应+5DB

   寄存器为#define AUANGCON3       SFR_RW (SFR1_BASE + 0x3f*4)

   程序中是调用 dac_set_volume 设置模拟音量, 参数范围(0~59) 分别对应(-54~+5)DB增益

 5. 程序中对音量的总设置函数: bsp_change_volume(bsp_dac.c中). 

      在这个函数中, 可以看到, 按键调音量, 一般有两种做法:

     1) 固定数字音量,  调音量时只调模拟音量.  (SDK默认使用这种做法)

     2) 固定模拟音量, 调音量只调数字音量.(需要打开宏 SYS_ADJ_DIGVOL_EN)

AT(.text.bsp.dac)
void bsp_change_volume(u8 vol)
{
#if !SYS_ADJ_DIGVOL_EN
    ///sys adjust dac analog volume
    u8 anl_vol = 0;
    if (vol <= VOL_MAX) {
        if (vol > 0) {
            anl_vol = dac_avol_table[vol] + sys_cb.anl_gain_offset;
        }
        dac_set_volume(anl_vol);
    }
#else
    ///sys adjust dac digital volume
    u16 dig_vol = 0;
    if (vol <= VOL_MAX) {
        dig_vol = dac_dvol_table[vol];
        dac_set_dvol(dig_vol);
    }
#endif
}

6. 如果音量还小, 还可以留意VDDDAC电源配置电压是否正常

vdddac是dac使用的电源, dac输出的峰峰值不会超过电源的幅度.(电源配置成最大3.2时, dac输出峰峰值只能达到最大2.8V不失真)

这里的DAC最大音量和通话最大音量, 最后更改的均是模拟音量.

7. 模拟音量对应表

模拟音量表( AUANGCON3低 7位)  其中N代表负增益, P代表正增益.

#define N_54DB       0x0F        //000 1111

#define N_53DB       0x1F        //001 1111

#define N_52DB       0x2F        //010 1111

#define N_51DB       0x3F        //011 1111

#define N_50DB       0x4F        //100 1111

#define N_49DB       0x5F        //101 1111

#define N_48DB       0x0E        //000 1110

#define N_47DB       0x1E        //001 1110

#define N_46DB       0x2E        //010 1110

#define N_45DB       0x3E        //011 1110

#define N_44DB       0x4E        //100 1110

#define N_43DB       0x5E        //101 1110

#define N_42DB       0x0D        //000 1101

#define N_41DB       0x1D        //001 1101

#define N_40DB       0x2D        //010 1101

#define N_39DB       0x3D        //011 1101

#define N_38DB       0x4D        //100 1101

#define N_37DB       0x5D        //101 1101

#define N_36DB       0x0C        //000 1100

#define N_35DB       0x1C        //001 1100

#define N_34DB       0x2C        //010 1100

#define N_33DB       0x3C        //011 1100

#define N_32DB       0x4C        //100 1100

#define N_31DB       0x5C        //101 1100

#define N_30DB       0x0B        //000 1011

#define N_29DB       0x1B        //001 1011

#define N_28DB       0x2B        //010 1011

#define N_27DB       0x3B        //011 1011

#define N_26DB       0x4B        //100 1011

#define N_25DB       0x5B        //101 1011

#define N_24DB       0x0A        //000 1010

#define N_23DB       0x1A        //001 1010

#define N_22DB       0x2A        //010 1010

#define N_21DB       0x3A        //011 1010

#define N_20DB       0x4A        //100 1010

#define N_19DB       0x5A        //101 1010

#define N_18DB       0x09        //000 1001

#define N_17DB       0x19        //001 1001

#define N_16DB       0x29        //010 1001

#define N_15DB       0x39        //011 1001

#define N_14DB       0x49        //100 1001

#define N_13DB       0x59        //101 1001

#define N_12DB       0x08        //000 1000

#define N_11DB       0x18        //001 1000

#define N_10DB       0x28        //010 1000

#define N_9DB        0x07        //000 0111

#define N_8DB        0x06        //000 0110

#define N_7DB        0x05        //000 0101

#define N_6DB        0x04        //000 0100

#define N_5DB        0x03        //000 0011

#define N_4DB        0x02        //000 0010

#define N_3DB        0x01        //000 0001

#define N_2DB        0x00        //000 0000

#define N_1DB        0x10        //001 0000

#define N_0DB        0x20        //010 0000

#define P_1DB        0x30        //011 0000

#define P_2DB        0x40        //100 0000

#define P_3DB        0x50        //101 0000

#define P_4DB        0x60        //110 0000

#define P_5DB        0x70        //111 0000  

本章完结, thanks.

  • 8
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值