资源描述
单击此处编辑母版标题样式,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单片机的输入输出模块,第六章,MSP430,单片机的输入输出模块,单片机中的输入,/,输出模块是供信号输入、输出所用的模块化单元。,MSP430,单片机的片内输入,/,输出模块非常丰富,典型的输入,/,输出模块有:通用,I/O,端口、模数转换模块、比较器、定时器与段式液晶驱动模块。本章重点讲述各典型输入,/,输出模块的结构、原理及功能,并针对各个模块给出简单的应用例程。,通用,IO,端口,(GPIO),6.1,模数转换模块,(ADC12),6.2,比较器,B(Comp_B),6.3,定时器,6.4,LCD_C,段式液晶驱动模块,6.5,6.1,通用,IO,端口,6.1.1 MSP430,端口概述,通用,I/O,端口是,MSP430,单片机最重要也是最常用的外设模块。通用,I/O,端口不仅可以直接用于输入,/,输出,而且可以为,MSP430,单片机应用系统提供必要的逻辑控制信号。,MSP430F5xx/6xx,系列单片机最多可以提供,12,个通用,I/O,端口(,P1,P11,和,PJ,),大部分端口有,8,个引脚,少数端口引脚数少于,8,个。每个,I/O,引脚都可以被独立地设置为输入或者输出引脚,并且每个,I/O,引脚都可以被独立地读取或者写入,所有的端口寄存器都可以被独立地置位或者清零。,P1,和,P2,引脚具有中断能力。从,P1,和,P2,端口的各个,I/O,引脚引入的中断可以独立地被使能,并且被设置为上升沿或者下降沿触发中断。所有,P1,端口的,I/O,引脚的中断都来源于同一个中断向量,P1IV,。同理,,P2,端口的中断源都来源于另一个中断向量,P2IV,。,可以对每个独立的端口进行字节访问,或者将两个结合起来进行字访问。端口组合,P1,和,P2,、,P3,和,P4,、,P5,和,P6,、,P7,和,P8,可结合起来称为,PA,、,PB,、,PC,和,PD,端口。当进行字操作写入,PA,口时,所有的,16,位数据都被写入这个端口;利用字节操作写入,PA,端口低字节时,高字节保持不变;利用字节指令写入,PA,端口的高字节时,低字节保持不变。其他端口也是一样。当写入的数据长度小于端口的最大长度时,那些没有用到的位保持不变。应用这个规则来访问所有端口,除了中断向量寄存器,P1IV,和,P2IV,,它们只能进行字节操作。,6.1,通用,IO,端口,6.1.2,通用,IO,端口输出特性,MSP430,单片机在默认输出驱动(,PxDS.y=0,,即欠驱动强度)且单片机供电电压,V,CC,为,3V,条件下,端口低电平和高电平的输出特性分别如图,6.1.1,和图,6.1.2,所示,其中,电流输入为正,输出为负。,图,6.1.1,低电平输出特性,(PxDS.y=0),图,6.1.2,高电平输出特性,(PxDS.y=0),6.1,通用,IO,端口,6.1.2,通用,IO,端口输出特性,当,PxDS.y,控制位被配置为,1,时,即单片机端口被配置为强驱动模式。在强驱动模式下,端口的低电平和高电平输出特性分别如图,6.1.5,和图,6.1.6,所示。,图,6.1.5,低电平输出特性,(PxDS.y=1),图,6.1.6,高电平输出特性,(PxDS.y=1),6.1,通用,IO,端口,6.1.3,端口,P1,和,P2,端口,P1,和,P2,具有输入,/,输出、中断和外部模块功能,可以通过设置它们各自的,9,个控制寄存器来实现这些功能。下面所述,Px,代表,P1,和,P2,。,1,输入寄存器,PxIN,输入寄存器是,CPU,扫描,I/O,引脚信号的只读寄存器,用户不能对其写入,只能通过读取该寄存器的内容获取,I/O,端口的输入信号,此时引脚的方向必须选定为输入。输入寄存器中某一位为,0,,表明该位输入为低;某一位为,1,,表明该位输入为高。,2,输出寄存器,PxOUT,该寄存器为,I/O,端口的输出缓冲寄存器。其内容可以像操作内存数据一样写入,以达到改变,I/O,口输出状态的目的。在读取时,输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。,0,:输出为低;,1,:输出为高。,6.1,通用,IO,端口,6.1.3,端口,P1,和,P2,3,方向寄存器,PxDIR,相互独立的,8,位分别定义了,8,个引脚的输入,/,输出方向。,8,位在,PUC,之后都被复位。使用输入或输出功能时,应先定义端口的方向,输入,/,输出才能满足设计者的要求。作为输入时,只能读;作为输出时,可读可写。,0,:输入模式;,1,:输出模式。,4,上拉,/,下拉电阻使能寄存器,PxREN,该寄存器的每一位可以使能相应,I/O,引脚的上拉,/,下拉电阻。该寄存器需和输出寄存器配合使用,才能完成上拉,/,下拉电阻的配置。,0,:上拉,/,下拉电阻禁止;,1,:上拉,/,下拉电阻使能。,5,输出驱动能力调节寄存器,PxDS,PxDS,寄存器的每一位可使相关引脚选择全驱动模式和次驱动模式(减弱驱动能力)。默认的是次驱动模式。,0,:次驱动模式;,1,:全驱动模式。,6,功能选择寄存器,PxSEL,P1,和,P2,端口还有其他片内外设功能,为了减少引脚,将这些功能与芯片外的联系通过复用,P1,和,P2,引脚的方式来实现。,PxSEL,用来选择引脚的,I/O,端口功能与外围模块功能。,0,:选择引脚为普通,I/O,功能;,1,:选择引脚为外围模块功能。,6.1,通用,IO,端口,6.1.3,端口,P1,和,P2,7,中断使能寄存器,PxIE,该寄存器的,8,位与该端口的,8,个引脚一一对应,其中每一位用以控制相应引脚的中断允许。,8,中断触发边沿选择寄存器,PxIES,如果允许,Px,口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的,8,位分别定义了,Px,口的,8,个引脚的中断触发沿。,9,中断标志寄存器,PxIFG,该寄存器有,8,个标志位,它们含有相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。如果,Px,的某个引脚允许中断,同时选择上升沿,则当该引脚发生由低电平向高电平跳变时,,PxIFG,的相应位就会置位,表明该引脚上有中断事件发生。,6.1,通用,IO,端口,6.1.4,端口,P3P11,这些端口没有中断能力,其余功能与,P1,、,P2,端口一样,能实现输入,/,输出功能和外围模块功能。每个端口有,6,个寄存器供用户使用,用户可通过这,6,个寄存器对它们进行访问和控制。每个端口的,6,个寄存器分别为:输入寄存器(,PxIN,)、输出寄存器(,PxOUT,)、方向选择寄存器(,PxDIR,)、输出驱动能力调节寄存器(,PxDS,)、上拉,/,下拉电阻使能寄存器(,PxREN,)和功能选择寄存器(,PxSEL,)。具体用法同,P1,和,P2,端口。,6.1,通用,IO,端口,6.1.5,端口的应用,端口是单片机中最经常使用的外设资源。一般在程序的初始化阶段对端口进行配置。配置时,先配置功能选择寄存器,PxSEL,,若为,I/O,端口功能,则继续配置方向寄存器,PxDIR,;若为输入,则继续配置中断使能寄存器,PxIE,;若允许中断,则继续配置中断触发沿选择寄存器,PxIES,。,需要注意的是,,P1,和,P2,端口的中断为多源中断,即,P1,端口的,8,位共用一个中断向量,P1IV,,,P2,端口的,8,位也共用一个中断向量,P2IV,。当,Px,端口上的,8,个引脚中的任何一个引脚有中断触发时,都会进入同一个中断服务程序。在中断服务程序中,首先应该通过,PxIFG,判断是哪一个引脚触发的中断,再执行相应的程序,最后还要用软件清除相应的,PxIFG,标志位。,6.1,通用,IO,端口,【,例,6.1.1,】,在,MSP430,单片机系统中,,P1.5,、,P1.6,、,P1.7,发生中断后执行不同的代码。,#pragma vector=PORT1_VECTOR /P1,口中断源,_ _interrupt void Port_1(void)/,声明一个中断服务程序,名为,Port_1(),if(P1IFG&BIT5)/,判断,P1,中断标志第,5,位,/,在这里写,P1.5,中断服务程序,if(P1IFG&BIT5)/,判断,P1,中断标志第,6,位,/,在这里写,P1.6,中断服务程序,if(P1IFG&BIT5)/,判断,P1,中断标志第,7,位,/,在这里写,P1.7,中断服务程序,P1IFG=0;/,清除,P1,所有中断标志位,6.1,通用,IO,端口,【,例,6.1.2,】,利用软件循环查询,P1.4,引脚的输入状态,若,P1.4,输入为高电平,则使,P1.0,输出高电平;若,P1.4,输入为低电平,则使,P1.0,输出低电平。该程序采用查询的方式检测按键是否被按下。为调试方便,,P1.0,引脚可接,LED,。,#include,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,P1DIR|=BIT0;/,设,P1.0,为输出方向,while(1)/,循环查询,P1.4,引脚输入状态,if(P1IN&BIT4),P1OUT|=BIT0;/,如果,P1.4,输入为高,则使,P1.0,输出高,else,P1OUT /,否则,使,P1.0,输出低电平,6.1,通用,IO,端口,【,例,6.1.3,】,利用按键外部中断方式,实现反转,P1.0,引脚输出状态。,P1.4,选择,GPIO,功能,内部上拉电阻使能,且使能中断。当,P1.4,引脚上产生下降沿时,触发,P1,端口外部中断,在中断服务程序中,反转,P1.0,端口输出状态。按键外部中断实时性较高,用途非常广泛,可以处理对响应时间要求比较苛刻的事件,在,【,例,6.1.2,】,程序中,若主循环一次的时间比较长,,P1.4,引脚置位时间比较短,则有可能在一个主循环周期内漏掉一次或多次,P1.4,引脚置位事件。因此在这种情况下,若采用,【,例,6.1.2,】,端口查询的方式,可能就无法满足设计的要求,应该采用按键外部中断的方式实现。,#include,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,P1DIR|=BIT0;/,设置,P1.0,引脚为输出,P1REN|=BIT4;,P1OUT|=BIT4;/,以上两句组合功能为使能,P1.4,引脚上拉电阻,P1IES|=BIT4;/P1.4,中断下降沿触发,P1IFG /,清除,P1.4,中断标志位,P1IE|=BIT4;/P1.4,中断使能,_ _bis_SR_register(LPM4_bits+GIE);/,进入,LPM4,,并使能全局中断,#pragma vector=PORT1_VECTOR,_ _interrupt void Port_1(void),P1OUT=BIT0;/,反转,P1.0,端口输出状态,P1IFG /,清除,P1.4,中断标志位,6.2,模数转换模块,(ADC12),6.2.1,模数转换概述,在,MSP430,单片机的实时控制和智能仪表等实际应用系统中,常常会遇到连续变化的物理量,如温度、流量、压力和速度等。利用传感器把这些物理量检测出来,转换为模拟电信号,再经过模数转换模块(,ADC,)转换成数字量,模拟量才能够被,MSP430,单片机处理和控制。,1,模数转换基本过程,首先连续时间输入信号,x,(,t,),输入,ADC,的采样保持器中,,ADC,每隔,T,s,(采样周期)读出一次,x,(,t,),的采样值,对此采样值进行量化。量化的过程是将此信号转换成离散时间、离散幅度的多电平信号。从数学角度理解,量化是把一个连续幅度值的无限数集合映射到一个离散幅度值的有限数集合。在进行,ADC,转换时,必须把采样电压表示为某个规定的最小数量单位的整数倍,所取的最小数量单位叫做量化单位,用,表示。显然,数字信号最低有效位(,LSB,)的,1,所代表的数量大小就等于,。把量化的结果用代码表示出来,这个过程称为编码。这些代码就是,ADC,转换的输出结果。,6.2,模数转换模块,(ADC12),2,ADC,的位数,ADC,的位数为,ADC,模块采样转换后输出代码的位数。例如,一个,12,位的,ADC,模块,采样转换后的代码即为,12,位,表示数值的取值范围为,0,4095,。,3,分辨率,分辨率表示输出数字量变化的一个相邻数码所需输入模拟电压的变化量。它定义为转换器的满刻度电压与,2,n,的比值,其中,n,为,ADC,的位数。因此,分辨率与,ADC,的位数有关。例如,一个,8,位,ADC,模块的分辨率为满刻度电压的,1/256,。如果满刻度输入电压为,5V,,该,ADC,模块的分辨率即为,5V/256=20mV,。分辨率代表了,ADC,模块对输入信号的分辨能力,一般来说,,ADC,模块位数越高,数据采集的精度就越高。,4,量化误差,量化误差是由于用有限数字对模拟数值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率,即,1/2LSB,。量化误差是无法消除的,但是,通过提高分辨率可以减少量化误差。,6.2,模数转换模块,(ADC12),5,采样周期,采样周期是每两次采样之间的时间间隔。采样周期包括采样保持时间和转换时间。采样保持时间是指,ADC,模块完成一次采样和保持的时间,转换时间是指,ADC,模块完成一次模数转换所需要的时间。在,MSP430,单片机的,ADC12,模块中,采样保持时间可通过控制寄存器进行设置,而转换时间一般需要,13,个,ADCCLK,的时间。,6,采样频率,采样频率,也称为采样速率或者采样率,定义为每秒从连续信号中提取并组成离散信号的采样个数,单位为赫兹,(Hz),。采样频率的倒数是采样周期。为了确定对一个模拟信号的采样频率,在此简单介绍采样定理。采样定理又称香农采样定理或者奈奎斯特采样定理,即在进行模数信号的转换过程中,当采样频率,f,s.max,大于信号中最高频率分量,f,max,的,2,倍时,(,f,s.max,2,f,max,),,采样之后的数字信号能保留原始信号中的信息。在一般应用中,采样频率应为被采样信号中最高频率的,5,10,倍。,6.2,模数转换模块,(ADC12),7,采样保持电路,采样保持电路(,S/H,或者,SH,)是模数转换系统中的一种重要电路,其作用是采集模拟输入电压在某一时刻的瞬时值,并在模数转换器进行转换期间保持输出电压不变,以供模数转换。该电路存在的原因在于模数转换需要一定时间,在转换过程中,如果送给,ADC,的模拟量发生变化,就不能保证采样的精度。为了简单起见,在此只分析单端输入,ADC,的采样保持电路,如图,6.2.1,所示。,图,6.2.1,采样保持电路示意图,采样保持电路有两种工作状态:采样状态和保持状态。当控制开关,S,闭合时,输出跟随输入变化,称为采样状态;当控制开关,S,断开时,由保持电容,C,维持该电路的输出不变,称为保持状态。,6.2,模数转换模块,(ADC12),8,多通道同步采样和分时复用,大多数单片机都集成了,8,个以上的,ADC,通道,这些单片机内部的,ADC,模块大多都是多通道分时复用的结构,其内部其实只有一个,ADC,内核,依靠增加模拟开关的方法轮流使用,ADC,内核,所以可以有多个,ADC,的输入通道。,MSP430,单片机也采用这种结构,如图,6.2.2,所示。,同步采样,ADC,实际就是多个完整独立的,ADC,。如图,6.2.3,所示为三通道同步采样,ADC,的示意图。每一组通道都有各自独立的采样保持电路和,ADC,内核,,3,个,ADC,模块共用控制电路和输入,/,输出接口。,图,6.2.2 MSP430,单片机集成的,ADC12,模块局部,图,6.2.3,三通道同步采样,ADC,示意图,6.2,模数转换模块,(ADC12),6.2.2 MSP430,单片机,ADC12,模块介绍,ADC12,模块的特性有:,高达,200ksps,的最大转换率;,无数据丢失的单调的,12,位转换器;,采样周期可由软件或定时器编程控制的采样保持功能;,软件或定时器启动转换;,可通过软件选择片内参考电压(,MSP430F54xx,:,1.5V,或,2.5V,,其他芯片:,1.5V,、,2.0V,或,2.5V,,注意此处只限,MSP430F5xx/6xx,系列单片机);,可通过软件选择内部或外部参考电压;,高达,12,路可单独配置的外部输入通道;,可为内部温度传感器、,AV,CC,和外部参考电压分配转换通道;,正或负参考电压通道可独立选择;,转换时钟源可选;,具有单通道单次、单通道多次、序列通道单次和序列通道多次的转换模式;,ADC,内核和参考电压都可独立关闭;,具有,18,路快速响应的,ADC,中断;,具有,16,个转换结果存储寄存器。,6.2,模数转换模块,(ADC12),ADC12,模块的结构框图如图,6.2.4,所示。,ADC12,模块支持快速的,12,位模数转换。该模块具有一个,12,位的逐次逼近(,SAR,)内核、模拟输入多路复用器、参考电压发生器、采样及转换所需的时序控制电路和,16,个转换结果缓冲及控制寄存器。转换结果缓冲及控制寄存器允许在没有,CPU,干预的情况下,进行多达,16,路,ADC,采样、转换和保存。,图,6.2.4 ADC12,模块结构框图,6.2,模数转换模块,(ADC12),6.2.3 MSP430,单片机,ADC12,模块操作,1,ADC12,的转换模式,ADC12,模块有,4,种转换模式,可以通过,CONSEQx,控制位进行选择,具体转换模式说明如表,6.2.1,所示。,ADC12CONSEQx,转换模式,操作说明,00,单通道单次转换,一个单通道转换一次,01,序列通道单次转换,一个序列多个通道转换一次,10,单通道多次转换,一个单通道重复转换,11,序列通道多次转换,一个序列多个通道重复转换,表,6.2.1,各种转换模式说明列表,6.2,模数转换模块,(ADC12),(,1,)单通道单次转换模式,该模式对单一通道实现单次转换。模数转换结果被写入由,CSTARTADDx,位定义的存储寄存器,ADC12MEMx,中。单通道单次转换的流程图如图,6.2.6,所示。当用户利用软件使,ADC12SC,启动转换时,下一次转换可以通过简单地设置,ADC12SC,位来启动。当有其他任何触发源用于转换时,,ADC12ENC,位必须在等待触发信号之前置位(上升沿)。其他的采样输入信号将在,ADC12ENC,复位并置位之前被忽略。,【,例,6.2.1】,单通道单次转换举例。,分析:本实例采用单通道单次转换模式,参考电压对选择:,V,R+,=AV,CC,、,V,R,-,=AV,SS,,,ADC12,采样参考时钟源选择内部默认参考时钟,ADC12OSC,。在主函数中,,ADC12,在采样转换的过程中,,MSP430,单片机进入低功耗模式以降低功耗,当采样转换完成,会自动进入,ADC12,中断服务程序,唤醒,CPU,并读取采样转换结果。最终实现当输入模拟电压信号大于,0.5,倍,AV,CC,时,使,P1.0,引脚输出高电平;否则,使,P1.0,引脚输出低电平。下面给出实例程序:,#include,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,ADC12CTL0=ADC12SHT02+ADC12ON;/,选择采样周期,打开,ADC12,模块,ADC12CTL1=ADC12SHP;/,使用采样定时器作为采样触发信号,ADC12IE=0 x01;/,使能,ADC,采样中断,ADC12CTL0|=ADC12ENC;/,置位,ADC12ENC,控制位,P6SEL|=0 x01;/,将,P6.0,引脚设为,ADC,输入功能,P1DIR|=0 x01;/,将,P1.0,引脚设为输出功能,while(1),ADC12CTL0|=ADC12SC;/,启动采样转换,_ _bis_SR_register(LPM0_bits+GIE);/,进入,LPM0,并启用全局中断,6.2,模数转换模块,(ADC12),#pragma vector=ADC12_VECTOR,_ _interrupt void ADC12_ISR(void),switch(_ _even_in_range(ADC12IV,34),case 0:break;/Vector 0:,无中断,case 2:break;/Vector 2:ADC,溢出中断,case 4:break;/Vector 4:ADC,转换时间溢出中断,case 6:/Vector 6:ADC12IFG0,if(ADC12MEM0=0 x7ff)/ADC12MEM=A0 0.5AVcc?,P1OUT|=BIT0;/P1.0=1,else,P1OUT /P1.0=0,_ _bic_SR_register_on_exit(LPM0_bits);/,退出低功耗模式,0,case 8:break;/Vector 8:ADC12IFG1,case 34:break;/Vector 34:ADC12IFG14,default:break;,6.2,模数转换模块,(ADC12),(,2,)序列通道单次转换模式,该模式对序列通道做单次转换。,ADC12,转换结果将顺序写入由,CSTARTADDx,位定义的以,ADCMEMx,开始的转换存储器中。当由,ADC12MCTLx,寄存器中,ADC12EOS,位定义的最后一个通道转换完成之后,整个序列通道转换完成。序列通道单次转换的流程图如图,6.2.7,所示。当,使用,ADC12SC,位启动转换时,下一次转换可以通过简单地设置,ADC12SC,位来启动。当有其他任何触发源用于开始转换,,ADC12ENC,位必须在等待触发信号前置位(上升沿)。其他的采样输入信号将在,ADC12ENC,复位并置位之前被忽略。,图,6.2.7,序列通道单次转换流程图,6.2,模数转换模块,(ADC12),【,例,6.2.2】,序列通道单次转换举例。,分析:本实例采用序列通道单次转换模式,选择的采样序列通道为,A0,、,A1,、,A2,和,A3,。每个通道都选择,AV,CC,和,AV,SS,作为参考电压,,采样结果被顺序存储在,ADC12MEM0,、,ADC12MEM1,、,ADC12MEM2,和,ADC12MEM3,中,,本实例程序最终将采样结果存储在,results,数组中。下面给出实例程序代码:,#include,volatile unsigned int results4;/,用于存储转换结果,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,P6SEL=0 x0F;/,使能采样转换通道,ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_2;/,打开,ADC12,设置采样时间间隔,ADC12CTL1=ADC12SHP+ADC12CONSEQ_1;/,选择采样定时器作为采样触发信号,采样模式选择序列通道单次转换模式,ADC12MCTL0=ADC12INCH_0;/ref+=AVcc,channel=A0,ADC12MCTL1=ADC12INCH_1;/ref+=AVcc,channel=A1,ADC12MCTL2=ADC12INCH_2;/ref+=AVcc,channel=A2,ADC12MCTL3=ADC12INCH_3+ADC12EOS;/ref+=AVcc,channel=A3,停止采样,ADC12IE=0 x08;/,使能,ADC12IFG.3,采样中断标志位,ADC12CTL0|=ADC12ENC;/,使能转换,while(1),ADC12CTL0|=ADC12SC;/,启动采样转换,_ _bis_SR_register(LPM4_bits+GIE);/,进入,LPM4,并使能全局中断,6.2,模数转换模块,(ADC12),#pragma vector=ADC12_VECTOR,_ _interrupt void ADC12ISR(void),switch(_ _even_in_range(ADC12IV,34),case 0:break;/Vector 0:,无中断,case 2:break;/Vector 2:ADC,溢出中断,case 4:break;/Vector 4:ADC,转换时间溢出中断,case 6:break;/Vector 6:ADC12IFG0,case 8:break;/Vector 8:ADC12IFG1,case 10:break;/Vector 10:ADC12IFG2,case 12:/Vector 12:ADC12IFG3,results0=ADC12MEM0;/,读取转换结果,自动清除中断标志位,results1=ADC12MEM1;/,读取转换结果,自动清除中断标志位,results2=ADC12MEM2;/,读取转换结果,自动清除中断标志位,results3=ADC12MEM3;/,读取转换结果,自动清除中断标志位,_ _bic_SR_register_on_exit(LPM4_bits);/,退出,LPM4,case 14:break;/Vector 14:ADC12IFG4,default:break;,6.2,模数转换模块,(ADC12),(,3,)单通道多次转换模式,单通道多次转换模式是在选定的通道上进行多次转换。,ADC,转换的结果被存入由,CSTARTADDx,位定义的,ADC12MEMx,寄存器中。在这种转换模式下,当每次转换完成后,CPU,必须读取,ADC12MEMx,寄存器的值,否则在下一次转换中,,ADC12MEMx,寄存器的值会被覆盖。单通道多次转换模式的流程图如图,6.2.8,所示。在此模式下,若复位,ADC12ENC,位,则在当前转换完成之后,转换将立即停止。同时设置,CONSEQx=0,和,ADC12ENC=0,,也可以立即停止当前的转换,但是,转换结果是不可靠的。,图,6.2.8,单通道多次转换模式流程图,6.2,模数转换模块,(ADC12),【,例,6.2.3】,单通道多次转换举例。,分析:本实例采用单通道多次转换模式,选择的采样通道为,A0,,参考电压选择,AV,CC,和,AV,SS,。在内存中开辟出,8,个,16,位内存空间,results,,将多次采样转换结果循环存储在,results,数组中。实例程序代码如下:,#include,#define Num_of_Results 8,volatile unsigned int resultsNum_of_Results;/,开辟,8,个,16,位内存空间,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,P6SEL|=0 x01;/,使能,A0,采样通道,ADC12CTL0=ADC12ON+ADC12SHT0_8+ADC12MSC;/,打开,ADC12,设置采样间隔,/,设置多次采样转换,ADC12CTL1=ADC12SHP+ADC12CONSEQ_2;/,选择采样定时器作为采样触发信号,采样模式选择单通道多次转换模式,ADC12IE=0 x01;/,使能,ADC12IFG.0,中断,ADC12CTL0|=ADC12ENC;/,使能转换,ADC12CTL0|=ADC12SC;/,启动转换,_ _bis_SR_register(LPM4_bits+GIE);/,进入,LPM4,并使能全局中断,6.2,模数转换模块,(ADC12),#pragma vector=ADC12_VECTOR,_ _interrupt void ADC12ISR(void),static unsigned char index=0;,switch(_ _even_in_range(ADC12IV,34),case 0:break;/Vector 0:,无中断,case 2:break;/Vector 2:ADC,溢出中断,case 4:break;/Vector 4:ADC,转换时间溢出中断,case 6:/Vector 6:ADC12IFG0,resultsindex=ADC12MEM0;/,读取转换结果,index+;/,计数器自动加,1,if(index=8),index=0;,case 8:break;/Vector 8:ADC12IFG1,default:break;,6.2,模数转换模块,(ADC12),(,4,)序列通道多次转换模式,序列通道多次转换模式用来进行多通道的连续转换。,ADC12,转换结果将顺序写入由,CSTARTADDx,位定义的以,ADCMEMx,开始的存储器中。当由,ADC12MCTLx,寄存器中,ADC12EOS,位定义的最后一个通道转换完成之后,一次序列通道转换完成,触发信号会触发下一次序列通道转换。序列通道多次转换模式的流程图如图,6.2.9,所示。,图,6.2.9,序列通道多次转换流程图,6.2,模数转换模块,(ADC12),【,例,6.2.4】,序列通道多次转换举例。,分析:本实例采用序列通道多次转换模式,选择的采样序列通道为,A0,、,A1,、,A2,和,A3,。每个通道都选择,AV,CC,和,AV,SS,作为参考电压,采样结果被自动顺序存储在,ADC12MEM0,、,ADC12MEM1,、,ADC12MEM2,和,ADC12MEM3,中。在本实例中,最终将,A0,、,A1,、,A2,和,A3,通道的采样结果分别存储在,A0results,、,A1results,、,A2results,、,A3results,数组中。下面给出实例程序代码:,#include,#define Num_of_Results 8,volatile unsigned int A0resultsNum_of_Results;,volatile unsigned int A1resultsNum_of_Results;,volatile unsigned int A2resultsNum_of_Results;,volatile unsigned int A3resultsNum_of_Results;,void main(void),WDTCTL=WDTPW+WDTHOLD;/,关闭看门狗,P6SEL=0 x0F;/,使能,ADC,输入通道,ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_8;/,打开,ADC12,设置采样间隔,/,设置多次采样转换,ADC12CTL1=ADC12SHP+ADC12CONSEQ_3;/,选择采样定时器作为采样触发信号,采样模式选择单通道多次转换模式,ADC12MCTL0=ADC12INCH_0;/ref+=AVcc,channel=A0,ADC12MCTL1=ADC12INCH_1;/ref+=AVcc,channel=A1,ADC12MCTL2=ADC12INCH_2;/ref+=AVcc,channel=A2,6.2,模数转换模块,(ADC12),ADC12MCTL3=ADC12INCH_3+ADC12EOS;/ref+=AVcc,channel=A3,停止采样,ADC12IE=0 x08;/,使能,ADC12IFG.3,中断,ADC12CTL0|=ADC12ENC;/,使能转换,ADC12CTL0|=ADC12SC;/,开始采样转换,_ _bis_SR_register(LPM0_bits+GIE);/,进入,LPM0,并启用中断,#pragma vector=ADC12_VECTOR,_ _interrupt void ADC12ISR(void),static unsigned int index=0;,switch(_ _even_in_range(ADC12IV,34),case 12:/Vector 12:ADC12IFG3,A0resultsindex=ADC12MEM0;/,读取,A0,采样结果,并自动清除中断标志位,A1resultsindex=ADC12MEM1;/,读取,A1,采样结果,并自动清除中断标志位,A2resultsindex=ADC12MEM2;/,读取,A2,采样结果,并自动清除中断标志位,A3resultsindex=ADC12MEM3;/,读取,A3,采样结果,并自动清除中断标志位,index+;/,计数器自动加,1,if(index=8),(index=0);,default:break;,6.2,模数转换模块,(ADC12),2,采样和转换,当采样触发信号,SHI,出现上升沿时将启动模数转换。,SHI,信号源可以通过,SHSx,位进行定义,有,4,种选择:,ADC12SC,、,Timer_A.OUT1,、,Timer_B.OUT0,、,Timer_B.OUT1,。,ADC12,支持,8,位、,10,位及,12,位分辨率模式,可以通过,ADC12RES,控制位进行选择,模数转换分别需要,9,、,11,及,13,个,ADC12CLK,周期。采样输入信号的极性用,ISSH,控制位来选择。采样转换信号,SAMPCON,可以来自于采样输入信号,SHI,或采样定时器,能够控制采样的周期及转换的开始。当,SAMPCON,信号为高电平时采样被激活,,SAMPCON,的下降沿将触发模数转换。,ADC12SHP,定义了两种不同的采样时序方法:扩展采样时序模式和脉冲采样时序模式。,6.2,模数转换模块,(ADC12),3,转换存储器,典型的模数操作通常用中断请求的方式来通知,ADC,转换的结束,并需要在下一次,ADC,执行前将转换结果转存到另一位置。,ADC12,中的,16,个转换存储缓冲寄存器(,ADC12MEMx,)使得,ADC,可以进行多次转换而不需要软件干预,这一点提高了系统性能,也减少了软件开销。,ADC12,模块的每个,ADC12MEMx,缓冲寄存器都可通过相关的,ADC12MCTLx,控制寄存器来配置,为转换存储提供了很大的灵活性。,SREFx,控制位定义了参考电压,,INCHx,控制位选择输入通道。当使用序列通道转换模式时,,ADC12EOS,控制位定义了转换序列的结束。,6.2,模数转换模块,(ADC12),4,使用片内集成温度传感器,如果需要使用,MSP430,单片机片内的温度传感器,用户可以选择模拟输入通道,INCHx=1010,。与选择外部输入通道一样,需要进行其他寄存器的配置,包括参考电压选择、转换存储寄存器选择等。温度传感器典型的转换函数如图,6.2.12,所示,该转换函数仅仅作为一个示例,实际的参数可以参考具体芯片的数据手册。当使用温度传感器时,采样周期必须大于,30,m,s,。温度传感器的偏移误差比较大,在大多数实际应用中需要进行校准。选择温度传感器会自动地开启片上参考电压发生器作为温度传感器的电源。但是,它不会使能,VREF+,输出或者影响作为模数转换的参考电压设置,温度传感器的参考电压设置与其他通道相同。,6.2,模数转换模块,(ADC12),图,6.2.12,片内集成温度传感器温度转换函数,寄存器名称,缩写,类型,访问方式,偏移地址,初始状态,ADC12,控制寄存器,0,ADC12CTL0,读,/,写,字访问,00h,0000h,ADC12,控制寄存器,1,ADC12CTL1,读,/,写,字访问,02h,0000h,ADC12,控制寄存器,2,ADC12CTL2,读,/,写,字访问,04h,0020h,ADC12,中断标志寄存器,ADC12IFG,读,/,写,字访问,0Ah,0000h,ADC12,中断使能寄存器,ADC12IE,读,字访问,0Ch,0000h,ADC12,中断向量寄存器,ADC12IV,读,字访问,0Eh,0000h,ADC12,缓冲寄存器,ADC12MEM0,15,读,/,写,字访问,20h
展开阅读全文