|
楼主 |
发表于 2005-10-1 23:27:14
|
显示全部楼层
三秒钟的乐谱
—耳机自动阻抗识别开发手记(三)
剩下来就是单片机的选择了,综合成本和性能的要求,对单片机主要着眼点是分辨度要比较高(10bit),I/O腿不要太多(我们只需要控制6个继电器和不多的LED,而且大部分LED还是和继电器共用控制端的)。51类的单片机由于没有内置的10bit A/D转换器,只好PK掉;MICROCHIP家族中的PIC16F676正好满足这样要求:它只有14腿,具备10bit的A/D转换功能。PIC单片机本来都具备大电流驱动的I/O端口,可以直接驱动继电器,但是在“休眠”状态,不适合输出大电流,因此增加了一片达灵顿驱动芯片:ULN2003。
等我搭好了目标调试的洞板还没来得及写软件就接到出差的通知:到西南某地参加我们承担的一个数控项目的现场调试。
前段严重睡眠不足,接下来32小时的火车旅程,卧铺简直是疗养般的享受!要是by plane,三小时后就要干活啦,老板只知道我为公司节省了差旅费,却并不知道我的小九九(坏笑ing)!
目标地处偏僻的郊区,唯一的选择就是25元/晚的招待所。没有电话,空调打开要另外收费,不过房间倒挺大的,顶高至少有4米。比起我在东京住过的只有巴掌大却要两万多丹/晚的“富士屋HOTEL”,简直就是皇宫啦,不过在这里当“皇上”晚上却是要喂蚊子滴!——扯远啦,打住打住。。。
白天去现场调试,晚上接着写阻抗变换器的软件。手上除了本本和仿真器以外,什么工具都没有。洞板要修改接线,连切断导线的刀子都没有,还好我想起了“金属疲劳效应”,不断地弯折弯折。。。就断了^_^。
软件是这样考虑的:
1.初始化
2.设定1ms定时中断,以便在每毫秒启动A/D转换采集一次数据;
3.设定200ms定时,用来闪烁一个数据采集LDE指示灯;
4.设定3秒钟定时,所有采集、判断、处理在三秒钟内完成;
5.为了更准确地采集数据,采用了多重的数字滤波算法(这通常用于干扰严重的工控场合,但是MCU的资源在这里不用白不用)下面会详细叙述其工作过程。
MCU控制5个耳机阻抗转换继电器和一个采集输入继电器;5个表示阻抗的LED指示灯,和一个“Testing”以及一个“N-A”指示灯。“Testing”闪烁表示系统处于“测试状态”,测试完成后选中相应的切换继电器和阻抗指示灯。如果没有插上耳机,则所有的继电器关闭“N-A”指示灯亮(系统接音箱时就是这种状态)。
等我接上仿真器才发现:MICROCHIP 的ICD II 调试器所配的16F676专用仿真头无论如何也连不通,真是晕死!
没办法只好寄回福州贝能去修理(后来他们告诉我,仿真头没坏只是里面的软件升级了)。
好在ICD II 对于大部分的MUC都可以无需仿真头,我就用一个16F873A(28Pin)来临时代替14Pin的16F676做DEBUG调试,最后再修改寄存器的参数设定,再通过PICSTART Plus编程器写入16F676的芯片FLASH编程区。
花了两个晚上的时间,阻抗自动识别的软件开发告一段落。
具体工作过程如下:
一、上电以后,接通阻抗采样继电器,运放将耳机直流电阻上的直流分压经过LM833两级直流放大后输送给单片机的A/D采用输入端;
二、单片机在经过三秒钟的延时,等待电源电压稳定以后开始A/D采样,在等待中“Testing”灯以200毫秒的周期闪烁;
三、进入采样周期,MCU每个毫秒采样一次,每采样8次相加后除以8取算术平均值;
四、将三组每个8次采样取平均后的数据分别存储;
五、启动“多数表决”算法:即在三组数据中分别比较是否有相同的两组,如果没有(三人意见都不一样),返回第三步重新采样;
六、如果有两组相同的,说明“多数表决”有效(三个人中有两个意见一致即为多数);
七、根据采集的数据判断应该开启那一个阻抗的继电器,执行该判断,开启相应的继电器,并且点亮相应的指示灯,同时关闭采样继电器;
八、如果没有插入耳机,“N-A”指示灯亮;
九、系统完成“采样--判别--执行”过程,单片机进入“Sleep”状态。请注意:单片机进入Sleep将关闭时钟振荡器,从而避免了其对音频系统有可能造成的干扰;(忙活完了,MCU宝宝好好睡一觉吧^_^)。
十、单片机直到下一次上电才重新开始一次新的检测。
这样一来,小不点III的面板上就有一排(7个LED)指示灯,当你插入耳机,打开电源开关,“Testing”灯开始闪烁,三秒钟后耳机阻抗自动测试完毕,和你插入耳机阻抗相应的指示灯燃亮,耳放开始推动耳机工作。
它的一次工作只是在大约三秒钟的时间里完成,“0”与“1”的乐谱也就只需演奏三秒钟,就进入了“休止符”。。。【全文完】 |
|