功率检测和语音功能
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.****.net/weixin_50257954/article/details/133635534
上一篇: C 语言从零开始 68 - 学习头文件 string.h
下一篇: jdk 11.0.8 配置类路径
推荐阅读
-
功率检测和语音功能
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
基于微控制器的光伏功率检测系统的设计-II。功能设计
-
RCWL-0516/RCWL-9196模块简介 & 微波感应模块简介-前言 RCWL-0516是一款由无锡日晨物联科技有限公司开发的微波感应模块(资料下载),见图0.0、图0.1,用于检测物体(人体)移动,具有以下特征: 1.穿透感应:可穿透适当厚度的玻璃、木板以及墙壁。 2.抗干扰:不受温度、灰尘等环境因素影响。 3.感应距离:5~8m(可调,见后文) 4.可重复触发、触发时间可调(见后文) 5.工作电压:3.3~18V 6.稳压输出:提供3.3V电压输出(最大100mA) 7.夜晚自动工作:外接光敏电阻和一个电阻实现 当模块检测到物体在感应范围内移动时,OUT引脚输出一段时间的高电平(该时间可通过电容“C-TM”调节,见后文);若在输出高电平期间再次检测到物体移动,高电平持续时间将延长一段时间(又称为重复触发),该时间不可叠加。 模块使用的注意事项如下,示意图见图0.2: 1. 感应面正前方不能有金属遮挡。 2. 感应面前后方预留2cm以上空间。若对灵敏度要求很高,应预留4cm以上距离,且模块后方遮挡空间应尽可能小。 3. 模块与安装载体平面尽可能平行。 4. 有元器件面为正感应面,反面为负感应面,负感应面效果略差。 5. 相同模块,单个个体之间间距应大于2m。 图0.0-模块实物图(正) 图0.1-模块实物图(反) 图0.2-感应区域示意图 原理 关于此模块的原理,有2种主流观点,这些观点所争论的焦点在于哪种解释是最主要的: 1. 以Roger Clark为代表的“反射”解释:模块上的振荡器会发射出微波信号,位于模块感应区域内的物体会反射模块所发出的微波信号,这些反射信号又被模块所接收,接收到的反射信号会改变流经晶体管发射极的电流I。外界环境不变的情况下,模块内部的调节电路会稳定振荡器,此时振荡器处于稳定状态,电流I也处于稳定;当外界环境发生变化(例如,有物体进入感应区域),该物体的反射信号会使振荡器暂时失去稳定,从而导致电流I发生变化。模块通过检测该电流I的变化,以检测物体移动。此过程中,发射频率的变化只是由于振荡器受反射信号影响而进入一个“暂稳态”所导致。 2.以Joe Desbonnet为代表的“多普勒效应”解释:位于模块感应区域内的物体会反射模块所发出的微波信号,这些反射信号的频率由于物体移动而发生改变(多普勒效应)。模块通过对比发射与反射频率的差异,以判断是否有物体进入感应区域。 应用 降低感应距离:模块背面丝印“R-GN”处添加1MΩ的电阻,模块的感应距离可降低到5m;如果不接,感应距离为7m。 调节触发时间:模块背面丝印“C-TM”处添加不同容值的电容,可以调节触发时间(“C-TM”电容容值的选择见后文);若不安装电容,触发时间为2~4s。 夜晚自动工作:模块正面丝印“CDS”处添加光敏电阻、模块背面丝印“R-CDS”处添加适当阻值的电阻,可控制模块在夜晚自动工作。“CDS”与“R-CDS”的选择方法见后文。 以上应用的实际电路请参考图1.0、图1.1。 图1.0-测试电路(正) 图1.1-测试电路(反) 测试 测试由5部分组成: 1.测量模块处于不同状态时的功耗,见表0.0。 2.未接入电阻“R-GN”时,测试模块最大感应距离,见表0.1。 3.接入电阻“R-GN”,测试模块最大感应距离,见表0.2。 4.以下步骤将介绍如何根据确定的光敏电阻“CDS”,选择电阻“R-CDS”的阻值,以实现模块夜间自动工作的功能。 1-白天,接入可调电阻“R-CDS”(推荐2MΩ)、光敏电阻“CDS”。 2-触发模块后(在模块面前走动),调节可调电阻,直到触发消失。再次尝试触发模块,正常情况下,模块应该无法被触发(如果可以触发,重复步骤2)。 3-将光敏电阻感光面遮住,尝试触发模块,正常情况下,模块应该可以被触发(如果无法触发,重复步骤3)。 4-此时可调电阻阻值即为电阻“R-CDS”的正确阻值。 5.电容“C-TM”分别接入不同容值的无极电容,测试模块单次触发所持续的时间,见表0.3。 测试条件 总电流(mA) 总功耗(mW) +5V供电电压,模块未触发 3.63 18.15 +5V供电电压,模块被触发 4.33 21.65 表0.0-模块功耗信息 正面最大感应距离(M) 6 反面最大感应距离(M) 2 表0.1-未接入电阻“R-GN”时,模块最大感应距离[1] 正面最大感应距离(M) 5 反面最大感应距离(M) 1 表0.2-接入电阻“R-GN”=1MΩ时,模块最大感应距离[1] 电容“C-TM”容值 悬空 103(10nF) 104(100nF) 224(220nF) 474(470nF) 105(1uF) 理论单次触发时间(s) 2~4 6 30 66 140 300 实际单次触发时间(s) 3 6 32 67 122 210 表0.3-电容“C-TM”容值 vs. 模块单次触发持续时间 结论 RCWL-0516是一款性价比高的人体感应模块,具有以下优缺点: 优点:
-
I.语法系统 1.学习英语的三个部分: (1) 语音 无错误发音,无口音问题。 (2) 词汇 通过阅读和交流积累词汇。 (3) 语法 应尽量避免语法错误。 II.语法核心 1.学习语法的目的 造句。 2.简单句 句子完整,无法拆分。 简单句的句子成分 (1) 主语、谓语、宾语 怎么样:主语 + 谓语(谓语 = 谓语动词 + 宾语) 主语(主语)--主语补语(主语补语) 宾语(宾语) - 宾语补语(宾语补语) 谓语动词(谓语动词) 谓语动词的三种主要技能: 时态:现在时、过去时、将来时、过去将来时。 方面:一般(未指定)、已完成、进行中、完成(不仅已完成,还在进行中)。 语气:虚拟语气、陈述语气、祈使语气。 非谓语动词 在几乎所有的从句中都可以充当:主语、宾语、主语补语、宾语补语、定语等。非谓语动词,失去(不具有)动词表示时态体调的功能。 形式不同: 动词不定式,吃 现在分词,吃 动名词,吃 过去分词,吃 **五种基本句型 动词类型 例句 句型 不及物动词 睡眠 主语 + 不及物动词 单及物动词 喜欢你 主语 + 单及物动词 + 宾语 双及物动词 教你英语。 主语 + 双及物动词 + 间接宾语 + 直接宾语 混合及物动词 认为你很聪明。 主语 + 混合及物动词 + 宾语 + (宾语)补语 (连系动词 很高。 主语 + 联系动词 + (主语)补语表语 (2) 属词 修饰主语或宾语。 (3) 副词 修饰谓语。 (4) 正话 (4) 否定句(Appositive)。 3.复句 复句(Compound Sentence),又称并列句,多个句子是并列关系。 4.复合句(Complex Sentence) 另一个句子中的一个句子。 (1) 主句 (2)从句:从句,简单句充当另一个句子的句子成分。从句充当句子的所有成分。 名词性从句:主语从句、宾语从句、表语从句、同位语从句 定语从句: 动名词从句 动词从句: III.十大词类 No. 词 作品 说明 1 名词 名词 表示人或物 2 冠词 文章 用英语描述人和事 3 代词 代词 人和事的代词 4 形容词 形容词 描述人和物 5 数字 数字 表示数量 6 副词 副词 修饰动词或形容词 7 介词 介词 表示与其他词之间关系的词 8 感叹词 插入语 感叹词 9 连接词 连接词 连接词语或句子 10 动词 动词 表示动作 10+ 助动词 助动词 助动词可以帮助谓语动词完成时态气体任务,也可以充当实义动词等。 总结 1. 英语语法的核心是动词。 2.一个粗略的核心语法框架可以帮助你鸟瞰语法系统。 3.英语语法充满了特例。 转: 01 语法核心体系
-
[【科普来了】一文读懂PE:什么是PE,PE怎么用?......- I. 什么是 PE? PE的英文全称是Preinstallation Environment,翻译过来就是预装环境。有了这个名字就好理解了,可以直接说它是一个预装的、微型的或精简版的系统。它的体积非常小,大多数 PE 通常只有一两百兆,通常我们可以把它安装在 U 盘或移动硬盘上,随身携带,在任何电脑上启动它。无需依赖电脑上的原始系统。 二、PE 可以做什么? 网上的 PE 工具大多是由很多喜欢折腾电脑的玩家或团队制作的,根据制作者和团队的不同,PE 的功能也会有所不同。但核心的系统安装、系统备份还原、硬盘分区、启动修复之类的系统维护功能还是有的,而且大多差别不大。 区别基本在于集成维护工具的数量,比如一个简单的系统安装功能,可以通过很多工具来实现,不同 PE 之间的区别仅在于工具数量和工具版本的新旧。 其次,一些常用的工具还有开机密码去除、硬件检测等功能,还有一个实用的功能就是文件强制删除,相信有些小伙伴在删除文件时会遇到出现权限不足等提示而无法删除,在PE中就不会出现这样的情况,因为PE是默认以最高权限运行的,对于这类情况可以直接删除。 一些功能比较丰富的 PE 还会具备联网功能,以及集成一些常用软件(如 Office),如果只是临时使用,甚至可以把它当作一个正常的系统来使用。 三、使用 PE 安装系统的好处? 首先当然是如上所述,PE 功能齐全,类似硬盘分区等操作你都可以在装系统之前提前搞定,避免了装完系统之后还要一步步去搞定的麻烦。 其次,个人觉得最方便的就是可以用最简单的方法一次性创建多系统启动盘。 用U盘装系统的朋友应该都知道,在制作启动U盘时一般一个系统只能写入一次,比如你只有一个U盘,你要装Win10就要制作一个启动盘,要装Win7又要重新制作一个,而且每次都要格式化,非常不方便。虽然也有制作一体化镜像,然后一次性写入的方法,但操作起来太麻烦、太繁琐。 有了 PE,就可以避免这种麻烦,只需把 PE 写入 U 盘,然后把需要安装的系统镜像都放到 U 盘里,只要 U 盘空间足够,想放多少就放多少,避免了因为安装不同系统而反复制作启动盘的麻烦。而且,由于制作一次后无需格式化,你还可以在 U 盘中放入其他数据,而不必担心文件丢失。 四、可靠的好 PE 推荐 其实,PE工具虽然有很多种,但其实功能都差不多,无非就是更新的快慢而已。 但关键在于靠谱,什么叫靠谱呢?虽然都能用,功能也全,但有的夹杂着 "私货"。说白了,就是捆绑软件,或者捆绑主页,或者怎么卸载都不干净的那种。
-
微软文本到语音和语音到文本功能更新以提高效率
-
通过腾讯即时通讯 IM 和实时音频/视频实现完整的语音通话功能
-
Selenium 和 Puppeteer 的数十种功能可被网站检测到。
-
TMC5160 步进电机驱动器芯片开发和使用说明-1-1.工作原理 TMC5160 提供三种基本工作模式:模式 1 :全功能运动控制和驱动器 所有步进电机逻辑完全由 TMC5160 控制。模式 2 :脉冲和方向驱动器 外部高性能 S-ramp 运动控制器或 CPU(如 TMC 4361)生成脉冲和方向信号,这些信号与系统中的其他组件(如电机)同步。 TMC5160 控制电流和运动模式,并反馈电机状态。microPlyer 会自动平滑运动。模式 3 :简单步进和方向驱动器 TMC5160 根据步进和方向信号控制电机。无需 CPU; 配置由硬件引脚完成。固定保持电流控制由 TMC 5160 完成。可选反馈信号用作错误检测和同步标志的输出。 SPI_MODE 接地,SD_MOD 为高电平以启用该模式。 1.1 关键概念