在线情况
  • 头像
  • 级别
  • 门派
  • 职务总版主
  • 声望+9
  • 财富5
  • 积分3065
  • 经验390701
  • 文章6744
  • 注册2006-03-07
【 内 容 2】
【 作  者 】: 季燕飞 段焕春

【 内 容 2】:
一. MSP430 系列单片机及其内置比较器介绍。
MSP430 是TEXAS INSTRUMENTS(TI)生产的16 位单片机的统称,该系列是一种RISC 结构的16 位单片机,其突出特点是功耗极低(在3V、1Mhz 的工作方式下,电流消耗为250uA,休眠方式时只有0.1uA 的电流);其次是它的内部资源相当丰富,全系列中总共包括以下模块:12-bit 、8 通道A/D 转换,带3-10 个单独的捕获/比较功能的定时器Timer_A和Timer_B,1-2 路USART 通讯口,多至160 段LCD 驱动器,硬件乘法器,模拟信号比较器,FLL 频率锁相环,2-3 个时钟系统等等。以上片内资源,可以极大限度的简化用户产品的设计。

下面就MSP430 内部资源之一的比较器作简要介绍:
   比较器电路原理图[1]
 [IMGA=0,absMiddle]http://www.microcontrol.cn/430images/M430Module/CA/CA1.gif[/IMGA]
 
   控制寄存器图[2]
 [IMGA=0,absMiddle]http://www.microcontrol.cn/430images/M430Module/CA/CA3.gif[/IMGA]
   
 [IMGA=0,absMiddle]http://www.microcontrol.cn/430images/M430Module/CA/CA4.gif[/IMGA]

MSP430的比较器是一种精密型比较器。一般来说,比较器在使用过程中会受到两种因素的困绕,第一种是比较器输入端的偏置电压的积累;另一种是两个输入端电压接近到一程度时,输出端会产生振荡。MSP430系列单片机的比较器在这两个问题上作了妥善的处理,在其应用中基本上消除了这两种因素的困绕。

MSP430系列单片机在比较器两输入端对应的单片机端口与片外输入信号的连接线路保持不变的情况下,可通过软件将比较器两输入端与对应的单片机端口的连接线路交换,并同时将比较器的输出极性变换(请参考图[1]),这样即保证了比较器的输出状态维持不变,同时又抵消了比较器的输入端累积的偏置电压。这一控制过程由图[2]中的控制寄存器CACTL1 中的CAEX 位来实现。当CAEX 在清零和置1 时,比较器的输入和输出的连接方式刚好相反,从而实现了对输入偏置电压的处理。

比较器的输出有两种选择,即连接内部的低通滤波或直接输出(请参考图[1])。当连上低通滤波器后,在比较器输入端,即使两比较电压非常接近,经过滤波后,也不会出现输出端的振荡现象,从而消除了第二种困绕,这一过程是通过图[2]中的控制寄存器CACTL2中的CAF 位的设置来实现的。

另外从功耗来考虑,比较器的电源可关断。在不用比较器时,清CAON 位,可切断比较器电源。比较器即可采用外基准,也可采用单片机内部的电压基准作为其参考电压,这一控制过程由图[2]中的控制寄存器CACTL1 中的CARSEL 位来实现,从而在电路设计上更加灵活。
        [IMGA=0,absMiddle]../../upload/2006/11/18/025341.gif[/IMGA]

二. 用MSP430 系列内置比较器实现高精度A/D。
图[3]是一个可直接使用的、性价比极高的A/D 转换方案。下面将作详细的文字说明:这是一个高精度的积分型A/D 转换,类似于∑—△技术。它的基本原理是用单一的I/O端口,执行1 位的数模转换(DAC),以比较器的输出作反馈,来维持Vout 与Vin 相等。如图[3]所示,产生1 位DAC 的电路为一路通用I/O 口,一个串联的电阻和电容。在电容上产生Vout.,要维持Vout=Vin,必须通过I/O 口对电容进行充放电,而确定为充电还是放电(即I/O 口输出高低电平)由比较器的输出来决定。这样A/D 形成了一个类似带负反馈的闭环系统。拿图[3]中的电路为例,当比较器输出为高电平时,说明Vout>Vin,此时应对电容放电,则I/O 口输出低电平;当比较器输出为低电平时,说明Vout<Vin,应对电容充电,则I/O 口输出高电平。

那么充、放电维持的时间怎样确定呢?其作法是每隔一个极短的且固定的时间t 后去查询比较器的输出状态,如果比较器的输出状态没变,则维持I/O 口的输出;当比较器的输出状态发生改变,则I/O 口的输出状态也应改变。因此,I/O 的某一状态(高/低电平)维持的时间可能是Xt(X 为整数),从而在整个A/D 转换过程中,形成了一系列的X1、X2、…、Xi、…、Xn。Xn 为一随机数,其值由比较器的输出状态而定。在每个单位时间t 后,如果I/O 口的输出如为高电平,则事先设定的计数加1,当A/D 转换完成后,记录下I/O 口输出高电平的次数为m。

那么一次A/D 转换完成的时间怎样确定呢?这主要取决于对A/D 转换精度的要求。当要求一个12 位的A/D,则其时间为4096t,即对比较器输出作4096 次查询,每次查询间隔时间为t(这一点可参考后面的程序及说明)。同样16 位的A/D 的时间为65535t。在此将对应转换精度要求的4096 或65535 设为N,并结合上文所述,N=X1+X2+......Xn。

那么结合电容的充放电的公式:V(t)=V(1-exp(-t/RC))

可对积分型A/D 作以下数学上的推断,从而求出Vin.

  N=X1+X2+.....Xn (1)

高电平的次数为m (2)

假设:

  Vin(t)=Vin (3)

根据Vout=Vin 和电容的充放电的公式可得:

   Vout(t)=Vin+m(Vcc-Vin)(1-exp(-t/RC))-(N-m)Vin(1-exp(-t/RC) (4)

    m(Vcc-Vin)(1-exp(-t/RC))为充电过程

   (N-m)Vin(1-exp(-t/RC)为放电过程

因此:

  Vin=Vcc·m/N (5)

上式成立的先决条件是:Vin 在短时间内是不变;且对确定Vout 的电容要预充电,在
开始进行A/D 转换前使Vout=Vin,即通过I/O 口对电容预充电使比较器在发生第一次翻转
后,开始进行积分A/D 转换。

如果对(5)式作一些处理,可使得A/D 转换的处理更加方便,如果电源电压Vcc 为3.0V,取N=3000,则分辨率为1mV,当m=1245 时,则Vin=1.245V,如果N=30000,则分辨率为0.1mV,m=12456 时,则Vin=1.2456V,这样只要通过对m 的确定就可以测得Vin 的值,避免了直接用公式(5)带来的计算上的麻烦。

三、用比较器做A/D 转换的原代码

       Comparator_Adc            ;比较器A/D 子程序

       mov.b #CAON,&CACTL1       ;开启片内比较器电源。

       Clr ADCData               ;清保存A/D转换结果的寄存器

       call #Sample_ADC          ;调用A/D转换子程序,1/2的转换时间。

       call #Sample_ADC          ;内部交换两输入信号后,再调用A/D转换子程序,
                                 ;1/2的转换时间。

 Meas_Over                       ;测量结束,ADCData中的值为测量结果。

       clr.b &CACTL1             ;关闭片内比较器电源。

       ret                       ;从子程序中反回。

;;----- A/D转换子程序
Sample_ADC

     mov &VCC_Cal,R15            ;确定A/D时间,VCC_Cal寄存器内的值与电源电压有关
                                 ;例,当VCC为3.2v时,VCC_Cal=3200。

     rra R15                     ;右移寄存器的值,变为1/2的A/D时间.

;;-----对电容进行预充电,使Vout=Vin
Pre_ADC

     bis.b #DAC_Out,&P2OUT      ;1位DAC对应的I/O口置高电平,对电容进行预充电。

C1
     bit.b #CAOUT,&CACTL2       ;判断比较器的输出是否为高电平

     jz C1                      ;如Vout<Vin,继续给电容冲电。

;;-----通过对比较器输出的判断,来调整1位DAC对应的I/O口的电平。
Test_DAC

     bit.b #CAOUT,&CACTL2       ;判断比较器的输出是否为高电平

     jnc Low1                   ;跳到I/O口输出高电平。

High

     bic.b #DAC_Out,&P2OUT      ;I/O口输出低电平。

Jmp Meas_

     Low1 bis.b #DAC_Out,&P2OUT ;I/O口输出高电平。

setc ;将进位位置1。

     Dadc ADCData               ;I/O口输出高电平时,ADCData加1。

Meas_

     dec R15                    ;A/D时间减1

     jnz Test_DAC               ;A/D时间未到,继续进行转换。

     bic.b #DAC_Out,&P2OUT      ;I/O口输出低电平,下一次转换作准备。

     xor.b #CAEX,&CACTL1        ;交换内部两输入信号,以便抵消偏置电压。

     ret                        ; 从子程序中反回


[ 此贴最后由DC在2009-5-12 13:29:49编辑过 ]
[COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
Powered by LeadBBS 9.2 .
Page created in 0.0781 seconds with 5 queries.