kundi 发表于 2022-1-4 16:41:31

一个用STC8H3K64S2做短时间录音+LED灯控制二合一芯片的奇妙想法

本帖最后由 kundi 于 2022-1-4 16:44 编辑

我们想要做一个电路,大概功能需求如下:
      ① 录音时间不少于14秒,采样率优先考虑8k或以上,实在不行就用6k。
      ② 灯串是铜线灯串,非需要变色版的电路,可以通过按键中断调整灯串闪烁模式,其中包括呼吸灯;如果是可变色版的 ,就直接用IO驱动WS2812灯串,而无需PWM.

      现在总体上看,芯片价格比去年中有明显回落,但是不少于14秒(要求6k或以上采样率)的录音芯片却相对比较贵。但便宜的ISD1820是不能用的(6.4k采样率时,长度为10秒)。我常用的wt588f02-16s,现在价格仍然是5元不变,之前没有涨价时还是3.5元,其采样率虽然达到16k,时间长度也远超14秒。之前5元以内(甚至4元)的成本是可以搞定录音芯片和单片机的。但是现在却不行了(即使是会用OTP的单片机)。
      我还看到现在录音卡片,录音长度30秒。通过解剖,发现其使用了TR16F064B的16位DSP芯片,外围元件很少,它存储器容量64KB(因此,每个采样应该是4位深度的),可用作电机控制,语音录放(甚至变音),工作频率可到32MHZ。除此之外,但是能够找到的资料很少,也不知道开发难度怎么样。淘宝上售价为5元一片。

      我发现,STC8系列有STC8H3K64S2-tssop20,有12位ADC,以及多路PWM(死区互补对称),且可通过IAP来划分EEPROM区域,有5个定时器(假设我用TIMER0及其中断,作为录放音采样的采样频率基准),工作频率也达到了45MHZ,还有MDU16的乘除法运算器。现在价格为2.7元,即使是去淘宝上买三五个也是这个价。
         于是,我就想利用STC8H3K64S2 TSSOP20,把录音功能和灯串控制做到这一个芯片上。录放音方面,优先考虑8k(周期0.125ms)采样率(万一运算能力如果在45MHz主频下不行,可以考虑6k)。4位深度(即4位无符号PCM),一个字节存储两个采样(高4位前一个采样,低4位后一个采样),如果只占用60KB的片内EEPROM长度作为录音内容,那么时间长度就是60KB*2(一个字节装两个采样)/8k(采样率)=15秒。另外,还要至少1个512字节扇区作为灯串模式存储和末尾地址SUMLENGTH。程序代码长度控制在3K以内
      电路图如下,但是,没有画出麦克风放大器和低通滤波器电路(这部分成本也就几毛钱)。
      
      我个人认为,工作过程如下。
      录音过程:当KEY1按下不放超过1秒时,就对EEPROM区域进行擦除(经过计算,用时不超过1秒),然后通过SPWM使得喇叭发出一声滴声,提示录音开始,定时器0开始工作,其中断被使能。麦克风输出的信号经过放大和低通滤波(有源)后,输入单片机的ADC0。每次计时器0中断,在TIMER0的中断函数中的录音部分,启动ADC转换一次并且获取一个采样原始值,并且按照A律13折线压缩量化的方式(保证信噪比),得到一个4位的无符号样值。每凑够两个样值写一个字节,样值数是奇数的最后一个样值就存一个字节。当松开KEY1(录满了)后,停止定时器0计数和中断失能,录音停止,喇叭通过SPWM使得喇叭响两声,停止并记忆末尾地址SUMLENGTH在EEPROM中。
      放音过程:当KEY1按下(未超过1秒),先使灯串按照预设花样发光(PWM或驱动WS2812),然后会启动定时器0计数,并且使能SPWM工作,并且使能其中断。在其中断服务函数TIMER0中的放音部分,每读到一个4位样值,就会使得SPWM的脉冲宽度发生改变,如此往复从而通过喇叭还原录音内容。当地址计数值达到SUMLENGTH后,停止播放。
      其他:喇叭可串联个小电阻以免损坏单片机。灯串发光模式可在非录音进行时通过KEY2中断修改,并且把修改的花样存储在EEPROM指定位置.

ecbm 发表于 2022-1-4 17:16:50

我之前也有这种想法,但一直没时间去实践出来。期待你的结果

kundi 发表于 2022-1-4 17:28:39

本帖最后由 kundi 于 2022-1-4 17:32 编辑

ecbm 发表于 2022-1-4 17:16
我之前也有这种想法,但一直没时间去实践出来。期待你的结果

我觉得最需要解决的核心问题是,在最高主频45MHz下,在0.125ms(1/8000秒,实在不行改用6k采样率)之内能否完成一次:ADC采样,ADC软件压缩量化(用if-else if结构),以及存储样值与计数的过程。这个核心问题解决了,实现就不难了。

注:45MHz下,0.125ms内有0.125*45,000,000Hz=5,625,000个时钟周期。

makesoft 发表于 2022-1-4 17:28:50

音频输出输入需要调理电路吧,不然幅值过小不能完全利用ADC区间和PWM阻抗匹配。

wye11083 发表于 2022-1-4 18:01:33

kundi 发表于 2022-1-4 17:28
我觉得最需要解决的核心问题是,在最高主频45MHz下,在0.125ms(1/8000秒,实在不行改用6k采样率)之内能否 ...

(1)stc中断到192khz轻轻松松,毕竟是1t 8051,除了中断外的时间不是很多了,(2)dsp应该做了压缩,不可能直接存raw,4bit lz恐怕不知道什么概念,那听到的全部是电流刺啦声。(3)lz说的那个芯片如果是音频专用芯片,那么必然有专门的语音压缩核,(4)用单片机adc搭录音笔的最大问题在于,输入音量/agc/运放的问题。声音信号的衰减是距离的3次方反比?,也就是说这个agc才是大头。如果不做好agc,那么录到的声音完全没法听了。

1a2b3c 发表于 2022-1-4 19:05:06

这个奇妙想法看来真奇妙,
我主要是觉得为啥非得是录音14秒以上呢{:lol:}
10秒15秒一般来说不是更好理解嘛,我觉得就这里挺奇妙的了

智涅 发表于 2022-1-4 19:54:18

录音芯片现在这么贵,我手上还有一堆sop16的,是MP3录音,64kbps最高,也支持解码播放,不过需要自己加flash或者tf卡,支持电脑接usb出u盘管理文件,当时买的时候好像才三块多

lb0857 发表于 2022-1-4 20:12:11

mic是模块的吧里面已经有放大ic

kundi 发表于 2022-1-4 20:55:05

lb0857 发表于 2022-1-4 20:12
mic是模块的吧里面已经有放大ic

一般的电容咪头,里面就一个JFET做阻抗变换而已,本身放大作用不大。所以说我就要补充运放电路

小李非刀 发表于 2022-1-5 11:24:38

我经常做语音,楼主方案没有问题。
STC8系列带12位ADC的,其噪音非常低,做数字录音非常好。
我常用方案是,带12位ADC的MCU+8腿FLASH+LMV358放大咪头和输出滤波,FLASH用512K~16MB都有。
声音编码我常用A率或ADPCM,语音采样8K,声音要比较好久用16K,比如8K采样,A率码率是8KB/S,ADPCM是4KB/S,FLASH用512K~16MB可以保存64~4096秒,音质吊打一般的语音芯片。要更好的输出音质可以用一片几毛钱的立体声DAC PT8211或TM8211。

还可以做数字对讲机,用一个带PA的2.4G模块,野外无遮挡500~1000米,编码使用软件CVSD(影视霉菌用的那种对讲机,特有的音色,有点沙沙的),码率16kbit/S(2KB/S),误码率达到10%都不影响听懂,小声说话到大喊大叫都不会明显破音。

kundi 发表于 2022-1-5 12:25:01

本帖最后由 kundi 于 2022-1-5 12:31 编辑

小李非刀 发表于 2022-1-5 11:24
我经常做语音,楼主方案没有问题。
STC8系列带12位ADC的,其噪音非常低,做数字录音非常好。
我常用方案是 ...

如果方便的话,可以“私聊”获取参考代码吗?
我发现现在SPI FALSH售价也就几毛钱,不贵。不过短秒数我认为可以用单片机EEPROM,进一步降低成本。能够把bom成本做到4-5元左右也没什么问题。

kundi 发表于 2022-1-6 12:43:20

不知道有相关参考代码,可以贴上来吗?

locky_z 发表于 2022-1-6 20:12:25

没声卡的DOS时代,玩过一两款游戏,居然通过主板的喇叭010101地发出语音(不是音乐声),虽然很不清晰,但还是可以尝试的。

face9 发表于 2022-1-6 20:54:50

你单片机就把语音IC的事情做了,而且各方面都要好。那你想想为什么语音芯片在市场上存在了这么多年时间。

小李非刀 发表于 2022-1-7 21:36:26

face9 发表于 2022-1-6 20:54
你单片机就把语音IC的事情做了,而且各方面都要好。那你想想为什么语音芯片在市场上存在了这么多年时间。 ...

原因很简单:便宜!

以前,3毛一片的3秒语音IC,PWM直接接喇叭,玩具大量用。我再2000~2005年,这6年做的东西之一,就是语音IC、录放语音IC、电子琴等等。

但是8位的PWM音质,不好。

kundi 发表于 2022-1-8 00:01:40

小李非刀 发表于 2022-1-7 21:36
原因很简单:便宜!

以前,3毛一片的3秒语音IC,PWM直接接喇叭,玩具大量用。我再2000~2005年,这6年做 ...

STC8H单片机里面是有10位甚至16位PWM的。

wx-ta 发表于 2022-1-8 00:02:26

小李非刀 发表于 2022-1-5 11:24
我经常做语音,楼主方案没有问题。
STC8系列带12位ADC的,其噪音非常低,做数字录音非常好。
我常用方案是 ...

感谢了收藏了

kundi 发表于 2022-1-8 15:55:28

这是一楼所说的用台湾呈硕TR16F064B的DSP做的录音留言贺卡的背面。

kundi 发表于 2022-1-8 19:29:37

本帖最后由 kundi 于 2022-1-8 19:30 编辑

小李非刀 发表于 2022-1-7 21:36
原因很简单:便宜!

以前,3毛一片的3秒语音IC,PWM直接接喇叭,玩具大量用。我再2000~2005年,这6年做 ...

我在本论坛找到了ADPCM参考代码。
请问,如果使用STC8H3K的12位ADC和内部高级16位PWM,那么要怎么改此代码?
我绝对觉得512字节可做一组来处理,因为一个扇区就是512字节。
单片机录音与播声音ADPCM算法 https://www.amobbs.com/forum.php?mod=viewthread&tid=5570330

kundi 发表于 2022-1-11 15:10:19

kundi 发表于 2022-1-8 19:29
我在本论坛找到了ADPCM参考代码。
请问,如果使用STC8H3K的12位ADC和内部高级16位PWM,那么要怎么改此代 ...

除了详细看了上面链接的代码。刚刚也看了网上一些说法,感觉编解码时一组512个处理不过来。
不知道一组16个,是否合适。既要保证质量 也要保证速度跟得上

小李非刀 发表于 2022-1-17 20:38:25

kundi 发表于 2022-1-11 15:10
除了详细看了上面链接的代码。刚刚也看了网上一些说法,感觉编解码时一组512个处理不过来。
不知道一组16 ...

512字节一块,ADPCM的标准做法,但是你可以自己定义块的长度。
ADPCM处理的计算量很小的,512字节一块,现在的STC8系列,用32KHz采样都可以压缩、解压缩ADPCM。

dhvliyike 发表于 2022-4-21 23:00:02

直接pcm就行了,压缩算法是毒药

小李非刀 发表于 2022-4-22 13:46:41

dhvliyike 发表于 2022-4-21 23:00
直接pcm就行了,压缩算法是毒药
(引用自22楼)

直接PCM,用内部存储不了楼主要求的14秒啊。

kundi 发表于 2022-4-22 14:11:48

小李非刀 发表于 2022-4-22 13:46
直接PCM,用内部存储不了楼主要求的14秒啊。
(引用自23楼)

照他说就只能用外接FLASH才行

zqf441775525 发表于 2022-4-24 09:16:46

外挂Flash,使用TM8211,我用STC8已经实现了22.05K/16bit的播放,主频11.0592MHz。如果主频提高一倍,可以实现44.1K的播放。
BOM成本看Flash大小,以目前的行情做到4元以下没问题。
录音肯定没问题吧,ADC中断就行了。不需要压缩,直接PCM就行。

dhvliyike 发表于 2022-4-24 13:16:33

本帖最后由 dhvliyike 于 2022-4-24 14:37 编辑

{:titter:}
页: [1]
查看完整版本: 一个用STC8H3K64S2做短时间录音+LED灯控制二合一芯片的奇妙想法