如果波形调制是单一频率的,调制程序可以非常简单,只要编制顺序程序就可以了。如果波形调制的频率是变化的,就需要根据串行数据“0”或“1”的变化来改变每个时段的延时时间。在MCS-51单片机中,串行数据流是由软件设置,硬件自动产生,由TXD自动发出的。TXD的高低电平变化可以通过单片机的程序测得。根据这一特性,可以通过不断检测TXD的高低电平变化来决定每个时段的延时时间。程序流程如图5所示。
从流程图5可以看出,在每个相位中,单片机将Px.x置“1”或置“0”后都要判断TXD的电平,以确定相应延时的机器周期数。在某个相位TXD电平开始改变时,程序就从这个相位改变脉冲的延时时间,而程序中相位执行的次序并不改变。所以在TXD的电平改变时,两种频率的正弦波信号在同一个相位上交接。因此,FSK调制相位是连续的,见图6。
编程时必须注意,程序不论走哪条分支,所用的机器周期数都必须跟踪计算,最终所用的机器周期数必须符合表2的要求。另外,在进行FSK调制前应该增加一定长度的980Hz 的载波信号(PWM980)作为前导码信号。在数据发送完之后还应该增加一定长度的PWM980作为停止位,因为单片机的TI标志出现在数据帧停止位的前沿。
4 波形的优化
图4中B端的波形也就是带有锯齿的正弦波,是PWM调制经一阶滤波后产生的波形。该波形已具有了正弦波的大致形状,但锯齿也很明显,它和图2的阶梯波有些相似。通过前面的分析和表1的比较知道,增加PWM调制的时段分割数可以提高正弦波的波形精确度。
对于时段分割应该选择一个适当的数字。分割太粗,波形的失真就会严重,给滤波带来困难;分割过细会增加程序所占的空间。另一方面,时段的分割也不可能无限加大,因为采用软件延时时,延时时间的最高分辨率为1个机器周期。从表2也可以看到,在第4和第6时段出现了最小脉宽为1个机器周期的情况,而在第5时段甚至出现了只有高电平没有低电平的现象。如果继续细分时段,将会出现更多的只有一种电平的脉宽而另一种电平脉宽长度为0的现象。按上述等分时段的方法,如果不提高单片机的晶振频率,20个时段的分割已达到极限。所以不能单纯地采用细分时段的方法来提高波形的精度。
从图4中带有锯齿的正弦波可以看出,锯齿的大小在整个波形上不是处处相等的,波峰左侧的锯齿要比右侧的锯齿小得多。
从图2的阶梯波形可以看出,当阶梯波的精度最高时,应该是电压的步长或时间的步长之一为最小,而不是电压步长与时间步长之和为最小,当然更不能是电压或时间的任何步长为0。同样,用脉宽波表示正弦波时,精度最高的表示方法应该是“0、1”之一的脉宽为最小,而不一定是“0、1”脉宽之和为最小,也不能是“0、1”之一的脉宽为0。