工作频率可动态调整的单片机系统设计_单片机论文
关键词:可编程cmos频率合成器 串行通讯 动态编程 ds1077
在单片机系统中,总希望单片机能够工作于最大频率,以提高系统的实时处理能力。但单片机系统工作频率越高,其耗电量及引起的电磁干扰也就越大,并且单片机工作频率的选择直接影响到rs232串行通讯。特别是在51单片机系统中,rs232串行通讯的使用往往决定了系统时钟选用,这使得在设计单片机系统时的灵活性大大降低。在很多情况下,希望设计出一个工作频率可根据任务的轻得实时改变,并且能够在各种工作频率下进行rs232串行通讯的单片机系统,它既能满足单片机的实时处理要求,又有利于降低系统的耗电量和电磁干扰。采用可编程cmos频率合成器ds1077后,设计这种系统变得简单了。
1 可编程cmos频率合成器ds1077
1.1 ds1077的引脚及其功能
ds1077是一个具有两种同步输出的单片机固定频率合成器。它不需要外接任何元件即可工作,允许通过二线串行接口频率合成器进行动态编程。ds1077的输出频率范围宽(8khz~133mhz),且在整个温度和电压变化范围内输出频率偏差小于1%。ds1077既可作为由控制器编程的两路同步频率合成器使用,也可以当作固定频率振荡器使用。控制器可通过编程片上的两个预标定器和一个除法器来调整两路同步输出频率。工作模式和输出频率的设定值存储于片上eeprom中。每次上电时,存储于eeprom中的值自动弹出到各个寄存器中,使ds1077工作于以前设定的初始状态。
引脚功能:
scl:串行时钟输入线(用于编程);
sda:串行数据输入、输出线(用于编程);
ctr1:控制out1输出允许或芯片掉电模式的多功能引脚;
crt0:控制out0输出允许、芯片掉电模式或mux选择的多功能引脚;
out1:参考频率输出引脚;
out0:主振荡频率输出引脚。
1.2 ds1077内部框图如图及工作原理
ds1077内部框图如图1所示。主要由内部主振荡器、2个预定标器、1个可编程除法器和3个控制寄存器四大部分组成。主振荡器产生的时钟信号mclk既可直接输出到out0,也可以经过p0预定标器分频后输出out0。另外时钟信号mclk经过p1预定标器分频后要么直接输出到out1,要么再经可编程除法器n分频后输出到out1。
主时钟信号mclk经过p0预定标器进行1、2、4或8分频后送入mux选择器。同时,主时钟信号mclk经过p1预定标器进行1、2、4或8分频后既可直接输出到out1引脚,又可输出到可编程除法器n进行2~1025之间的任一分频后送到out1引脚。
通过对控制寄存器进行编程,可决定ds1077输出频率和工作模式。控制寄存器的值存于片内的eeprom中,因此只有改变输出频率和工作模式时才需要对ds1077重新编程。
1.3 ds1077的控制寄存器
ds1077的控制包括mux寄存器、div寄存器和bus寄存器共3个寄存器。mux寄存器用于设置频率合成器的工作模式,div寄存器用于设置工作频率,bus寄存器用于设置总线控制方式。它们的设置方式如下:
mux寄存器(16位):
- | pdn1 | pdn0 | sel0 | en0 | 0m1 | 0m0 | 1m1 | 1m0 | div | - | - | - | - | - | - |
其中,标志位en0、sel0、pdn0和引脚ctrl0对输出out0的工作模式进行设定,如表1所示。标志位pdn1和引脚ctrl1对输出out1的工作模式进行设定,如表2所示。标志位div决定是否使用可编程除法器n。当div=1时,可编程除法器被忽略;如果div=0,可编程除法器正常工作。标志位0m1和0m0、1m1和1m0分别决定了预定标器p0和p1的分频比,如表3所示。
表1 输出out0的工作模式设定
en0 | sel0 | pdn0 | ctr0功能 |
0 | 0 | 0 | 掉电控制(ctr0=1进入掉电模式,ctr0=0时out0输出高阻) |
0 | 1 | 0 | out0输出选择(ctr0=1时out0输出mclk/m,ctr0=输出mclk) |
1 | 0 | 0 | out0输出允许(ctr0=1时out0输出高阻,ctr0=0输出mclk) |
1 | 1 | 0 | out0输出允许(ctr0=1时out0输出高阻,ctr0=0输出mclk/m) |
x | 0 | 1 | 掉电控制(ctr0=11进入掉电模式,ctr0=0时输出mclk) |
x | 1 | 1 | 掉电控制(ctr0=1进入掉电模式,ctr0=0时out0输出mclk/m) |
其中,mclk为内部振荡器产生的主时钟信号,mclk/m为主时钟信号经p0预定标器分频后的时钟信号。
表2 输出out1的工作模式设定
pdn1 | ctrl1功能 |
0 | out1输出允许(ctr1=1时out1输出,ctr1=0输出高阻) |
1 | 掉电控制(ctr1=1进入掉电模式,ctr1=0时out1输出) |
表3 p0和p1的分频比
0m1 | 0m0 | p0预定标器分频比 | 1m1 | 1m0 | p1预定标器分频比 |
0 | 0 | 1 | 0 | 0 | 2 |
0 | 1 | 2 | 0 | 1 | 4 |
1 | 0 | 4 | 1 | 0 | 6 |
1 | 1 | 8 | 1 | 1 | 8 |
div寄存器(16位):
n9 | n8 | n7 | n6 | n5 | n4 | n3 | n2 | n1 | n0 | x | x | x | x | x | x |
10位二进制数决定了除法寄存器的值n,10位二进制数的值加2就是n的值。例如:0000000000表示2分频,1111111111表示1025分频。
bus寄存器(8位):
- | - | - | - | wc | a2 | a1 | a0 |
如果wc=0,表示每次操作控制寄存器后自动保存到eeprom中;如果wc=1表示只有对控制寄存器进行写操作时才把值保存到eeprom中。a3a2a1代表该ds1077芯片在总线操作中的地址。因此,同一系统中最多可接入8个ds1077。,
2 系统硬件电路及工作原理
可编程cmos频率合成器ds1077在单片机系统中的硬件电路如图2所示。
在图2中,可编程cmos频率合成器ds1077的输出引脚out1接到单片机at89c51的xtl1引脚,单片机的xtl2引脚不接,ds1077的输出引脚out0不使用(在软件中禁止),crtl1和ctrl0接地。由于at89c51单片机没有二线串行接口,所以把ds1077的scl和sda接到单片机的p1.0和p1.1,用单片机的p1.0和p1.1模拟二线串行接口。
可编程cmos频率合成器ds1077设定为:引脚out0禁止使用;引脚out的输出频率略低于单片机的最高工作频率;bus寄存器的wc位置1(只有向频率合成器ds1077发出写命令时才把各个寄存器的值写入eeprom中)。这样,在每次启动单片机系统时,单片机总运行在较高的工作频率;当完成了系统的初始化后,单片机就可以根据工作情况重新设置适合的工作频率。在单片机工作过程中,最好不要向频率合成器ds1077发出写eeprom命令。因为重新设置工作频率即使超出了单片机的频率范围,造成单片机死机,由于寄存器的值没有写入eerom中,当重新启动时,单片机仍然能够工作;如果把错误的工作频率写入eeprom中,会造成系统不能重新启动,此时只能取下ds1077芯片,用其他工具对它进行重新编程。
3 系统频率改变对rs232串行通讯的影响及动态调整工作频率时的解决办法
在单片机系统中,时钟频率与rs232串行通讯有着密切的关系。例如,对于使用12mhz晶振的系统(早期的8051的最大工作频率是12mhz),表4显示了定时器1的自动重新载值与波特率之间的关系、与标准波特率的误差。
表4 定时器1的自动重装载值与波特率之间的关系、与标准波特率的误差
定时器1自动重装载值 | 实际波特率 | 理想值 | 波特率误差(%) |
255 | 31250 | 28800 | 8.5 |
254 | 15625 | 14400 | 8.5 |
253 | 10417 | 9600 | 8.4 |
249/250 | 4464 | 4800 | 7/88.5 |
243 | 2404 | 2400 | 0.16 |
波特率=2smod/32×{fosc/[12×(256-th1)]}
其中,fosc为振荡频率,smod为单片机的波特率倍增位,th1为定时器1的自动重装载值。
在rs232串行通讯时,波特率发生器的误差一般都不允许超过3%,否则就会造成通讯失败,也就是说在采用12mhz晶振的51系统中只能够使用2400波特率进行rs232通讯。显然这在很多情况下都不能满足系统需要。为了满足rs232串行通讯的需要,通常选用少数特殊频率的晶振,如11.059mhz和22.118mhz。这大大减小了波特率发生器的误差(见表5),但也使得设计的灵活性大大降低。
表5 特殊频率的晶振下波特率发生器的误差
定时器1的自动重装载值 | 波特率(fosc=11.059mhz) | 波特率(fosc=22.118mhz) | ||
实际波特率 | 理想值 | 实际波特率 | 理想值 | |
255 254 253 250 244 232 208 | 28799.5 14399.7 9599.8 4799.91 2399.95 1199.98 - | 28800 14400 9600 4800 2400 1200 - | - 28799.5 14399.6 9599.83 4799.91 2399.95 1199.98 | - 28800 14400 9600 4800 2400 1200 |
在使用ds1077芯片的系统中,这个问题变得简单了。ds1077芯片共有133mhz、125mhz、120mhz、100mhz、66.666mhz五种型号。下面以66.666mhz的ds1077x-66为例来介绍在各种工作频率下进行rs232串行通讯的实现方案。
由于ds1077在整个温度和电压变化范围内的频率偏差小于1%,加上ds1077的输出作为单片机时钟所产生的波特率与理想值之间的误差0.47%(66.666mhz除6即11.111mhz与理想频率11.059mhz之间的误差为0.47%),完全能够满足串行通讯3%的精度要求。表6列出了单片机系统工作在能够满足上述要求的各种频率下的波特率及此时定时器1的自动重装载值(该表由计算机模拟得出)。
如果单片机选用最高频率为40mhz的89c51,则可以把ds1077的可编程除法器n设置为2,即让单片机工作于33.333mhz。由表6可知,当定时器1的自动重装载值设置不同进,单片机系统可以分别以28.8kbps、14.4kbps、9600bps、4800bps、2400bps进行可靠的串行通讯。系统对单片机速度要求不高时,单片机则可以把n设置成3、6、9、18、36,则系统分别工作于22.222mhz、11.111mhz、7.0473mhz、3.7037mhz和1.85183mhz。值得一提的是,当单片机工作频率太低时,单片机只能以较低的波特率通讯。例如,当单片机工作在1.85183mhz时,串行通讯只能是2400bps或更低。当然,如果单片机不按这些标准波特率进行通讯或根本就不需要串行通讯,单片机系统的工作频率的选择范围也就更宽了。
表6 单片机波特率及定时器1的自动重装载值(波特率发生器误差全部为0.47%)
n值 | 工作频率(mhz) | 重装载值(28.8kbps) | 重装载值(14.4kbps) | 重装载值(9600bps) | 重装载值(4800bps) | 重装载值(2400bps) |
66.667 | 250 | 244 | 238 | 220 | - | |
2 | 33.333 | 253 | 250 | 247 | 238 | 220 |
3 | 22.222 | 254 | 252 | 250 | 244 | 232 |
4 | 16.666 | - | 253 | - | 247 | 238 |
6 | 11.111 | 255 | 254 | 253 | 250 | 244 |
9 | 7.4073 | - | - | 254 | 252 | 248 |
18 | 3.7037 | - | - | 255 | 254 | 252 |
36 | 1.85183 | - | - | - | - | 254 |
从上面的讨论可看出,在单牒同编程时只需把表6设计成工作频率表格存于程序存储器中。在需要改变工作频率时从表格中查出该频率所对应的n值和所需要的波特率对应的自动重装载值,通过n值计算出div寄存器的值写入到ds1077中,把系统的工作频率设置到了相应的值上;同时,用该自动重装载值对t1定时器进行设置,就能保证系统的rs232串行通讯。