基于国产语音芯片KT142A加灵动微的MM32F031K8T6组成的语音提示器
本帖最后由 hehhehee 于 2023-8-28 07:45 编辑基于国产语音芯片KT142A加灵动微的MM32F031K8T6组成的语音提示器
项目简介
前不久,我们公司里面有个项目,需要在现有的产品基础上,增加一些操作的语音提示,这个也是终端的客户提出来的,毕竟有声音提醒,产品的操作体验肯定要好很多,
所以我就在网上到处找相关的方案,以前没接触过这一块,也是新手,所以踩了很多很多的坑。项目也基本开发完毕了,所以就此做总结来记录一下这个开发
详细记录–网上找资料
经过一天网上的查阅资料,发现网上的资料导向,基本只有2种方式去选
方案一:直接用我们的主控芯片,灵动微的MM32F031K8T6 ,用内置的PWM,外挂一个spiflash把预存的声音文件wav格式的,自己解码输出,外围加RC电路再加功放去实现
方案二:直接购买现成的语音芯片,通过串口或者一线串口去控制播放
目前我个人的结论就是选用方案二,我的考虑就是
1、其实选用方案一,是最好的选择,但是奈何网上找了好久,都没有找到合适的例子,自己的思路呢,也只是停留在知道怎么实现,但是需要的技术点非常的多,需要搞掂外挂flash的文件管理,需要搞掂wav的解码,速度还要快,慢了声音效果很差,还有不可预知的稳定性,以及可生产性等等 2、最终网上找了一款芯片,KT142A,深圳市清月电子的,成本也合适,芯片使用起来也很简单。
外围就两颗105电容搞掂
芯片也可以直接驱动扬声器,买回来的样品测了一下,声音还是挺大,挺清晰的 硬件设计
实际打板子回来,还是弄错了脚位,不得不单独的跳线,到KT142A芯片的测试板上面去测试
反正也简单,就一个串口搞定所有的事情
调好之后,再改一下板子,就可以完成任务了
打板测试,4天,这个也不得不得赞美一下嘉立创,20块钱包邮还能做到48小时发货,太厉害了 程序部分由于我们产品的保密性,所以我们产品内部的程序细节,不方便暴露,这里就以官方的例程进行说明,其实移植还是非常简单的额
#include "STK6037.h"
//运行晶振:11.05926MHZ
#define TIMER0_H (65536-1800)/256//定时2Ms
#define TIMER0_L (65536-1800)%256
#define SYS_Fosc 11059200//晶振频率
#define COMM_BAUD_RATE9600 //串口波特率
#define OSC_FREQ 11059200//11059200
static INT8U Send_buf = {0} ;
static INT8U Recv_buf = {0} ;
static INT8U SendDataLen = 0 ;
static INT8U ResendDataLen = 0 ;
/******************************串口1的波特率********************************/
//T1作波特率发生器
//在波特率加倍情况下
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA
/*****************************************************************************************************
- 功能描述:10us的延时函数
- 隶属模块:常用函数库(内部)
- 参数说明:无
- 返回参数:无
- 注: 在这里的运行环境是51,晶振为12MHZ
*****************************************************************************************************/
void Delay_Us(INT32U z)
{
while(z--);
}
/***********************毫秒级别延时************************/
void Delay_Ms(INT32U z)
{
INT32U x=0 , y=0;
for(x=110 ; x>0 ;x--)
for(y=z; y>0;y-- );
}
/*****************************************************************************************************
- 功能描述: 串口1初始化
- 隶属模块: 外部
- 参数说明: 无
- 返回说明: 无
- 注: 都是9600波特率
*****************************************************************************************************/
void Serial_init(void)
{
TMOD = 0x20; // 设置 T1 为波特率发生器
SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验
PCON = 0x00; //PCON=0;
TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//设置为9600波特率
TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);
TR1 = 1; //定时器1打开
REN = 1; //串口1接收使能
ES = 1; //串口1中断使能
}
/********************************************************************************************
- 功能描述: 串口发送一个字节
- 隶属模块: 外部
- 参数说明:
- 返回说明:
- 注:
********************************************************************************************/
void Uart_PutByte(INT8U ch)
{
SBUF= ch;
while(!TI){;}
TI = 0;
}
/*****************************************************************************************************
- 功能描述: 串口发送一帧数据
- 隶属模块: 内部
- 参数说明:
- 返回说明:
- 注:无
*****************************************************************************************************/
void SendCmd(INT8U len)
{
INT8U i = 0 ;
Uart_PutByte(0x7E); //起始
for(i=0; i<len; i++)//数据
{
Uart_PutByte(Send_buf) ;
}
Uart_PutByte(0xEF) ;//结束
}
/********************************************************************************************
- 功能描述: 串口向外发送命令[包括控制和查询]
- 隶属模块: 外部
- 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
feedback:是否需要应答
data:传送的参数
- 返回说明:
- 注:
********************************************************************************************/
#defineWORD_HIGH(x) ((u8)((u16)(x)>>8))
#defineWORD_LOW(x) ((u8)((u16)(x)))
void Uart_SendCMD(u8 CMD ,u16 len , u16 dat)
{
g_user.Send_buf = CMD;
g_user.Send_buf = WORD_HIGH(len);
g_user.Send_buf = WORD_LOW(len);
g_user.Send_buf = WORD_HIGH(dat);
g_user.Send_buf = WORD_LOW(dat);
SendCmd(5,1); //发送此帧数据
}
void Uart_SendDat(u8 CMD , u8 *pbf ,u8 len)
{
static u8 i = 0 ;
g_user.Send_buf = CMD ; //保留字节
g_user.Send_buf = WORD_HIGH(len);
g_user.Send_buf = WORD_LOW(len);
for(i=0 ; i<len ; i++)
{
g_user.Send_buf = *(pbf+i) ;
}
SendCmd(len+3 , 1 );//发送此帧数据
}
u8 testbuf = {01,01,02,02,03,03} ;
u8 testlen = 6 ;
void main()
{
Delay_Us(1) ;
Delay_Ms(1) ;
Serial_init() ;
Delay_Ms(1000) ;//延时大概6S
Uart_SendCMD(0x03 , 2 , 0x01) ;//播放第一首
Delay_Ms(1000) ;//延时大概6S
Uart_SendCMD(0x03 , 2 , 0x02) ;//播放第二首
Delay_Ms(1000) ;//延时大概6S
Uart_SendCMD(0x03 , 2 , 0x04) ;//播放第四首
Delay_Ms(1000) ;//延时大概6S
Uart_SendCMD(0x21 , testbuf , testlen) ;//组合播放文件夹01里面的001 ,文件夹02里面的002 ,文件夹03里面的003 ,
while(1) ;
}
总结
其实这个项目,从确定需求,到最后做好样品,也就花了1个星期不到
查资料半天时间,确定方案
买样品3天时间,
打板测试,4天,这个也不得不得赞美一下嘉立创,20块钱包邮还能做到48小时发货,太厉害了
调程序,半天时间,搞定,手工 这个语音芯片是不是需要让厂家提前进行语音条的烧录? 需要烧录语音条目吗?还是不用?
外围加RC电路再加功放去实现 自己实现的话就叼了
页:
[1]