话说开学了忙到爆。。一星期也就有几个钟头可以折腾折腾我的破烂。。鉴于今年准备在学校搞双圈演出。。做出双圈的音乐灭弧是第一步。。
先讲下大概原理
发射端部分:
使用旋转编码器做信号输入,这次没用好多人都在用的单片机解码。。主要是因为51太鸡肋资源给生成输出信号就差不多了。。况且两个中断源都在用,不太可能用查询io法烧资源,于是乎就憋出来了这个解码器
科普一下,旋转编码器有很多种,光电的一般用在鼠标滚轮什么的,磁的用在马达测速什么的,接触式的就是我用的一般在家用电器上比较多。
至于输出信号,其实就是两组开关轮流开关,这样上拉之后旋转起来就会有相位差在45-90度之间的两组信号,由于开关顺序因素,顺时针a回领先b,逆时针b会领先a
于是乎这俩d触发器就出场了,先出高电平的数据会把对应的输出拉高,同时一直压着另一个输出的clr使其无法触发,带45度以后另外一组信号进来就把一开始被触发的触发器拉低,生成一个脉冲,由于第二个信号入场时第一组信号还压着第二组的clr,所以第二组所对应的信号不会触发。
参见原理图,后面的门和555纯属为了省空间用,三个门为两组不可能同时有信号的输出分享一个555然后再把修正好的触发信号发给单片机。
编码器输入部分就这样,在普通灭弧模式时候是通过t0定时生成频率,重装是装入和编码器相关的变量freq以达到用编码器控制频率的效果。每当定时器t0中断以后运行send函数给sbuf赋值,我给串口八位是这么安排的,最高位和次高为为声道使能位,比如最高为1左声道有输出,0则无。剩下滴六位为数据位,传输otime数据给接收端,最大值63,我把otime变量乘十便是10us-630us可调的otime区段,满足一般应用。
传输媒介为光纤,就是把串口数据从光纤发出去。
音乐模式时,如果两个中断输入同时变低,则触发高优先级中断然后软件查询补偿优先级,同时串口发11XXXXXX(xx为otime数据)在接收端为了防止两个定时器由于装了同样的otime值而倒置定时结束时由于优先级问题输出没能被关断,固在接收端给低优先级定时器装值是始终+5us以便单片机处理。如此一来就可以达成两组不同步的音乐数据用过一个串口发射出去再根据使能位解出来。
同时,接收端和发射端都是用高波特率传输,以防频率高时串口数据重叠死机。
大概就是这些了,调试时候遇到好多麻烦的说,今天还泥马病了= =带病调试终于调好了。。
一般模式演示+讲解【中国话说的不好勿喷】
编码器原理讲解
[flash=640,480]XXXXXXXXXXXXXXXXXXXXXXX/XXXXXXXXXp/sid/XNDYyMTc0MjEy/v.swf target="_blank" style="font-size:20px;">点击此处查看视频编码器解码系统模拟
proteus模拟.rar
24.95KB
RAR
27次下载
程序老规矩,开源之,欢迎改进
【完】
200字以内,仅用于支线交流,主线讨论请采用回复功能。