介绍了美国DALLAS公司推出的低功耗时钟芯片DS1307的结构和工作原理及其在太阳能电池控制系统中的应用。DS1307可以对年、月、日、时、分、秒进行计时,且具有闰年补偿等多种功能。太阳光线在不同的季节和不同时间其照射的方向及角度是不一样的,为了最有效地接收到太阳光,太阳能电池板必须随着季节和时间的变化而改变方向,实时钟芯片DS1307对于太阳能电池板控制系统的时间与日期的确定具有重要意义。
0 引言
很多控制系统都需要借助于时间和日期,太阳能电池(发电系统)的电池板控制就是其中最典型的一例。太阳光线在春、夏、秋、冬的不同季节以及一天的不同时段其光照的方向和角度都不一样,为了最大限度地发挥太阳能电池(发电系统)的作用,太阳能电池板必须随着季节和时间的变化而改变其方向,如图1所示是太阳能电池板在一天中的三个时间与太阳光线的位置关系。在设计太阳能电池板的控制系统时就要涉及到实时日期和时间,而实时钟芯片DS1307可以对年、月、日、时、分、秒进行准确计时,在系统中采用DS1307可很好地解决太阳能电池板控制的时间与日期问题。
1、DS1307的结构及工作原理
DS1307是美国DALLAS公司推出的一种高性能的实时时钟芯片,它是一个有56字节非易失SRAM的低功耗、全BCD码的时钟日历RTC(real-TImeclock)。其时钟具有12小时制和24小时制两种制式。其地址和数据信号可通过TWI双向总线(与I2C总线兼容)传输。
1.1、DS1307的管脚及功能定义
DS1307具有自动掉电保护和上电复位功能,可输出不同频率的方波信号,其引脚排列如图2所示。图中:
图2 ds1307引脚图
VCC:+5V电源;
VBAT:+3V电池电源输入;
X1,X2:32.768kHz的晶振输入端;
SDA:数据线;
SCL:时钟线;
SQW/OUT:方波信号输出端。
1.2、DS1307的内部寄存器及功能
DS1307RTC寄存器地址为00h到07h;RAM寄存器地址位于08h到3Fh。在多字节访问期间,如果地址到达RAM空间的结尾3Fh处,将发生卷绕,此时将定位到开始处即00h单元。DS1307的时间和日历信息要通过读取相应的寄存器来设置和初始化。如寄存器0的位7定义为振荡器的使能、停止位(CH):即CH=1,振荡器停止;CH=0,振荡器使能。而小时寄存器的位6则定义为12小时、24小时的选择位:即BIT6=1时为12小时格式,BIT5=1指示PM;BT6=0时为24小时格式,此时BIT5为第二个小时的指示位,且依赖于R/W的状态。DS1307内部有8个特殊寄存器即00H~07H单元,其中00H~06H分别为秒~年时间计数寄存器,07H为控制寄存器。控制寄存器07H单元用于控制芯片7脚产生不同频率的方波信号。具体作用如表1所示。
其中:OUT为控制位,SQWE是使能位。当SQWE=0时,如果OUT=0,则SQW/OUT引脚输出低电平,如果OUT=1,则SQW/OUT引脚输出为高电平。当SQWE=1时,由RS1,RS0决定引脚/OUT输出不同频率的方波信号。RS1,RS0与输出频率的关系如表2所示。
总线接口单元包括数据与地址移位寄存器TWDR,START/STOP控制器和总线仲裁判定硬件电路单元。TWDR寄存器用于存放发送或者接收的数据或者地址。除了8位的TWDR,总线接口单元还有一个寄存器,包含了用于发送或者接受应答的(N)ACK信号,这个寄存器不能由程序直接访问。当接收数据时,它可以通过TWI控制寄存器TWCR来复位或者清零;在发送数据时,(N)ACK的值由TWCR的值决定。
1.3 DS1307的数据交换及其格式
DS1307在TWI总线上作为一个从器件。通过执行一个START命令并且在验证器件地址后才可以访问。然后寄存器可以被访问直到执行一个STOP命令为止。
TWI的地址包格式:所有在TWI总线上传送的地址包长度均为9位,它包括7位地址位,1个R/W控制位和1个应答位ACK,如果R/W为1,则执行读操作。如果R/W为0,则执行写操作。从机被寻址后,必须在第9个SCL(ACK)周期通过拉低SDA做出应答,若从机忙或者无法响应主机,则应该在ACK周期保持SDA为高。然后主机可以发出STOP状态或者REPSTART状态重新开始发送。地址包包括从机地址和称为SLA+R或者SLA+W的READ或者WRITE位。地址字节的MSB首先被发送。所有1111xxxx的地址均保留,以便将来使用。
TWI的数据包格式:所有在TWI总线上传送的数据包长度均为9位,它包括8个数据位和一个应答位。在数据传送中,主机产生时钟及START与STOP状态,而接收器响应接收。应答是ACK在第9个SCL周期拉低SDA实现的。如果接收器使SDA为高,则发送NACK信号。如果接收器由于某种原因不能接受更多数据,应在最后一个数据字节后发出NACK信号告诉发送器停止发送,数据的MSB首先发送。
DS1307通过双向数据线SDA和时钟SCL与外界进行数据交换,从其时序关系可看出,DS1307有2种操作方式:
1)写操作:把SDA数据线上的数据按RAM指定的首地址(WordAddress)依次写入N个字节数据,首先主器件传输从器件的地址字节。紧跟着是一系列的数据字节。从器件每收到一个字节后返回一个应答位ACK。其格式如图3所示。
2)读操作:按RAM指定的首地址依次读出N个字节数据,主器件首先传送从器件地址。从器件返回一个应答位。随后是从器件传输的一系列数据字节,主器件收到除最后一个字节外的所有字节后返回一个应答位。在收到最后一个字节后,返回一个“非应答位”NACK。其格式如图4所示。
其中:S为起始信号(START),1101000为DS1307的口地址,A为应答信号ACK,/A为非应答信号NACK,P为停止信号(STOP)。主器件产生所有的串行时钟和START、STOP条件,通过传输STOP和重发START条件来停止。
2、太阳能电池控制系统的工作原理及与DS1307的硬件接口
微控制器选用Atmel公司的AVR单片机AT2Mega8,主要是利用了ATMega8芯片的高性能、低功耗、接口丰富的特点。它有两线制串行接口TWI模块用于与DS1307接口,有PWM口用于太阳能电池板步进电机的转动控制,有10位的A/D接口用于太阳光线传感器及与上位机的通信接口。要有最高效的太阳能接收效率,通过计算,太阳能电池板与太阳光线的角度应在某一范围内。太阳光线传感器与太阳能电池板在同一平面,主要用于太阳光线的跟踪,由太阳光线传感器可以得到太阳能电池板与太阳光线入射角间的关系。根据这两者间的差距,采用一种模糊控制算法来驱动太阳能电池板步进电机,可以使太阳能电池板与太阳光线的角度控制在最佳范围内。
ATMega系列单片机片内集成两线制串行接口模块,Atmel称它为TWI接口。事实上TWI与PHILIPS的I2C总线是同一回事。AVR硬件实现的TWI接口是面向字节和基于中断的,相对软件模拟I2C总线有更好的实时性和代码效率,引脚输入部分还配有毛刺抑制单元,可去除高频干扰。如图5是DS1307与AVR单片机ATMega8的硬件接口电路原理图。
3、DS1307在太阳能电池控制系统的软件接口
软件设计中,首先要对AVR单片机ATMega8与实时钟芯片DS1307进行初始化,给DS1307准确的日期和时间。控制过程中,通过读DS1307的日期与时间,结合太阳能电池板与太阳光线入射角间的关系,通过一种模糊控制算法计算出步进电机最佳的转动方向和角度。
结合AVRI/0端口功能,在TWI使能时可设置SCL和SDA引脚对应的I/O口内部上拉电阻有效,这样可省去I2C要求的两个外部上拉电阻。不论主控模式还是被控模式,都应当将TWI控制寄存器TWCR的TWEN位置1从而使能TWI模块。TWEN位被置位后,I/O引脚PC5和PC4被转换成SCL和SDA,对TWI控制寄存器TWCR的操作可在总线上产生START和STOP信号,从一个START到STOP被认为是主控模式的行为。将TWI地址寄存器TWAR的第一位TWGCE置有效,同时将TWI控制寄存器TWCR的TWEA(应答允许)位置1,TWI模块就可以对总线上对它的寻址做出应答,并置状态字。对TWI模块的操作均为寄存器的读写操作,Avr-libc没有提供专门的API,可以利用基于USART的标准I/O实现对DS1307读写日历和时钟。下面这段程序是接口操作的部分代码:
//初始化TWI功能
voidRtcInit(void)
{
TWBR=73;
}
//更新或读取DS1307日历/时间数据
ucharRtcUpdateData(uchardirecTIon);
{
ucharret;
if(direcTIon)//读
ret=rtc_read(0,g_aTImeBuf,7);
else//写
ret=rtc_write(0,g_aTimeBuf,7);
returnret;
}
//读DS1307用户RAM
ucharRtcReadRAM(ucharaddr,uchar3buf,ucharlen);
{
addr+=8;
returnrtc_read(addr,buf,len);
}
//写DS1307用户RAM
ucharRtcWriteRAM(ucharaddr,uchar3buf,ucharlen);
{
addr+=8;
returnrtc_write(addr,buf,len);
}
ucharbyte_bintobcd(ucharbin);
{
ucharret;
bin&=0x7f;
bin%=100;
ret=bin/10;
ret《《=4;
ret|=bin%10;
returnret;
}
ucharbyte_bcdtobin(ucharbcd);
{
ucharret;
ret=bcd&0x0f;
ret+=(bcd》》4)310;
returnret;
}
从程序中可以看出,TWI的读和写都是通过置位TWINT来实现的,原因是当总线上起动开始条件后写入的第一个字节中已经有了本次操作的传输方向,TWI模块记住了这一标记,从而决定了下一步操作是读还是写。
4、结束语
采用DS1307与AVR单片机ATMega8相配合能很好地解决太阳能电池(发电系统)控制装置的时间与日期问题。为太阳能电池板的控制提供了准确的时间与日期的依据。