[MM32硬件] 基于国产语音芯片KT142A加灵动微的MM32F031K8T6组成的语音提示器

[复制链接]
1047|13
 楼主| hehhehee 发表于 2023-8-28 07:44 | 显示全部楼层 |阅读模式
本帖最后由 hehhehee 于 2023-8-28 07:45 编辑

基于国产语音芯片KT142A加灵动微的MM32F031K8T6组成的语音提示器

项目简介
前不久,我们公司里面有个项目,需要在现有的产品基础上,增加一些操作的语音提示,这个也是终端的客户提出来的,毕竟有声音提醒,产品的操作体验肯定要好很多,
所以我就在网上到处找相关的方案,以前没接触过这一块,也是新手,所以踩了很多很多的坑。项目也基本开发完毕了,所以就此做总结来记录一下这个开发

详细记录–网上找资料
经过一天网上的查阅资料,发现网上的资料导向,基本只有2种方式去选
方案一:直接用我们的主控芯片,灵动微的MM32F031K8T6 ,用内置的PWM,外挂一个spiflash把预存的声音文件wav格式的,自己解码输出,外围加RC电路再加功放去实现
方案二:直接购买现成的语音芯片,通过串口或者一线串口去控制播放

评论

———————————————— 版权声明:本文为CSDN博主「qiqiwowo2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qiqiwowo2/article/details/124468986  发表于 2023-8-28 07:45
 楼主| hehhehee 发表于 2023-8-28 07:46 | 显示全部楼层
目前我个人的结论就是选用方案二,我的考虑就是
1、其实选用方案一,是最好的选择,但是奈何网上找了好久,都没有找到合适的例子,自己的思路呢,也只是停留在知道怎么实现,但是需要的技术点非常的多,需要搞掂外挂flash的文件管理,需要搞掂wav的解码,速度还要快,慢了声音效果很差,还有不可预知的稳定性,以及可生产性等等
 楼主| hehhehee 发表于 2023-8-28 07:46 | 显示全部楼层
2、最终网上找了一款芯片,KT142A,深圳市清月电子的,成本也合适,芯片使用起来也很简单。
外围就两颗105电容搞掂
芯片也可以直接驱动扬声器,买回来的样品测了一下,声音还是挺大,挺清晰的
 楼主| hehhehee 发表于 2023-8-28 07:46 | 显示全部楼层
 楼主| hehhehee 发表于 2023-8-28 07:46 | 显示全部楼层
硬件设计
1466264ebe05b9bff9.png
 楼主| hehhehee 发表于 2023-8-28 07:46 | 显示全部楼层
实际打板子回来,还是弄错了脚位,不得不单独的跳线,到KT142A芯片的测试板上面去测试

反正也简单,就一个串口搞定所有的事情

9622264ebe06db0a8f.png
 楼主| hehhehee 发表于 2023-8-28 07:47 | 显示全部楼层
调好之后,再改一下板子,就可以完成任务了

打板测试,4天,这个也不得不得赞美一下嘉立创,20块钱包邮还能做到48小时发货,太厉害了
 楼主| hehhehee 发表于 2023-8-28 07:47 | 显示全部楼层
程序部分
  1. 由于我们产品的保密性,所以我们产品内部的程序细节,不方便暴露,这里就以官方的例程进行说明,其实移植还是非常简单的额

  2. #include "STK6037.h"

  3. //运行晶振:11.05926MHZ
  4. #define TIMER0_H   (65536-1800)/256//定时2Ms
  5. #define TIMER0_L   (65536-1800)%256

  6. #define SYS_Fosc        11059200  //晶振频率                          
  7. #define COMM_BAUD_RATE  9600      //串口波特率

  8. #define OSC_FREQ        11059200  //11059200  
  9. static INT8U Send_buf[10] = {0} ;
  10. static INT8U Recv_buf[10] = {0} ;

  11. static INT8U SendDataLen = 0 ;
  12. static INT8U ResendDataLen = 0 ;

  13. /******************************串口1的波特率********************************/
  14. //T1作波特率发生器
  15. //在波特率加倍情况下
  16. #define BAUD_57600                            256 - (OSC_FREQ/192L)/57600L    // 254 FF
  17. #define BAUD_28800                            256 - (OSC_FREQ/192L)/28800L    // 254 FE
  18. #define BAUD_19200                            256 - (OSC_FREQ/192L)/19200L    // 253 FD
  19. #define BAUD_14400                            256 - (OSC_FREQ/192L)/14400L    // 252 FC
  20. #define BAUD_9600                             256 - (OSC_FREQ/192L)/9600L     // 250 FA

  21. /*****************************************************************************************************
  22. - 功能描述:10us的延时函数
  23. - 隶属模块:常用函数库(内部)
  24. - 参数说明:无
  25. - 返回参数:无
  26. - 注: 在这里的运行环境是51,晶振为12MHZ               
  27. *****************************************************************************************************/
  28. void Delay_Us(INT32U z)
  29. {
  30.         while(z--);
  31. }

  32. /***********************毫秒级别延时************************/

  33. void Delay_Ms(INT32U z)
  34. {
  35.         INT32U x=0 , y=0;
  36.         for(x=110 ; x>0 ;x--)
  37.         for(y=z; y>0;y-- );
  38. }

  39. /*****************************************************************************************************
  40. - 功能描述: 串口1初始化
  41. - 隶属模块: 外部
  42. - 参数说明: 无
  43. - 返回说明: 无
  44. - 注:              都是9600波特率
  45. *****************************************************************************************************/
  46. void Serial_init(void)
  47. {
  48.         TMOD = 0x20;                // 设置 T1 为波特率发生器
  49.         SCON = 0x50;                // 0101,0000 8位数据位, 无奇偶校验
  50.                                                   
  51.         PCON = 0x00;                //PCON=0;

  52.         TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);//设置为9600波特率
  53.         TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12);

  54.     TR1     = 1;                            //定时器1打开
  55.     REN     = 1;                           //串口1接收使能
  56.     ES      = 1;                           //串口1中断使能
  57. }


  58. /********************************************************************************************
  59. - 功能描述: 串口发送一个字节
  60. - 隶属模块: 外部
  61. - 参数说明:
  62. - 返回说明:
  63. - 注:             
  64. ********************************************************************************************/
  65. void Uart_PutByte(INT8U ch)
  66. {
  67.     SBUF  = ch;
  68.     while(!TI){;}
  69.     TI = 0;
  70. }

  71. /*****************************************************************************************************
  72. - 功能描述: 串口发送一帧数据
  73. - 隶属模块: 内部
  74. - 参数说明:
  75. - 返回说明:
  76. - 注:无     
  77. *****************************************************************************************************/
  78. void SendCmd(INT8U len)
  79. {
  80.     INT8U i = 0 ;

  81.     Uart_PutByte(0x7E); //起始
  82.     for(i=0; i<len; i++)//数据
  83.     {
  84.                 Uart_PutByte(Send_buf[i]) ;
  85.     }
  86.     Uart_PutByte(0xEF) ;//结束
  87. }


  88. /********************************************************************************************
  89. - 功能描述: 串口向外发送命令[包括控制和查询]
  90. - 隶属模块: 外部
  91. - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令
  92.               feedback:是否需要应答[0:不需要应答,1:需要应答]
  93.               data:传送的参数
  94. - 返回说明:
  95. - 注:
  96. ********************************************************************************************/
  97. #define  WORD_HIGH(x)         ((u8)((u16)(x)>>8))
  98. #define  WORD_LOW(x)          ((u8)((u16)(x)))
  99. void Uart_SendCMD(u8 CMD ,u16 len , u16 dat)
  100. {
  101.     g_user.Send_buf[0] = CMD;
  102.     g_user.Send_buf[1] = WORD_HIGH(len);
  103.     g_user.Send_buf[2] = WORD_LOW(len);
  104.     g_user.Send_buf[3] = WORD_HIGH(dat);
  105.     g_user.Send_buf[4] = WORD_LOW(dat);
  106.     SendCmd(5,1);                //发送此帧数据
  107. }

  108. void Uart_SendDat(u8 CMD , u8 *pbf ,u8 len)
  109. {
  110.     static u8 i = 0 ;
  111.     g_user.Send_buf[0] = CMD ;         //保留字节
  112.     g_user.Send_buf[1] = WORD_HIGH(len);
  113.     g_user.Send_buf[2] = WORD_LOW(len);
  114.     for(i=0 ; i<len ; i++)
  115.     {
  116.         g_user.Send_buf[3+i] = *(pbf+i) ;
  117.     }
  118.     SendCmd(len+3 , 1 );  //发送此帧数据
  119. }

  120. u8 testbuf[6] = {01,01,02,02,03,03} ;
  121. u8 testlen = 6 ;

  122. void main()
  123. {
  124.         Delay_Us(1) ;
  125.         Delay_Ms(1) ;

  126.         Serial_init() ;

  127.     Delay_Ms(1000) ;//延时大概6S
  128.    
  129.     Uart_SendCMD(0x03 , 2 , 0x01) ;//播放第一首
  130.    
  131.     Delay_Ms(1000) ;//延时大概6S
  132.    
  133.     Uart_SendCMD(0x03 , 2 , 0x02) ;//播放第二首

  134.     Delay_Ms(1000) ;//延时大概6S

  135.     Uart_SendCMD(0x03 , 2 , 0x04) ;//播放第四首
  136.    
  137.      Delay_Ms(1000) ;//延时大概6S

  138.     Uart_SendCMD(0x21 , testbuf , testlen) ;//组合播放文件夹01里面的001 ,文件夹02里面的002 ,文件夹03里面的003 ,

  139.     while(1) ;
  140. }
 楼主| hehhehee 发表于 2023-8-28 07:47 | 显示全部楼层
总结
其实这个项目,从确定需求,到最后做好样品,也就花了1个星期不到
查资料半天时间,确定方案
买样品3天时间,
打板测试,4天,这个也不得不得赞美一下嘉立创,20块钱包邮还能做到48小时发货,太厉害了
调程序,半天时间,搞定,手工
单片小菜 发表于 2023-8-29 14:11 | 显示全部楼层
这个语音芯片是不是需要让厂家提前进行语音条的烧录?
kjkujkj21 发表于 2023-8-29 15:13 | 显示全部楼层
需要烧录语音条目吗?还是不用?
yufe 发表于 2023-8-29 20:51 | 显示全部楼层
外围加RC电路再加功放去实现
AloneKaven 发表于 2023-8-29 21:25 | 显示全部楼层
自己实现的话就叼了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部