功率检测和语音功能

基于INA226模块的功率检测电路 1模块简介 INA226是一款分流/功率监视器,具有I2C™或SMBUS兼容接口。 该器件监视分流压降和总线电源电压。 可编程校准值、转换时间和取平均值功能与内部乘法器相结合,可实现电流值(单位为安培)和功率值(单位为瓦)的直接读取。最高失调电压为10μV,最大增益误差为0.1%。该器件是一款完整的16位单芯片解决方案,能够为数字I2C接口的电流、电压及电源提供全面可编程测量。 NA226可在0V至36V的共模总线电压范围内感测电流,与电源电压无关。该器件由一个2.7V至5.5V的单电源供电,电源电流. 阅读详情

INA226

INA226 High-Side or Low-Side Measurement, Bi-Directional Current and Power Monitor with I2C Compatible Interface datasheet (Rev. A)

INA226功率监测模块原理

7.5 编程 INA226 器件的一个重要方面是它不一定测量电流或功率。该器件可测量施加在 IN+ 和 IN- 输入引脚之间的差分电压以及施加于 VBUS 引脚的电压。为了使器件同时报告电流和功率值,用户必须对电流寄存器 (04h) 的分辨率和应用中存在的分流电阻器的值进行编程,以产生施加在输入引脚之间的差分电压。功率寄存器 (03h) 在内部设置为编程Current_LSB的 25 倍。Current_LSB 电阻和分流电阻器值均用于计算校准寄存器值,该器件用于根据测得的分流器和总线电压计算相应的电流和功率值。校准寄存器根据公式 1 计算。该公式包括项 Current_LSB,它是电流寄存器 (04h) 的 LSB 的编程值。用户使用该值将 Current Register (04h) 中的值转换为以安培为单位的实际电流。电流寄存器 (04h) 的最高分辨率可以通过使用基于最大预期电流的最小允许Current_LSB获得,如公式 2 所示。虽然此值产生最高分辨率,但通常为Current_LSB选择一个值,以简化电流寄存器 (04h) 和功率寄存器 (03h) 分别转换为安培和瓦特的过程。RSHUNT 项是用于在输入引脚上产生差分电压的外部分流器的值。

对校准寄存器进行编程后,电流寄存器 (04h) 和功率寄存器 (03h) 会根据相应的分流电压和总线电压测量值进行相应更新。在校准寄存器编程之前,电流寄存器 (04h) 和功率寄存器 (03h) 保持为零。7.5.1 对校准寄存器进行编程图 27 显示了一个标称 10 A 负载,该负载在 2 mΩ 分流电阻器上产生 20 mV 的差分电压。INA226 的总线电压在外部 VBUS 输入引脚处测量,在本例中,该引脚连接到 IN– 引脚以测量输送到负载的电压电平。在本例中,VBUS 引脚的测量值小于 12 V,因为 IN– 引脚上的电压为 11.98 V,这是分流电阻器两端压降的结果。在本例中,假设最大预期电流为 15 A,则使用公式 2 计算出Current_LSB为 457.7 μA/bit。使用 500 μA/Bit 或 1 mA/Bit 的Current_LSB值将显著简化从电流寄存器 (04h) 和功率寄存器 (03h) 到安培和瓦特的转换。在本例中,Current_LSB选择了 1 mA/bit 的值。将此值用于 Current_LSB 确实会以少量分辨率为代价,从而在用户端获得更简单的转换过程。在本例中,使用公式 1 将 Current_LSB 值为 1 mA/bit,分流电阻器设置为 2 mΩ,则校准寄存器值为 2560,即 A00h。然后通过将并联电压寄存器 (01h) 内容的十进制值乘以校准寄存器的十进制值,然后除以 2048 来计算电流寄存器 (04h),如公式 3 所示。在本例中,并联电压寄存器包含一个值 8,000(代表 20 mV),该值乘以校准寄存器值 2560,然后除以 2048,得到电流寄存器 (04h) 的十进制值 10000,即 2710h。将此值乘以 1 mA/位,得到示例中所示的原始 10 A 电平。

 

编程(续)总线电压寄存器 (02h) 的 LSB 是固定的 1.25 mV/bit,这意味着 VBUS 引脚上的 11.98 V 导致寄存器值为 2570h,或相当于 9584 的十进制值。请注意,总线电压寄存器 (02h) 的 MSB 始终为零,因为 VBUS 引脚只能测量正电压。然后,将电流寄存器的十进制值 10000 乘以总线电压寄存器 (02h) 的十进制值 9584,然后除以 20,000,如公式 4 中所定义,从而计算功率寄存器 (03h)。在本例中,Power Register (03h) 的结果是 12B8h,即 4792 的十进制等效值。将此结果乘以功率 LSB([1 × 10–3 Current_LSB] 的 25 倍),得到功率计算为 (4792 × 25 mW/bit),即 119.82 W。功率 LSB 与 25 的Current_LSB具有固定比率。在本例中,编程的 1 mA/位Current_LSB产生的功率 LSB 为 25 mW/bit。此比率在内部编程,以确保功率计算的缩放比例在可接受的范围内。手动计算输送到负载的功率时,将使用 11.98 V 的总线电压(12 VCM – 20 mV 分流压降)乘以 10 A 的负载电流,得出 119.8 W 的结果。

INA226模块原理图如下图所示。
在这里插入图片描述
官方手册的参考电路如下图所示。           


INA226是具有I2C™或SMBUS兼容接口的电流分流器和功率监控器。该设备同时监视并联电压降和总线电源电压。可编程的校准值,转换时间和平均值与内部乘法器结合使用,可以直接读取以安培为单位的电流和以瓦特为单位的功率。
INA226感应共模总线电压上的电流,该电压可在0 V至36 V之间变化,与电源电压无关。该器件采用2.7V至5.5V单电源供电,典型功耗为330 µA。该器件的额定工作温度范围为–40°C至125 \ xC2°C,并且在I 2 C兼容接口上具有多达16个可编程地址。
接线方式为:INPUT接电源正极,GND接电源负极,OUTPUT接用电器件(我没接)的电源正极输入口

相关寄存器和设备地址
首先,为了使用I2C读取模块数据,需要先通过传感器数据手册来确定从机地址和所需寄存器地址。

INA226模块一共有10个寄存器(0x0~0x7 还有两个设备ID不管)


根据原理图可知从机地址A1 A0 = 00,再参考官方技术文档可知模块设备地址为:0x40  
这是个7位的地址 stm32用i2c的时候地址填写的是1个byte,  
然后我们了解到i2c指定从机通信的时候7位地址后面还有1个读写位  
所以0x40左移一位等于0x80   (0x40<<1 == 0x80)  
所以stm32用i2c通信的时候,从机地址要写0x80  

#define INA226_ADDRESS 0x80 /*INA226的地址*/

重点关注的寄存器0x0 0x2 0x3 0x4 0x5
0x0

用于配置芯片的采样速度,采样模式,采样滤波周期等,默认值是0x4127
0x5
校准寄存器 看手册↓ 直接搜索找到计算方式
理解不了的可以看看下面示例代码中arduino是如何控制INA226模块的↓↓↓↓↓↓

// Calibrate INA226. Rshunt = 0.01 ohm, Max excepted current = 4A
//我买的ina226模块采样电阻型号r010是0.01欧姆 假如我们的电路预期最大电流是4安培
//计算公式:
//Current_LSB = 预期最大电流4A / 2^15 = 0.0001220703125
//CAL = 0.00512/(Current_LSBR)=0.00512/0.0001220703125=42=0x2A 
//当然如果你想让单片机自己算直接移植下面的函数到你的工程里就行
bool INA226::calibrate(float rShuntValue, float iMaxExpected)
{
    uint16_t calibrationValue;
    rShunt = rShuntValue;

    float iMaxPossible, minimumLSB;

    iMaxPossible = vShuntMax / rShunt;

    minimumLSB = iMaxExpected / 32767;

    currentLSB = (uint16_t)(minimumLSB * 100000000);
    currentLSB /= 100000000;
    currentLSB /= 0.0001;
    currentLSB = ceil(currentLSB);
    currentLSB *= 0.0001;

    powerLSB = currentLSB * 25;

    calibrationValue = (uint16_t)((0.00512) / (currentLSB * rShunt));

    writeRegister16(INA226_REG_CALIBRATION, calibrationValue);

    return true;
}


c驱动源文件

#include "i2c.h"

uint8_t INA226_SetConfig(uint16_t ConfigWord);
uint8_t INA226_SetCalibrationReg(uint16_t ConfigWord);

uint16_t INA226_GetBusVReg(void);
uint16_t INA226_GetPowerReg(void);
uint16_t INA226_GetCurrentReg(void);

#define INA226_COM_PORT    hi2c1        /*通讯使用的IIC接口*/

#define INA226_ADDRESS         0x80    /*INA226的地址*/
#define INA226_I2C_TIMEOUT     10        /*IIC通讯超时*/

#define INA226_CALIB_VAL 1024
#define INA226_CURRENTLSB 0.5F // mA/bit
#define INA226_CURRENTLSB_INV 1/INA226_CURRENTLSB // bit/mA
#define INA226_POWERLSB_INV 1/(INA226_CURRENTLSB*25) // bit/mW

#define INA226_CONFIG     0x00 // Configuration Register (R/W)初始值4127
#define INA226_SHUNTV     0x01 // Shunt Voltage (R)初始值0,分流电压测量值
#define INA226_BUSV     0x02 // Bus Voltage (R)初始值0,总线电压测量值
#define INA226_POWER     0x03 // Power (R)初始值0,输出功率测量值
#define INA226_CURRENT     0x04 // Current (R)初始值0,分流电阻电流计算值
#define INA226_CALIB     0x05 // Calibration (R/W),设置全量程和电流LSB
#define INA226_MASK     0x06 // Mask/Enable (R/W),报警设置和转换准备标志
#define INA226_ALERTL     0x07 // Alert Limit (R/W),报警阈值
#define INA226_MANUF_ID 0xFE // Manufacturer ID (R),0x5449
#define INA226_DIE_ID     0xFF // Die ID (R),0x2260

#define INA226_MODE_POWER_DOWN             (0<<0) // Power-Down
#define INA226_MODE_TRIG_SHUNT_VOLTAGE     (1<<0) // Shunt Voltage, Triggered
#define INA226_MODE_TRIG_BUS_VOLTAGE     (2<<0) // Bus Voltage, Triggered
#define INA226_MODE_TRIG_SHUNT_AND_BUS     (3<<0) // Shunt and Bus, Triggered
#define INA226_MODE_POWER_DOWN2         (4<<0) // Power-Down
#define INA226_MODE_CONT_SHUNT_VOLTAGE     (5<<0) // Shunt Voltage, Continuous
#define INA226_MODE_CONT_BUS_VOLTAGE     (6<<0) // Bus Voltage, Continuous
#define INA226_MODE_CONT_SHUNT_AND_BUS     (7<<0) // Shunt and Bus, Continuous

// Shunt Voltage Conversion Time
#define INA226_VSH_140uS     (0<<3)
#define INA226_VSH_204uS     (1<<3)
#define INA226_VSH_332uS     (2<<3)
#define INA226_VSH_588uS     (3<<3)
#define INA226_VSH_1100uS     (4<<3)
#define INA226_VSH_2116uS     (5<<3)
#define INA226_VSH_4156uS     (6<<3)
#define INA226_VSH_8244uS     (7<<3)

// Bus Voltage Conversion Time (VBUS CT Bit Settings[6-8])
#define INA226_VBUS_140uS     (0<<6)
#define INA226_VBUS_204uS     (1<<6)
#define INA226_VBUS_332uS     (2<<6)
#define INA226_VBUS_588uS     (3<<6)
#define INA226_VBUS_1100uS     (4<<6)
#define INA226_VBUS_2116uS     (5<<6)
#define INA226_VBUS_4156uS     (6<<6)
#define INA226_VBUS_8244uS     (7<<6)

// Averaging Mode (AVG Bit Settings[9-11])
#define INA226_AVG_1     (0<<9)
#define INA226_AVG_4     (1<<9)
#define INA226_AVG_16     (2<<9)
#define INA226_AVG_64     (3<<9)
#define INA226_AVG_128     (4<<9)
#define INA226_AVG_256     (5<<9)
#define INA226_AVG_512     (6<<9)
#define INA226_AVG_1024 (7<<9)

// Reset Bit (RST bit [15])
#define INA226_RESET_ACTIVE     (1<<15)
#define INA226_RESET_INACTIVE     (0<<15)

// Mask/Enable Register
#define INA226_MER_SOL     (1<<15) // Shunt Voltage Over-Voltage
#define INA226_MER_SUL     (1<<14) // Shunt Voltage Under-Voltage
#define INA226_MER_BOL     (1<<13) // Bus Voltagee Over-Voltage
#define INA226_MER_BUL     (1<<12) // Bus Voltage Under-Voltage
#define INA226_MER_POL     (1<<11) // Power Over-Limit
#define INA226_MER_CNVR (1<<10) // Conversion Ready
#define INA226_MER_AFF     (1<<4) // Alert Function Flag
#define INA226_MER_CVRF (1<<3) // Conversion Ready Flag
#define INA226_MER_OVF     (1<<2) // Math Overflow Flag
#define INA226_MER_APOL (1<<1) // Alert Polarity Bit
#define INA226_MER_LEN     (1<<0) // Alert Latch Enable

#define INA226_MANUF_ID_DEFAULT     0x5449
#define INA226_DIE_ID_DEFAULT         0x2260


void INA226_init(void)
{
    /*
    * 设置转换时间8.244ms,求平均值次数16,设置模式为分流和总线连续模式
    * 总数据转换时间 = 8.244*16 = 131.9ms
    */
    INA226_SetConfig(0x45FF);

    /*
    * 分流电阻最大电压 = 32768 * 0.0000025V = 0.08192V
    * 设置分流电压转电流转换参数:电阻0.01R,分辨率0.2mA
    * 公式1
    * Current_LSB = 预期最大电流 / 2^15
    * Current_LSB = 5 / 32768 = 0.000152A ,选0.2ma
    * 公式2
    * CAL = 0.00512/(Current_LSB*R)
    * CAL = 0.00512/(0.0002*0.01)=2560 = 0x0a00
    */
    INA226_SetCalibrationReg(0x0a00);

}
/*
**************************************************
* 说明:读取BUS电压,并转换为浮点数据
**************************************************
*/
float INA226_GetBusV(void)
{
    uint16_t regData;
    float fVoltage;
    regData = INA226_GetBusVReg();
    fVoltage = regData * 0.00125f;/*电压的LSB = 1.25mV*/
    return fVoltage;
}
/*
**************************************************
* 说明:读取电流,并转换为浮点数据
**************************************************
*/
float INA226_GetCurrent()
{
    uint16_t regData;
    float fCurrent;
    regData = INA226_GetCurrentReg();
    if(regData >= 0x8000)    regData = 0;
    fCurrent = regData * 0.0002f;/*电流的LSB = 0.2mA,由用户配置*/
    return fCurrent;
}
/*
**************************************************
* 说明:读取功率,并转换为浮点数据
**************************************************
*/
float INA226_GetPower()
{
    uint16_t regData;
    float fPower;
    regData = INA226_GetPowerReg();
    fPower = regData * 0.005f;/*功率的LSB = 电流的LSB*25*/
    return fPower;
}

uint8_t INA226_SetConfig(uint16_t ConfigWord)
{
    uint8_t SentTable[3];
    SentTable[0] = INA226_CONFIG;
    SentTable[1] = (ConfigWord & 0xFF00) >> 8;
    SentTable[2] = (ConfigWord & 0x00FF);
    return HAL_I2C_Master_Transmit(&INA226_COM_PORT, INA226_ADDRESS, SentTable, 3, INA226_I2C_TIMEOUT);
}

// uint16_t INA226_GetConfig()
// {
//     uint8_t SentTable[1] = {INA226_CONFIG};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

// uint16_t INA226_GetShuntV()
// {
//     uint8_t SentTable[1] = {INA226_SHUNTV};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

uint16_t INA226_GetBusVReg()
{
    uint8_t SentTable[1] = {INA226_BUSV};
    uint8_t ReceivedTable[2];
    HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
    if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
    else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
}

uint8_t INA226_SetCalibrationReg(uint16_t ConfigWord)
{
    uint8_t SentTable[3];
    SentTable[0] = INA226_CALIB;
    SentTable[1] = (ConfigWord & 0xFF00) >> 8;
    SentTable[2] = (ConfigWord & 0x00FF);
    return HAL_I2C_Master_Transmit(&INA226_COM_PORT, INA226_ADDRESS, SentTable, 3, INA226_I2C_TIMEOUT);
}

// uint16_t INA226_GetCalibrationReg()
// {
//     uint8_t SentTable[1] = {INA226_CALIB};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

uint16_t INA226_GetPowerReg()
{
    uint8_t SentTable[1] = {INA226_POWER};
    uint8_t ReceivedTable[2];
    HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
    if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
    else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
}

uint16_t INA226_GetCurrentReg()
{
    uint8_t SentTable[1] = {INA226_CURRENT};
    uint8_t ReceivedTable[2];
    HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
    if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
    else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
}

// uint16_t INA226_GetManufID()
// {
//     uint8_t SentTable[1] = {INA226_MANUF_ID};
//     uint8_t ReceivedTable[2];

//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

// uint16_t INA226_GetDieID()
// {
//     uint8_t SentTable[1] = {INA226_DIE_ID};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

// uint8_t INA226_SetMaskEnable(uint16_t ConfigWord)
// {
//     uint8_t SentTable[3];
//     SentTable[0] = INA226_MASK;
//     SentTable[1] = (ConfigWord & 0xFF00) >> 8;
//     SentTable[2] = (ConfigWord & 0x00FF);
//     return HAL_I2C_Master_Transmit(&INA226_COM_PORT, INA226_ADDRESS, SentTable, 3, INA226_I2C_TIMEOUT);
// }

// uint16_t INA226_GetMaskEnable()
// {
//     uint8_t SentTable[1] = {INA226_MASK};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }

// uint8_t INA226_SetAlertLimit(uint16_t ConfigWord)
// {
//     uint8_t SentTable[3];
//     SentTable[0] = INA226_ALERTL;
//     SentTable[1] = (ConfigWord & 0xFF00) >> 8;
//     SentTable[2] = (ConfigWord & 0x00FF);
//     return HAL_I2C_Master_Transmit(&INA226_COM_PORT, INA226_ADDRESS, SentTable, 3, INA226_I2C_TIMEOUT);
// }

// uint16_t INA226_GetAlertLimit()
// {
//     uint8_t SentTable[1] = {INA226_ALERTL};
//     uint8_t ReceivedTable[2];
//     HAL_I2C_Master_Transmit(&INA226_COM_PORT,INA226_ADDRESS, SentTable, 1, INA226_I2C_TIMEOUT);
//     if (HAL_I2C_Master_Receive(&INA226_COM_PORT,INA226_ADDRESS, ReceivedTable, 2, INA226_I2C_TIMEOUT) != HAL_OK) return 0xFF;
//     else return ((uint16_t)ReceivedTable[0]<<8 | ReceivedTable[1]);
// }


5 上主函数伪代码
main.c伪代码

int main(void)
{
  while (1)
  {
    batteryVolt  = INA226_GetBusV();//锂电池电压
    //单节18650电池
        if(batteryVolt>4.15)    //电压值对比
        {BatCap = 0.99;}//容量
        else if(batteryVolt<3.4)
        {BatCap =0;}
        else
        {BatCap = (batteryVolt-3.4)/(4.15-3.4);}//正常情况下计算比例 

        if(BatCap<0.45)
    {}//没电啦
        printf("B:%3.1fv Q:%02d%% ",batteryVolt,(int)(BatCap*100));        //打印
  }
}

我看到一款MP3芯片,N9200芯片 ,是N-EC的,flash自带盘符功能,直接拷贝MP3进flash,同时支持TF卡,U盘,可以同时支持UART,ADKEY,IO口控制,音质的话也好很多,成本差不多,

以下是完整原理图

WT588D

搬运自:教你一步步使用语音芯片WT588D - 立创社区 (szlcsc.com)

一 芯片概述

    WT588D是一款高品质语音控制芯片,通过外挂存储器(SPI Flash、SD卡、U盘),将编译好的语音工程烧写到存储器中,即可控制语音的播放。

    具有控制灵活、开发简单等特点,广泛应用于各种有语音播放和人机交互的工业场合。如发卡器、自动售货机、加油机等……

    商城有售:http://www.szlcsc.com/product/details_88676.html

  •    工作电压 DC2.8V~5.5V,静态休眠电流小于 10uA;
  •    根据外挂SPI-Flash 的不同,播放时长也不同,支持 2M~32Mbit的SPI-Flash 存储器;
  •    内置 13Bit/DA 转换器,以及 12Bit/PWM 输出,音质好;
  •    支持 DAC/PWM 两种输出方式,PWM 输出可直接推动 0.5W/8Ω扬声器,推挽电流充沛;
  •    支持加载 WAV 音频格式,支持加载 6K~22KHz 采样率音频;
  •    可通过专业上位机操作软件,随意组合语音,可插入静音(插入的静音不占用内存的容量);
  •    220 段可控制地址位,单个地址位最多可加载 128 段语音,地址位内的语音组合播放;

二 系统应用图

1、WT588D语音电路图,推荐使用3线或1线制串口。

小喇叭0.5W 8R的,可以直接用这个:


WT588D 语音芯片及模块应用电路-优快云博客

大喇叭请使用运放或者三极管放大:


 

2、功放电路推荐使用SC8002B,便宜又大碗。所需外围元件少且在 2.0V~5.0V输入电压下即可工作,商城有售。当然也可使用LM386、TDA2822、PAM8403等常用功放IC。

三 语音文件制作

1、人工录音,自己用麦克风录制或找专业人员帮忙录制;

2、使用语音合成软件,输入文本自动生成wav语音文件。

推荐使用科大讯飞语音合成系统5.0 

3、语音文件编辑,例如要添加背景音乐,或将MP3格式文件转化为wav格式等

推荐使用GoldWave (音频编辑工具) 5.70 绿色版

四 语音工程编译与下载

1、语音工程创建与编译,详细步骤与说明WT588D VoiceChip 使用说明书。

2、 语音工程下载,将编译好的bin文件烧写到存储器中。

(1)使用官方推荐使用的WT550U2烧写器

(2)使用SPI FLASH烧录器,某宝上一搜一大把,类似以下图片:

五、程序设计

1、三线串口制控制程序

2、 一线串口制控制程序

INA226使用之程序与模块测试-优快云博客

原文链接:https://blog.youkuaiyun.com/weixin_50257954/article/details/133635534

ld3320语音识别模块工作原理_变频空调功率模块工作原理与故障检测 一、功率模块原理与外形功率模块是变频空调器电控系统中较重要的器件之一,也是故障率较高的一个器件。功率模块将IGBT连同驱动电路和多种保护电路封装在同一模块内,从而简化了设计,提高了稳定性。功率模块只有固定在外围电路的控制基板上,才能组成模块板组件。功率模块可以简单地看作电压转换器。室外机主板CPU输出6路信号,经功率模块内部驱动电路放大后控制IGBT幵关管的导通与截止,将直流300V电压转换成与频... 阅读详情

相关推荐

基于单片机的电动汽车小功率交流充电桩设计【毕业设计】

围绕本次课题,调研了充电桩的发展现状。介绍了欧美以及日本等新能源汽车发展比较先进的国家的现状。随着充电桩的普及,消费者和充电运营者对充电桩的要求也越来越高,还有就是在快节奏生活这大背景下,对于消费者来说追求操作简单,方便快捷省时省力,更智能,性价比高的产品,计算更准确的系统;运营者则希望电流、电压检测更加准确稳定,安全系数更高,低功耗,产品投资低风险小的设计。

qq_48771816的博客 2615

关于INA226测电流、电路图

用IIC总线来读INA226传感器中分压电流寄存器的值。其中涉及到一个校准寄存器的赋值cal,这个值和pin9(IN-)、pin10(IN+)之间的分压电阻有关。手册中cal的计算方法如下:   Maximum Expected Current是pin9、pin10之间可能测到的最大电流,除以2的15次方后得到的Current_LSB直观来看就是电流精度——15位对应15个梯度。Rshunt是外部分流器——两引脚间电阻的值   这次的开发板上INA226部分的电路图如下:   一开始我只看到了pin9、

weixin_43067198的博客 1万+

电路图+电源采样电路(INA226)+RS485收发器+防反接电路+12V降压3.3V电路+3.3V升压5V电路

电路图+电源采样电路(INA226)+RS485收发器+防反接电路+12V降压3.3V电路+3.3V升压5V电路

INA226使用之程序与模块测试

笔者最近有个项目需要测量电流参数,于是买来INA226模块测试一下。 文章目录应用电路程序设计模块测试 应用电路 首先测试的INA226模块如下图所示。 INA226模块原理图如下图所示。 官方手册的参考电路如下图所示。 结合上述图片以及数据手册,可知使用INA226模块时,与单片机的接线方式如下。 INA226模块 单片机 VCC 3.3V或5V GND GND SCL PB6 SDA PB7 VBS 电路总线电压 INA+ 电流流入端 INA- 电流流出端

学无止境 7万+

INA226测试程序参考

开发环境:platformio,开发板ESP8266

INA226电流检测的代码

INA226电流检测的代码,用到ADC转换,并通过串口打印数据到PC端。

利用ESP32可以实现哪些有趣的功能?

家庭电路控制系统 这个计划在大半年前就试着做过,当时用的是机智云的平台。因为当时设计有些不足加上主控资源有限并不是多么满意。后来发现了esp32,性能强劲,又有了这个活动就想要再把之前的计划完善完善,加些新元素。 1:外接多路继电器分别控制不同电器,另留一路大功率继电器作为总电源。各路继电器可以通过手机客户端、web、板载按键或者语音控制; 2:加入键盘模块,或者五向按键进行一些本地设置或无网络时应急控制接口; 3:通过驱动步进电机控制窗帘,窗户开关状态,控制方式同继电器; 4:通过可燃气体传感器

qq_35656655的博客 9894

U8+ 新建账套

一、登录 账套主管:demo 对账套有修改权限,有账套库权限 系统管理员:admin 其他所有权限 二、新建账套 admin登录–>点击系统管理–>账套–>建立 选择了参照已有账套结转期初:就是上一个的期末数据作为这一次新表的期初数据 启用会计期一旦选择更改不了。 ...

茶茶很困i 3693

天外客AI翻译机支持语音唤醒灵敏度分级调节的设计

本文深入解析天外客AI翻译机如何通过语音唤醒灵敏度分级调节,结合环境噪声检测与用户需求,在低功耗下实现精准唤醒。从决策阈值设计到软硬协同架构,展现边缘AI在真实场景中的智能平衡。

weixin_42515340的博客 461

小红书UID泄露风险揭秘:如何防止你的手机号被社工库关联(附防护指南)

本文揭示了小红书UID泄露的严重风险,详细解析了UID与手机号关联后被社工库利用的完整链条。通过分析黑产的数据整合技术,提供从基础到进阶的防护策略,包括密码管理、账号隔离和应急响应措施,帮助用户有效防范个人信息泄露风险。

ol789012345的博客 1501

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 294

AI 蓝牙耳机电池智能功率 MOSFET 完整选型方案

微碧半导体(VBsemi)基于 Trench 工艺,为您提供覆盖电池保护、充放电开关、信号控制的完整 AI 蓝牙耳机功率解决方案。

xdfc007的博客 108

Bartender 2021破解版安装教程:手把手教你从下载到激活(附详细步骤图)

本文详细介绍了BarTender 2021专业版的安装与高效应用指南,从基础配置到高级条码设计,帮助用户快速掌握标签设计与打印技术。内容涵盖安装步骤、标签模板创建、数据连接与批量打印技巧,以及高级功能如安全策略与自动化集成,适合零售、物流、制造等行业用户提升工作效率。

p4q5r6s7t的博客 2611

GIT安装图解:小白也能看懂的详细指南

分步骤动画演示是通过Vue的过渡动画实现的,每个安装步骤都拆解成独立组件。实时错误检测功能利用了Node.js的子进程模块,可以模拟执行Git命令并捕获可能的错误。作为一个曾经被Git安装折磨过的过来人,我深知新手在初次接触版本控制工具时的困惑。我实际使用后发现它的编辑器响应速度很快,部署流程也特别顺畅,完全不需要额外的运维知识。比如检测到用户使用的是Mac系统,就会自动切换到对应的安装指引。经过实际测试,使用这个工具的新手用户Git安装成功率从原来的60%提升到了95%以上。开发中的难点与解决方案。

EmeraldEagle36的博客 544

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

损失函数大汇总(四十五)(clDice Loss附公式推导与代码)

clDice Loss是一种针对细长结构分割任务的拓扑保持损失函数,通过比较预测区域和真实区域的中心线重叠情况来评估分割质量。与传统Dice Loss关注区域重叠不同,clDice Loss重点考察连通性和骨架拓扑结构,能有效避免血管断裂、分支错误连接等问题。该损失函数包含两个核心指标:预测骨架在真实区域中的覆盖比例(Topology Precision)和真实骨架被预测区域覆盖的比例(Topology Sensitivity),通过调和平均得到最终评估值。由于传统骨架提取算法不可导,实际实现采用可微的so

悦学共鸣,温柔以待,汇聚光芒,共同成长 450

INA226功率监控支持电费估算语音提示功能

本文介绍如何使用INA226电流传感器与ESP32构建智能用电监控系统,实时采集电压、电流、功率数据,通过积分计算电能消耗并估算电费,结合语音播报功能实现用电成本的可听化提醒,帮助用户识别待机功耗、节约用电。

weixin_32047493的博客 532

Android 人像分割实战:OpenCV+YOLOv8+NCNN 三库联动(附 GPU 加速 / 内存优化全方案)

本文详细介绍了在Android项目中集成OpenCV+YOLOv8+NCNN实现实时人像分割的技术方案。主要内容包括:项目环境搭建(配置NDK、添加Native模块)、核心库文件集成(OpenCV、NCNN、YOLOv8模型)、JNI接口设计与实现(Kotlin层调用C++算法)。通过Camera API获取图像数据,使用YOLOv8进行人体检测,结合NCNN高性能推理框架实现人像分割处理,最终将原始画面与分割结果(背景透明)同时显示在Android界面上。该项目采用多技术栈协同工作,OpenCV负责图像处

FJN110的博客 232

AudioSeal效果展示:100+段AI语音样本的水印嵌入成功率统计图表

本文介绍了如何在星图GPU平台上自动化部署AudioSeal音频水印系统,实现AI生成语音的版权保护功能。该镜像支持高精度水印嵌入与检测,可应用于新闻播报、有声书等音频内容的版权溯源,保持原始音质的同时提供98%以上的嵌入成功率。

weixin_30598047的博客 547

【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用(图文记录详细步骤)

【详解】【PostgreSQL】Windows11下的PostgreSQL数据库安装tds_fdw扩展及使用

tttzzzqqq2018的博客 2451

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

语音信号处理、语音特征提取

语音信号是一种短时平稳信号, 即时变的,十分复杂,携带很多有用 的信息,这些信息包括语义、个人特 征等,其特征参数的准确性和唯一性 将直接影响语音识别率的高低,并且 这也是语音识别的基础。 语音信号特征参数是分帧提取的, 每帧特征参数一般构成一个矢量, 所以语音信号特征是一个矢量序列。 语音信号特征提取的基础是分帧, 将语音信号切成一帧一帧,每帧大 小大约是20-30ms。 特征参数应该能够比较 准确地表达语音信号的 特征具有一定的唯一性 端点检测:一段语音信号中准确地找出 语音信号的起始点和结束点 目的.

qq_43543515的博客 6394

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MAX30102心率血氧检测实现小智AI健康语音提醒功能

本文介绍如何利用MAX30102传感器与本地AI语音助手‘小智’构建离线心率血氧监测系统,实现无需联网的实时健康提醒。涵盖PPG原理、信号处理、低功耗设计及ESP32上的多任务调度,突出隐私安全与闭环干预优势。

weixin_36483050的博客 503

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

INA226功率监测与语音播报系统集成指南

本文详细介绍了如何将INA226高精度功率检测模块与WT588D语音芯片集成,构建一套实时功率监测与语音播报系统。内容涵盖硬件设计、软件编程、协议整合及功率超限语音警报实现,为电池供电设备和工业能源管理提供完整的解决方案。

butter的博客 67

常见电器待机功率

各电器所参考来源数据的待机功率因不同品牌个体差异巨大、且不同年份和技术的产品差异巨大,故此处汇总为常见的评测结果范围,仅供对比参考。另外,对于小功率的测定,一般测量工具本身就可能引入很大误差,故专业评测结果数据更少,实际可信精度大约也就在0.5瓦左右。

生活在别处 4645

ld3320语音识别模块工作原理_变频空调功率模块工作原理与故障检测。

一、功率模块原理与外形功率模块是变频空调器电控系统中较重要的器件之一,也是故障率较高的一个器件。功率模块将IGBT连同驱动电路和多种保护电路封装在同一模块内,从而简化了设计,提高了稳定性。功率模块只有固定在外围电路的控制基板上,才能组成模块板组件。功率模块可以简单地看作电压转换器。室外机主板CPU输出6路信号,经功率模块内部驱动电路放大后控制IGBT幵关管的导通与截止,将直流300V电压...

weixin_42471823的博客 2663

WT2003H语音芯片MCU下载方案助力电动车智能化升级:实现多功能语音提示+报警功能

随着科技的发展,电瓶车在技术革新上也在不断进步,如今许多厂家,都会加入语音提示功能,能在倒车、喇叭、故障时发出语音报警,提示骑行者电量不足、倒车请注意、故障语音提示等;唯创知音专注于高品质、智能化、安全可靠的代步产品语音研发和生产,打造轻松的出行方式。

Waytronic_的博客 1077
上一篇: 充电管理芯片
下一篇: Godot Android配置
python_use
博客等级 码龄5年 430粉丝 38原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值