MSP430实现近Σ-Δ高精度ADC设计[DIY]

楼主
MSP430实现近Σ-Δ高精度ADC设计[DIY]
【DIY 类型】: 建议推荐,属MSP430应用进阶。
【适合型号】: 适合不带ADC模块的MSP430单片机型号。
【DIY 难度】: 中级;适合有一定MSP430单片机应用基础以上的用户参与。
【制作材料】: MSP430单片机[建议不带ADC模块的]、少量的RC元件、显示模块等主材料。
【 描  述 】: 利用MSP430单片机的比较器、定时器及少量外围元件和软件设计成一个高精度近Σ-Δ模数转换器。适合于测量缓慢变化的量,如温度,压力,光,电压等。结合MSP430F1121 的超低功耗特点,比较适合于电池供电的便携式仪器。
【 内 容 1】:
摘要:介绍了一种利用MSP430 F1121 单片机构成的采用类似于Σ-Δ技术的高精度的单斜率AD。分析了工作原理和参数计算。提供了分辨率,精度,线性度,稳定性等性能的测试结果,并讨论了它们的影响因素和应用。
注:以下<<一种高精度单斜率AD及其单片机实现>>资料是转载网上,原作者未明;知原者的朋友可以联系我们给予注明。

一引言
AD 转换最常用的方法是逐次逼近法(SAR),转换时间固定且快速是其最大特点,但要明显提高分辩率有一定困难。积分型AD 有较强的抗干扰能力,但转换时间较长。而过采样Σ-ΔA/D 由于其高分辩率,高线性度及低成本的特点正得到越来越多的应用。TI 公司的MSP430F1121 单片机内带有一个模拟比较器,因此,只须外接一只电阻和电容即可构成一个类似于Σ-Δ技术的高精度单斜率AD。
二测量电路及过程
MSP430 于F1121 是16 位RISC 结构的FLASH 型单片机。有14 个双向I/O 口并兼有中断功能。一个16 位定时器,兼有计数和定时功能。一个模拟电压比较器。测量电路如图1 所示。
       [IMGA=0,absMiddle]../../upload/2006/11/18/024336.gif[/IMGA]

MSP430F1121 工作电压为1.8-3.6V。I/O口输出高电平时电压接近Vcc,低电平时接近Vss,因此,一个I/O 口可以看作一位DAC,具有PWM 功能。测量时P2.4 引脚接被测电压。P2.0 口输出一串占空比为50%,脉宽为Tp 的脉冲。当电容充电到Vout=Vin 时,比较器输出将翻转,这一过程称为预充电。此后为维持Vout=Vin,P2.0 继续输出脉冲。程序开始对总的输出脉冲数N 和输出为高的脉冲数n 进行计数。P2.0 口根据比较器的输出状态来决定是输出高还是低电平,如果比较器输出为低,表示Vout<Vin,则P2.0 口输出为高,反之,输出为低。当输出N 个脉冲后停
止计数,则此时高脉冲数n 与被测电压Vin 成正比。即以Vcc(这里为3.0V)对应于N(这里为3000)个脉冲,如果n 为1500,则Vin=1/2Vcc,即Vin 为1.5V,相应地,每个高脉冲代表1mV ,这样可以用于比例式测量和绝对值测量。

三原理分析
经预充电后,Vout=Vin,此后P2.0 在电容C 上反复充放电,虽然电容充放电是非线性的,但由于充放电幅度极小,只要满足RC>>Tp,则在一定精度内可以认为充放电过程是线性的。其波形如图2。      [IMGA=0,absMiddle]../../upload/2006/11/18/024357.gif[/IMGA]
图中虚线表示总的脉冲,实线是输出为高的脉冲,如果把相邻的高电平和相邻的低电平看成为一个脉冲,分别为TH1,TL1,TH2,TL2…虽然TH1=TH2=…和TL1=TL2=…不一定成立,但从总体效果来看,可以认为它们是等宽的。那么,n 个高电平和N-n 个低电平成了m 个大脉冲。

其中,TH=n/m*Tp,TL=(N-n)*Tp/m.

充电时,Vmax=Vcc+[Umin-Vcc]*exp (-TH/RC)

放电时, Umin=Umax*exp(-TL/RC)

由上两式得:
            Umax(1-exp(-(TH+TL)/RC)=Vcc(1-exp(-TH/RC))

在一定的误差范围内有Umax=Vin,则:
     Vin(1-exp(-(TH+TL)/RC)=Vcc(1-exp(-TL/RC))

在(TH+TL)/T<<1 时,指数项用泰勒级数展开后,得:
           Vin*N/m=VCC*n/m
           即Vin=n*VCC/N

五 参数计算
用Umax 分别减去式2 等式两边得:
DU=Umax-Umin=Umax(1-exp(-TL/RC))<<Vcc(1-exp(-TL/RC)〈〈Vcc(1-exp(-TP/RC)
如果DU=+-1LSB,在N=3000,主频为3.5MHZ 时,Tp 为14 个CPU 周期,约3.9us,
则RC=0.016   取R=470K,则C=0.035uF

六软件设计
测量子程序框图如图3 所示。P2.0 输出的脉冲宽度由程序中输出高或低电平的运行时间决定,因此应尽量缩短这段程序的执行时间,另外,P2.0 输出必须为对称的方波,如果程序中输出为高或为低的时间不一样,将会造成很大的误差。

        [IMGA=0,absMiddle]../../upload/2006/11/18/024425.gif[/IMGA]

程序中必须先设定一个总的采样时间N,它也决定了分辨率,执行一次测量子程序只运行N/2 的时间,因此,必须调用两次,把两次的高电平个数相加才为n。这样做的目的是为了利用MSP430F1121 单片机的模拟比较器特性,即在一次测量子程序调用后,内部交换同向和反向输入端的端口,以抵消比较器的输入偏置电压引起的误差。

七分辩率,精度,稳定性,线性度及影响因素
分辩率:由预设的总测量时间N 来决定,如果N 取4096(214BIT),则分辩率为14 位,如果N 取65535,则分辩率为16 位。分辩率的大小将影响测量时间,从而影响采样频率。在主频为3.578545Hz 时,一个Tp(即P20 口输出一个高或低电平)的时间为14 个CPU 周期,约为1/3578545=3.9us,则N=4096 时一次测量的时间为16ms, 如果N=65535,则一次测量的时间为256ms,这还不包括预充电时间,不是连续测量,则应考虑预充电时间。

精度:是实际测量结果和真实值之间的最大误差。真实值用分辩率为24 位的高精度测量仪测量的结果代替,实际测量结果为五次测量的平均。稳定性:在0-3V 之间均匀取15 个测量点,每个点在5 秒钟内测量5 次(液晶显示上读取5个测量值),取它们的最大差值为该测量点时的波动值,以15 个波动值中的最大值来衡量稳定性。

线性度:与基准曲线有关,选择的基准曲线不同所计算的线性度也不同,直观上我们的测量结果已有很高的线性度,因此我们采用端基法选择基准曲线,由于原理上的原因,端点附近的测量误差较大,因此我们选过1.0V 和2.0V 点的直线作为基准直线。

影响因素有:
1 电源电压VCC。
因为P2.0 输出高电平为VCC,程序中又以VCC 作为参考电压,因此,VCC 越稳定,测量结果越准确。一般经DC-DC 变换,稳压以后提供VCC。VCC 对绝对值测量影响较大,对相对值测量影响较小。
2 晶振频率。
晶振频率将影响CPU 时钟,CPU 运行越快,则Tp 越小,RC 相对越大,则越能满足近似的条件,误差应越小。CPU 执行加快,则采样频率可以相应提高。晶振的稳定性将影响P2.0 输出的方波的对称性,其影响同程序中输出高或低电压的时间不相等时一样。
3 RC 参数的影响。
理论上,RC 越稳定,则测量结果越稳定,实际上RC 的稳定性对测量结果的稳定性影响不大。图7 可以看出当我们在其他条件不变时,电容值在0.1UF 与0.001UF 之间变化时,测量的线性度基本上没有影响。而且,电容越小,则测量结果的稳性越好,我们认为原因可能是电容越大,则漏电流越大,造成电压波动越大。测量结果对RC 参数不敏感的特性也是Σ-Δ类技术的特点之一,具有很好的实际意义。
4 比较器的输入端失调电压。
比较器同向输入端和反向输入端均存在失调电压,由于测量过程中电容上的充放电波动幅度较小(理论上控制在+/-1LSB),与失调电压具有可比性,因此失调电压对测量精度的影响不可忽略。MSP430 由于内部可以进行输入端口的交换,经两次调用测量子程序后可以最大限度地抵消失调电压的影响。
5 噪声干扰
由于比较器的被测电压输入端(VIN)没有采样保持电路,因此,如果测量的是快变信号将会产生比较大的误差,同样,如果输入端引入了干扰,测量误差将增大。我们在用交流供电的高精度测量仪时,测量的相对精度变差。可以通过在输入端加滤波电容来减轻这种影响。
6 软件的影响
主要是采样子程序中P2.0 输出高或低电平不对称,占空比不是50%。图是输出高电平比输出低电平多2 个CPU 周期后的测量结果。原因可能是没有计算输出高或低电平的执行时间,如果两者不相等,可在时间短的一方加入空操作指令。另一个可能是在测量子程序运行时没有关闭其他中断,导致额外的充/放电时间。
八应用
适合于测量缓慢变化的量,如温度,压力,光,电压等。结合MSP430F1121 的超低功耗特点,比较适合于电池供电的便携式仪器。可以进行比例式测量和绝对值测量。进行绝对值测量时参考电压为VCC,只须在程序中预先指定对应于VCC 的N 值。
比例式测量中可以选择外部电压作为参考电压,也可以选择三种内部电压作为参考电压:1/2VCC,1/4VCC 和一个二极管压降电压。
图1 是一个最简单的测量系统,用HT1621 作为液晶驱动器,P1。0-P1。3 四个I/O口控制HT1621,后者可以驱动多达10 位七段LED。测量结果直接可以看到,实际上是一个具有12 位以上分辨率的毫伏表。
MSP430F1121 内部有4K FLASH 存储器,没有被程序占用部分可以作为数据存储器用,因此,可以把测量结果放入FLASH 存储器中,具有记忆和回放功能。MSP430F1121 还有一个16 位定时器,用它和一个I/O 口构成一个UART,用于发送测量结果,上传给PC 机,可以构成一个低采样频率的简易存储示波器。
1楼
【 内 容 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                        ; 从子程序中反回


2楼
【材料供应】: MSP430实现近Σ-Δ高精度ADC设计[DIY]
【材料供应】: 本论坛可以供应F1121最系统板和12332液晶显示模块给大家,详情请与DC联系。

   [imga]../../upload/2006/11/18/031501.gif[/imga]

   如想了解更多关于【MSP430单片机比较器A模块】
      http://www.microcontrol.cn/msp430/430module_compare.htm
 
   如果有网友已设计过此项目或在设计中,欢迎进来与我们分享过程心得。当然也期待着你的成功例程分享[em13]。

   本次DIY活动寻找着DIY主导着中...,如你有兴趣成为本次项目的主导者。欢迎你与我们联系。我们可以以本贴(楼三)作为最新公布贴。将不断更新本DIY项目的最新内容。[COLOR=red]请各位留意更新日期。[/COLOR]

   我也没做过此项目,也想跟大家一起参与....
3楼
    微控技术论坛原创 作者:chenjun
    调试过的Δ-Σ方法测量电压源程序。
    [IMGA]http://www.microcontrol.cn/mcbbs/images/upload/2006/12/11/162109.gif[/IMGA]
    参考电路图

    我的程序也是参照微控技术论坛中提供的一些论文,感谢微控论坛!所以贴出我的程序,供大家参考,至少这点经验,能缩短朋友们的开发时间。希望大家都能无私点,多多交流!
  若要了解MSP430实现ΣΔ ADC的详细原理,请到微控技术论坛上查看有关技术献文。
  文件:http://www.microcontrol.cn/datasheet/msp430/msp430base/MSP430_EGM_ADC.pdf
4楼
谢谢chenjun的再次分享,之前的SLOPE A/D例程我已整理好并放到MSP430精品区中供所有网友参考。关于这次的近Σ-Δ高精度ADC实现源程序我已将也整理放在MSP430精品区供大家使用参考。
5楼
[em09]版主在很多地方提到12332液晶,GOOGLE上找到的只有12232,是斑竹的笔误,还是我搞错了?

电脑版 Page created in 1.8750 seconds width 3 queries.