振南实战项目 模控开关与音频播放 2
----《成本与功能的取舍》
项目初期,0.2V信号的检测还是首要的问题。项目方又补充了需求:要尽量降低成本,越低越好!
一开始项目方打算使用STC15W204S SOP8封装,STC官方报价是1.35元。
我向项目方提出了几个问题:
1、Flash容量太小,音频数据存放在哪?
2、没有硬件PWM,如何作PWM音频?IO模拟PWM效果会比较差。
3、没有ADC如何采集电压信号?
他问我:“那需要多大的Flash容量?” 我说:“你要播放的音频数据有多大?” 他说:“我要播放的就是电话铃声,大约2秒吧!” 我说:“按能够接受的最低采集率8KHZ来说,按8位计算,需要大约16KB容量!” 他说:“那么大啊?怎么能让数据量小一点?” 我说:“可以降低采集率,不过8KHZ已经是最低了,再低的话音效就很差了!” 【音频格式默认使用无压缩的PCM】
最后解决方案是:将音频缩短到了1s,换用Flash容量更大的单片机芯片。考虑到PWM和ADC,最终选用IAP15W413AS SOP16封装。
在价格上贵了近1块钱,关于这一点,项目方很不满意,但也没什么办法!他一开始选STC15W204,是因为他很多问题没有考虑到,只单单考虑成本低。
大家有没有注意到,STC的单片机中集成有一个模拟比较器,它的功能就是将两个信号进行比较,如果v2大于v1,则输出1,反之输出0。
对于0.2V电压的检测,振南一开始的方案是使用ADC+基准电压。当我看到STC这个模拟比较器之后,我马上PASS掉了前面的方案。我可以不用ADC,而把0.2V电压检测出来!
基本原理是这样的:
图中V1由1.2V电压,经过5K-1K分压得到,为恒定的0.2V电压。使用模拟比较器将它与V2(待测信号)进行比较,输出V2>V1的结果。
这样一来,我们就可以把ADC省下了!这样一来,似乎我们使用IRC15W207S也差不多(把音频再缩一缩,降为6KHZ采样率,然后通过一些音频插值算法来补偿),它价格才1.4元。但是一个硬伤又来了,STC芯片好像没有ADC的型号,PWM也没有!
那能不能IO模拟PWM呢?IO模拟PWM和硬件PWM在效果上有什么差异?最重要的一点就是IO模拟PWM的频率可能远没有硬件PWM高。有人说:“我原来用51的IO模拟PWM去作电机调速也很好啊,频率不需要太高吧!”那是电机控制,PWM用2K~10K即可【关于PWM的一些讲解,请见振南网站相关实验】。但是于音频来说,因为它电压变化要求比较精准,换句话说,我们要用PWM来产生一个DAC的效果。通过数字合成的方式产生出对应的模拟量。在理论上来说,对于音频PWM的频率要达到音频频率的20倍以上,也就是说对于一个音频采样点,在它的采集周期内,PWM要产生不低于20个PWM周期。这样,再加上PWM后级的一些滤波电路,隔直处理等,才能更接近于音频信号。
我们来看看常见的音频信号频率:
大部分的音频频率都几百HZ到10KHZ这个范围内,以10KHZ来说,20倍就是200KHZ。我们要让PWM的频率达到200KHZ,才能得到比较好的音频播放效果。
STC单处机最高工作频率为33MHZ,他的8位PWM的频率为33000K/256=130KHZ。可以看到,即使是硬件PWM也达不到200KHZ,但起码能用于音频。而IO模拟PWM,基于定时器与中断,因为涉及中断响应,出栈入栈,导致它PWM频率最高也就在4KHZ这个水平上。作一些惯性器件的控制也可以,比如电机、加温等,但是作音频,还是不行!
那有人问,我就用4KHZ PWM来作音频会怎么样?答:很可能根本没声音!
1、频率越低,越趋向于直流,交流特性越弱,根本就不了隔直电容;
2、频率太低,对音频采样点电压的合成不够,听到的很可能就是“呜呜”声!
所以,硬件PWM是必需的,IAP15W413AS(STC15W408AS)还是比较合适的选择。