功率检测和语音功能

news2024/10/11 22:43:02

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 语音芯片及模块应用电路-CSDN博客

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


 

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使用之程序与模块测试-CSDN博客

原文链接:https://blog.csdn.net/weixin_50257954/article/details/133635534

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构重点学习笔记教程——入门必看 数据结构心得

数据结构教程知识点 章节目录 一、数据结构概述二、线性表三、栈与队列四、数组与字符串五、树与二叉树六、图七、排序算法八、查找算法九、哈希表与散列法十、高级数据结构 总结简介 本数据结构教程知识点涵盖了从数据结构概述到高级数据结构的全方位内容&#xff0c;旨在帮…

河南省学籍管理员在校拍照采集学生证件照流程介绍

校园证件照采集是校园管理中一个重要的环节&#xff0c;它涉及为学生、教职工等校园成员拍摄并处理符合特定要求的证件照片。以下是针对河南省中小学生学籍照片集中拍摄采集的步骤指南&#xff0c;用于指导学籍管理员开展相关工作。 一、学籍照片采集的前期准备 &#xff08;1…

Java读取Excel文件_详细可执行_低内存占用

EasyExcel介绍&#xff1a;高效内存友好Java Excel处理工具&#xff0c;轻松应对大文件 EasyExcel是一个基于Java的、快速且简洁的Excel处理工具&#xff0c;专为解决大文件内存溢出问题设计。与传统的Excel处理框架如Apache POI和jxl相比&#xff0c;它显著降低了内存消耗。例…

linuxC高级_day5(完结)

目录 指针函数 1.概念 2.定义格式 3.函数内开辟空间 函数指针 1.概念 2.定义格式 2.1 格式 3.函数指针数组 3.1 概念 3.2 格式 3.3 赋值 条件编译 1.根据宏是否定义 根据宏值 3.防止头文件重复包含 指针函数 1.概念 本质是函数&#xff0c;函数返回值是指针。类…

C++系统教程004-数据类型(03)

一 .变量 变量是指在程序运行期间其值可以发生改变的量。每个变量都必须有一个名称作为唯一的标识&#xff0c;且具有一个特定的数据类型。变量使用之前&#xff0c;一定要先进行声明或定义。 1.变量的声明和定义 C中&#xff0c;变量声明是指为变量提供一个名称&#xff0c…

鸢尾花书实践和知识记录[6-23数据聚类]

文章目录 思维导图数据聚类和引例基于图论的聚类算法算法流程1构造数据构造距离矩阵相似度相似度矩阵创建图 拉普拉斯矩阵标准拉普拉斯矩阵(Combinatorial Laplacian)归一化拉普拉斯矩阵 (Normalized Laplacian)无标度拉普拉斯矩阵 (Signless Laplacian)归一化对称拉普拉斯矩阵…

这么好看的桌面时钟 怎么能不分享给大家

最近小编发现了非常好用的桌面时钟。桌面时钟顾名思义就是可以放在桌面上的时钟&#xff0c;这是一款界面优美,功能实用,易于操作的桌面时钟工具芝麻时钟&#xff08;下载地址&#xff1a;https://clock.zhimasoft.cn/&#xff09;。 1、首先来看下这些时钟的效果&#xff0c;…

Ping32企业加密软件:保护数据安全

在数字化时代&#xff0c;数据安全已成为每个企业不可忽视的重要课题。无论是客户信息、财务报表&#xff0c;还是商业机密&#xff0c;数据的安全性直接关系到企业的声誉与运营。为了应对不断变化的安全威胁&#xff0c;选择一款可靠的企业加密软件尤为重要。在这里&#xff0…

MFC的.rc 和.rc2文件【常见问题】

目录 一、介绍 .rc 文件 .rc2 文件 使用上的建议 二、实例 工程截图 rc文件 rc2文件 注意&#xff1a; 三、使用 能否删除&#xff1f; 一、介绍 在MFC项目中&#xff0c;.rc和.rc2文件都是资源脚本文件&#xff0c;但它们有不同的用途和管理方式。它们两指向的是同…

VS2022使用技巧

目录 如何打开资源管理器如何打开监视窗口 如何打开资源管理器 如何打开监视窗口 前提:必须先按f10 开始调试起来了

Typora+PicGo实现自动上传图片至图床

文章目录 前言图床选择图床去不图床 配置PicGo安装Typora对象存储七牛云又拍云 前言 使用过Typora的小伙伴应该已经发现&#xff0c;若是想分享给别人看不但需要发送md文件&#xff0c;还需要把对应的图片一起发给对方&#xff0c;否则图片无法显示。 但是每次都要打个压缩包发…

USIM 卡的鉴权原理

USIM 卡的一个重要功能是用来做鉴权。鉴权是移动通信中非常重要的概念&#xff0c;具体的实现需要很复杂的算法。 鉴权&#xff1a;就是鉴定你是否拥有访问网络的权利。用户在开卡后&#xff0c;手机的 USIM 卡里和运营商的核心网中都将存储一个密钥&#xff0c;或者说一个密码…

进程同步问题

在操作系统中引入进程后&#xff0c;一方面系统中多道程序可以并发进行&#xff0c;有效的改善了资源利用率&#xff0c;提高了系统的吞吐量。但另一方面&#xff0c;系统变得更加复杂了&#xff0c;如果不能通过有效措施对多个进程进行有效管理&#xff0c;那么必然会因为这些…

关于mac下的nvm设置淘宝镜像源

1. 进入配置文件修改镜像源 vim ~/.bash_profile增加下面内容 export NVM_NODEJS_ORG_MIRRORhttps://npmmirror.com/mirrors/node/2. 查看远程node镜像 nvm ls-remote3. 下载镜像 nvm install 14.17.64. 使用镜像 nvm use 14.17.6

Windows系统编程 - 目录操作、磁盘、卷信息

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解Windows系统编程的相关知识:目录操作 目录 目录操作 创建目录 通过CreateDirectory函数创建目录 原型: BOOL CreateDirectoryA([in] LPCSTR lpPathName,//目录名称[in, opt…

ORA-01031 权限不足

目录 1. 问题描述2. 问题解决 1. 问题描述 通过PL/SQL客户端&#xff0c;使用scott账户登录后&#xff0c;创建用户时&#xff0c;提示ORA-01031. 2. 问题解决 通过 cmd sqlplus进入Oracle 通过system&#xff08;密码manager&#xff09;登录 要授权的是scott账户 gran…

Flutter包管理(三)

1、作用 在APP的实际开发过程中往往会依赖很多包&#xff0c;而这些包之间存在着交叉依赖、版本依赖&#xff0c;由开发者自己管理手动管理会非常麻烦&#xff0c;每种开发生态或编程官方会提供一些包的管理工具&#xff0c;在Flutter中我们在pubspec.yaml文件中来管理第三方依…

msvcp140.dll丢失的5个解决方法,全面解读msvcp140.dll丢失问题

msvcp140.dll文件的丢失可能会引发一系列潜在问题并对计算机系统产生多方面的影响。首先&#xff0c;这个文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。一旦丢失&#xff0c;可能会导致部分软件无法正常启…

【AI系统】AI系统的组成

AI系统的组成是实现其设计目标的基础。本文将详细介绍AI系统的各个组成部分&#xff0c;以及它们如何协同工作以支持AI应用程序的开发和运行。 I. 引言 AI系统的复杂性要求其组成不仅要关注单一的硬件或软件&#xff0c;而是需要一个多层次、多维度的架构设计。这包括从应用与…

JavaWeb三大组件之Servlet

1. Servlet 一、Servlet介绍 1、概念 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成…