单片机的输入输出模块_第1页
单片机的输入输出模块_第2页
单片机的输入输出模块_第3页
单片机的输入输出模块_第4页
单片机的输入输出模块_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机的输入输出模块第一页,共一百二十四页,2022年,8月28日第六章MSP430单片机的输入输出模块

单片机中的输入/输出模块是供信号输入、输出所用的模块化单元。MSP430单片机的片内输入/输出模块非常丰富,典型的输入/输出模块有:通用I/O端口、模数转换模块、比较器、定时器与段式液晶驱动模块。本章重点讲述各典型输入/输出模块的结构、原理及功能,并针对各个模块给出简单的应用例程。通用IO端口(GPIO)6.1模数转换模块(ADC12)6.2比较器B(Comp_B)6.3定时器6.4LCD_C段式液晶驱动模块6.5第二页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.1MSP430端口概述通用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,它们只能进行字节操作。第三页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.2通用IO端口输出特性MSP430单片机在默认输出驱动(PxDS.y=0,即欠驱动强度)且单片机供电电压VCC为3V条件下,端口低电平和高电平的输出特性分别如图和图所示,其中,电流输入为正,输出为负。

图6.1.1低电平输出特性(PxDS.y=0)图6.1.2高电平输出特性(PxDS.y=0)第四页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.2通用IO端口输出特性当PxDS.y控制位被配置为1时,即单片机端口被配置为强驱动模式。在强驱动模式下,端口的低电平和高电平输出特性分别如图和图所示。

图6.1.5低电平输出特性(PxDS.y=1)图6.1.6高电平输出特性(PxDS.y=1)第五页,共一百二十四页,2022年,8月28日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:输出为高。第六页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.3端口P1和P23.方向寄存器PxDIR相互独立的8位分别定义了8个引脚的输入/输出方向。8位在PUC之后都被复位。使用输入或输出功能时,应先定义端口的方向,输入/输出才能满足设计者的要求。作为输入时,只能读;作为输出时,可读可写。0:输入模式;1:输出模式。4.上拉/下拉电阻使能寄存器PxREN该寄存器的每一位可以使能相应I/O引脚的上拉/下拉电阻。该寄存器需和输出寄存器配合使用,才能完成上拉/下拉电阻的配置。0:上拉/下拉电阻禁止;1:上拉/下拉电阻使能。5.输出驱动能力调节寄存器PxDSPxDS寄存器的每一位可使相关引脚选择全驱动模式和次驱动模式(减弱驱动能力)。默认的是次驱动模式。0:次驱动模式;1:全驱动模式。6.功能选择寄存器PxSELP1和P2端口还有其他片内外设功能,为了减少引脚,将这些功能与芯片外的联系通过复用P1和P2引脚的方式来实现。PxSEL用来选择引脚的I/O端口功能与外围模块功能。0:选择引脚为普通I/O功能;1:选择引脚为外围模块功能。第七页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.3端口P1和P27.中断使能寄存器PxIE该寄存器的8位与该端口的8个引脚一一对应,其中每一位用以控制相应引脚的中断允许。8.中断触发边沿选择寄存器PxIES如果允许Px口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的8位分别定义了Px口的8个引脚的中断触发沿。9.中断标志寄存器PxIFG该寄存器有8个标志位,它们含有相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。如果Px的某个引脚允许中断,同时选择上升沿,则当该引脚发生由低电平向高电平跳变时,PxIFG的相应位就会置位,表明该引脚上有中断事件发生。第八页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.4端口P3~P11这些端口没有中断能力,其余功能与P1、P2端口一样,能实现输入/输出功能和外围模块功能。每个端口有6个寄存器供用户使用,用户可通过这6个寄存器对它们进行访问和控制。每个端口的6个寄存器分别为:输入寄存器(PxIN)、输出寄存器(PxOUT)、方向选择寄存器(PxDIR)、输出驱动能力调节寄存器(PxDS)、上拉/下拉电阻使能寄存器(PxREN)和功能选择寄存器(PxSEL)。具体用法同P1和P2端口。第九页,共一百二十四页,2022年,8月28日6.1通用IO端口6.1.5端口的应用

端口是单片机中最经常使用的外设资源。一般在程序的初始化阶段对端口进行配置。配置时,先配置功能选择寄存器PxSEL,若为I/O端口功能,则继续配置方向寄存器PxDIR;若为输入,则继续配置中断使能寄存器PxIE;若允许中断,则继续配置中断触发沿选择寄存器PxIES。需要注意的是,P1和P2端口的中断为多源中断,即P1端口的8位共用一个中断向量P1IV,P2端口的8位也共用一个中断向量P2IV。当Px端口上的8个引脚中的任何一个引脚有中断触发时,都会进入同一个中断服务程序。在中断服务程序中,首先应该通过PxIFG判断是哪一个引脚触发的中断,再执行相应的程序,最后还要用软件清除相应的PxIFG标志位。第十页,共一百二十四页,2022年,8月28日6.1通用IO端口【例】在MSP430单片机系统中,P1.5、P1.6、P1.7发生中断后执行不同的代码。#pragmavector=PORT1_VECTOR //P1口中断源__interruptvoidPort_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所有中断标志位}第十一页,共一百二十四页,2022年,8月28日6.1通用IO端口【例】利用软件循环查询P1.4引脚的输入状态,若P1.4输入为高电平,则使P1.0输出高电平;若P1.4输入为低电平,则使P1.0输出低电平。该程序采用查询的方式检测按键是否被按下。为调试方便,P1.0引脚可接LED。#include<msp430f5529.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

P1DIR|=BIT0;//设P1.0为输出方向

while(1)//循环查询P1.4引脚输入状态

{if(P1IN&BIT4)P1OUT|=BIT0;//如果P1.4输入为高,则使P1.0输出高

elseP1OUT&=~BIT0;//否则,使P1.0输出低电平

}}第十二页,共一百二十四页,2022年,8月28日6.1通用IO端口【例】利用按键外部中断方式,实现反转P1.0引脚输出状态。P1.4选择GPIO功能,内部上拉电阻使能,且使能中断。当P1.4引脚上产生下降沿时,触发P1端口外部中断,在中断服务程序中,反转P1.0端口输出状态。按键外部中断实时性较高,用途非常广泛,可以处理对响应时间要求比较苛刻的事件,在【例】程序中,若主循环一次的时间比较长,P1.4引脚置位时间比较短,则有可能在一个主循环周期内漏掉一次或多次P1.4引脚置位事件。因此在这种情况下,若采用【例】端口查询的方式,可能就无法满足设计的要求,应该采用按键外部中断的方式实现。#include<msp430f5529.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

P1DIR|=BIT0;//设置P1.0引脚为输出

P1REN|=BIT4;P1OUT|=BIT4;//以上两句组合功能为使能P1.4引脚上拉电阻

P1IES|=BIT4;//P1.4中断下降沿触发

P1IFG&=~BIT4;//清除P1.4中断标志位

P1IE|=BIT4;//P1.4中断使能

__bis_SR_register(LPM4_bits+GIE);//进入LPM4,并使能全局中断}#pragmavector=PORT1_VECTOR__interruptvoidPort_1(void){P1OUT^=BIT0;//反转P1.0端口输出状态

P1IFG&=~BIT4;//清除P1.4中断标志位}第十三页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)6.2.1模数转换概述在MSP430单片机的实时控制和智能仪表等实际应用系统中,常常会遇到连续变化的物理量,如温度、流量、压力和速度等。利用传感器把这些物理量检测出来,转换为模拟电信号,再经过模数转换模块(ADC)转换成数字量,模拟量才能够被MSP430单片机处理和控制。1.模数转换基本过程首先连续时间输入信号x(t)输入ADC的采样保持器中,ADC每隔Ts(采样周期)读出一次x(t)的采样值,对此采样值进行量化。量化的过程是将此信号转换成离散时间、离散幅度的多电平信号。从数学角度理解,量化是把一个连续幅度值的无限数集合映射到一个离散幅度值的有限数集合。在进行ADC转换时,必须把采样电压表示为某个规定的最小数量单位的整数倍,所取的最小数量单位叫做量化单位,用Δ表示。显然,数字信号最低有效位(LSB)的1所代表的数量大小就等于Δ。把量化的结果用代码表示出来,这个过程称为编码。这些代码就是ADC转换的输出结果。第十四页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)2.ADC的位数ADC的位数为ADC模块采样转换后输出代码的位数。例如,一个12位的ADC模块,采样转换后的代码即为12位,表示数值的取值范围为0~4095。3.分辨率分辨率表示输出数字量变化的一个相邻数码所需输入模拟电压的变化量。它定义为转换器的满刻度电压与2n的比值,其中n为ADC的位数。因此,分辨率与ADC的位数有关。例如,一个8位ADC模块的分辨率为满刻度电压的1/256。如果满刻度输入电压为5V,该ADC模块的分辨率即为5V/256=20mV。分辨率代表了ADC模块对输入信号的分辨能力,一般来说,ADC模块位数越高,数据采集的精度就越高。4.量化误差量化误差是由于用有限数字对模拟数值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率,即1/2LSB。量化误差是无法消除的,但是,通过提高分辨率可以减少量化误差。第十五页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)5.采样周期采样周期是每两次采样之间的时间间隔。采样周期包括采样保持时间和转换时间。采样保持时间是指ADC模块完成一次采样和保持的时间,转换时间是指ADC模块完成一次模数转换所需要的时间。在MSP430单片机的ADC12模块中,采样保持时间可通过控制寄存器进行设置,而转换时间一般需要13个ADCCLK的时间。6.采样频率采样频率,也称为采样速率或者采样率,定义为每秒从连续信号中提取并组成离散信号的采样个数,单位为赫兹(Hz)。采样频率的倒数是采样周期。为了确定对一个模拟信号的采样频率,在此简单介绍采样定理。采样定理又称香农采样定理或者奈奎斯特采样定理,即在进行模数信号的转换过程中,当采样频率fs.max大于信号中最高频率分量fmax的2倍时(fs.max≥2fmax),采样之后的数字信号能保留原始信号中的信息。在一般应用中,采样频率应为被采样信号中最高频率的5~10倍。第十六页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)7.采样保持电路采样保持电路(S/H或者SH)是模数转换系统中的一种重要电路,其作用是采集模拟输入电压在某一时刻的瞬时值,并在模数转换器进行转换期间保持输出电压不变,以供模数转换。该电路存在的原因在于模数转换需要一定时间,在转换过程中,如果送给ADC的模拟量发生变化,就不能保证采样的精度。为了简单起见,在此只分析单端输入ADC的采样保持电路,如图所示。图6.2.1采样保持电路示意图采样保持电路有两种工作状态:采样状态和保持状态。当控制开关S闭合时,输出跟随输入变化,称为采样状态;当控制开关S断开时,由保持电容C维持该电路的输出不变,称为保持状态。第十七页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)8.多通道同步采样和分时复用大多数单片机都集成了8个以上的ADC通道,这些单片机内部的ADC模块大多都是多通道分时复用的结构,其内部其实只有一个ADC内核,依靠增加模拟开关的方法轮流使用ADC内核,所以可以有多个ADC的输入通道。MSP430单片机也采用这种结构,如图所示。同步采样ADC实际就是多个完整独立的ADC。如图所示为三通道同步采样ADC的示意图。每一组通道都有各自独立的采样保持电路和ADC内核,3个ADC模块共用控制电路和输入/输出接口。图6.2.2MSP430单片机集成的ADC12模块局部

图6.2.3三通道同步采样ADC示意图

第十八页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)6.2.2MSP430单片机ADC12模块介绍ADC12模块的特性有:

高达200ksps的最大转换率;

无数据丢失的单调的12位转换器;

采样周期可由软件或定时器编程控制的采样保持功能;

软件或定时器启动转换;

可通过软件选择片内参考电压(MSP430F54xx:1.5V或2.5V,其他芯片:1.5V、2.0V或2.5V,注意此处只限MSP430F5xx/6xx系列单片机);

可通过软件选择内部或外部参考电压;

高达12路可单独配置的外部输入通道;

可为内部温度传感器、AVCC和外部参考电压分配转换通道;

正或负参考电压通道可独立选择;

转换时钟源可选;

具有单通道单次、单通道多次、序列通道单次和序列通道多次的转换模式;

ADC内核和参考电压都可独立关闭;

具有18路快速响应的ADC中断;

具有16个转换结果存储寄存器。第十九页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)ADC12模块的结构框图如图所示。ADC12模块支持快速的12位模数转换。该模块具有一个12位的逐次逼近(SAR)内核、模拟输入多路复用器、参考电压发生器、采样及转换所需的时序控制电路和16个转换结果缓冲及控制寄存器。转换结果缓冲及控制寄存器允许在没有CPU干预的情况下,进行多达16路ADC采样、转换和保存。图6.2.4ADC12模块结构框图第二十页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)6.2.3MSP430单片机ADC12模块操作1.ADC12的转换模式ADC12模块有4种转换模式,可以通过CONSEQx控制位进行选择,具体转换模式说明如表所示。ADC12CONSEQx转换模式操作说明00单通道单次转换一个单通道转换一次01序列通道单次转换一个序列多个通道转换一次10单通道多次转换一个单通道重复转换11序列通道多次转换一个序列多个通道重复转换表6.2.1各种转换模式说明列表第二十一页,共一百二十四页,2022年,8月28日6.2模数转换模块(ADC12)(1)单通道单次转换模式该模式对单一通道实现单次转换。模数转换结果被写入由CSTARTADDx位定义的存储寄存器ADC12MEMx中。单通道单次转换的流程图如图所示。当用户利用软件使ADC12SC启动转换时,下一次转换可以通过简单地设置ADC12SC位来启动。当有其他任何触发源用于转换时,ADC12ENC位必须在等待触发信号之前置位(上升沿)。其他的采样输入信号将在ADC12ENC复位并置位之前被忽略。第二十二页,共一百二十四页,2022年,8月28日【例6.2.1】单通道单次转换举例。分析:本实例采用单通道单次转换模式,参考电压对选择:VR+=AVCC、VR-=AVSS,ADC12采样参考时钟源选择内部默认参考时钟ADC12OSC。在主函数中,ADC12在采样转换的过程中,MSP430单片机进入低功耗模式以降低功耗,当采样转换完成,会自动进入ADC12中断服务程序,唤醒CPU并读取采样转换结果。最终实现当输入模拟电压信号大于0.5倍AVCC时,使P1.0引脚输出高电平;否则,使P1.0引脚输出低电平。下面给出实例程序:#include<msp430f5529.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

ADC12CTL0=ADC12SHT02+ADC12ON; //选择采样周期,打开ADC12模块

ADC12CTL1=ADC12SHP; //使用采样定时器作为采样触发信号

ADC12IE=0x01; //使能ADC采样中断

ADC12CTL0|=ADC12ENC; //置位ADC12ENC控制位

P6SEL|=0x01; //将P6.0引脚设为ADC输入功能

P1DIR|=0x01; //将P1.0引脚设为输出功能

while(1){ADC12CTL0|=ADC12SC; //启动采样转换__bis_SR_register(LPM0_bits+GIE); //进入LPM0并启用全局中断

}}6.2模数转换模块(ADC12)第二十三页,共一百二十四页,2022年,8月28日#pragmavector=ADC12_VECTOR__interruptvoidADC12_ISR(void){switch(__even_in_range(ADC12IV,34)){case0:break; //Vector0:无中断

case2:break; //Vector2:ADC溢出中断

case4:break; //Vector4:ADC转换时间溢出中断

case6: //Vector6:ADC12IFG0if(ADC12MEM0>=0x7ff) //ADC12MEM=A0>0.5AVcc?P1OUT|=BIT0; //P1.0=1elseP1OUT&=~BIT0; //P1.0=0__bic_SR_register_on_exit(LPM0_bits);//退出低功耗模式0case8:break; //Vector8:ADC12IFG1

……case34:break; //Vector34:ADC12IFG14default:break;}}6.2模数转换模块(ADC12)第二十四页,共一百二十四页,2022年,8月28日(2)序列通道单次转换模式该模式对序列通道做单次转换。ADC12转换结果将顺序写入由CSTARTADDx位定义的以ADCMEMx开始的转换存储器中。当由ADC12MCTLx寄存器中ADC12EOS位定义的最后一个通道转换完成之后,整个序列通道转换完成。序列通道单次转换的流程图如图所示。当使用ADC12SC位启动转换时,下一次转换可以通过简单地设置ADC12SC位来启动。当有其他任何触发源用于开始转换,ADC12ENC位必须在等待触发信号前置位(上升沿)。其他的采样输入信号将在ADC12ENC复位并置位之前被忽略。图6.2.7序列通道单次转换流程图6.2模数转换模块(ADC12)第二十五页,共一百二十四页,2022年,8月28日【例6.2.2】序列通道单次转换举例。分析:本实例采用序列通道单次转换模式,选择的采样序列通道为A0、A1、A2和A3。每个通道都选择AVCC和AVSS作为参考电压,采样结果被顺序存储在ADC12MEM0、ADC12MEM1、ADC12MEM2和ADC12MEM3中,本实例程序最终将采样结果存储在results[]数组中。下面给出实例程序代码:#include<msp430f5529.h>volatileunsignedintresults[4]; //用于存储转换结果voidmain(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

P6SEL=0x0F; //使能采样转换通道

ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_2;//打开ADC12,设置采样时间间隔

ADC12CTL1=ADC12SHP+ADC12CONSEQ_1; //选择采样定时器作为采样触发信号,采样模式选择序列通道单次转换模式

ADC12MCTL0=ADC12INCH_0; //ref+=AVcc,channel=A0ADC12MCTL1=ADC12INCH_1; //ref+=AVcc,channel=A1ADC12MCTL2=ADC12INCH_2; //ref+=AVcc,channel=A2ADC12MCTL3=ADC12INCH_3+ADC12EOS; //ref+=AVcc,channel=A3,停止采样

ADC12IE=0x08; //使能ADC12IFG.3采样中断标志位

ADC12CTL0|=ADC12ENC; //使能转换

while(1){ADC12CTL0|=ADC12SC; //启动采样转换

__bis_SR_register(LPM4_bits+GIE); //进入LPM4并使能全局中断

}}6.2模数转换模块(ADC12)第二十六页,共一百二十四页,2022年,8月28日#pragmavector=ADC12_VECTOR__interruptvoidADC12ISR(void){switch(__even_in_range(ADC12IV,34)){case0:break; //Vector0:无中断

case2:break; //Vector2:ADC溢出中断

case4:break; //Vector4:ADC转换时间溢出中断

case6:break; //Vector6:ADC12IFG0case8:break; //Vector8:ADC12IFG1case10:break; //Vector10:ADC12IFG2case12: //Vector12:ADC12IFG3results[0]=ADC12MEM0; //读取转换结果,自动清除中断标志位

results[1]=ADC12MEM1; //读取转换结果,自动清除中断标志位

results[2]=ADC12MEM2; //读取转换结果,自动清除中断标志位

results[3]=ADC12MEM3; //读取转换结果,自动清除中断标志位

__bic_SR_register_on_exit(LPM4_bits); //退出LPM4case14:break; //Vector14:ADC12IFG4

……default:break;}}6.2模数转换模块(ADC12)第二十七页,共一百二十四页,2022年,8月28日(3)单通道多次转换模式单通道多次转换模式是在选定的通道上进行多次转换。ADC转换的结果被存入由CSTARTADDx位定义的ADC12MEMx寄存器中。在这种转换模式下,当每次转换完成后CPU必须读取ADC12MEMx寄存器的值,否则在下一次转换中,ADC12MEMx寄存器的值会被覆盖。单通道多次转换模式的流程图如图所示。在此模式下,若复位ADC12ENC位,则在当前转换完成之后,转换将立即停止。同时设置CONSEQx=0和ADC12ENC=0,也可以立即停止当前的转换,但是,转换结果是不可靠的。图6.2.8单通道多次转换模式流程图6.2模数转换模块(ADC12)第二十八页,共一百二十四页,2022年,8月28日【例6.2.3】单通道多次转换举例。分析:本实例采用单通道多次转换模式,选择的采样通道为A0,参考电压选择AVCC和AVSS。在内存中开辟出8个16位内存空间results[],将多次采样转换结果循环存储在results[]数组中。实例程序代码如下:#include<msp430f5529.h>#defineNum_of_Results8volatileunsignedintresults[Num_of_Results]; //开辟8个16位内存空间voidmain(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

P6SEL|=0x01; //使能A0采样通道

ADC12CTL0=ADC12ON+ADC12SHT0_8+ADC12MSC; //打开ADC12,设置采样间隔

//设置多次采样转换

ADC12CTL1=ADC12SHP+ADC12CONSEQ_2; //选择采样定时器作为采样触发信号,采样模式选择单通道多次转换模式

ADC12IE=0x01; //使能ADC12IFG.0中断

ADC12CTL0|=ADC12ENC; //使能转换

ADC12CTL0|=ADC12SC; //启动转换

__bis_SR_register(LPM4_bits+GIE); //进入LPM4并使能全局中断}6.2模数转换模块(ADC12)第二十九页,共一百二十四页,2022年,8月28日#pragmavector=ADC12_VECTOR__interruptvoidADC12ISR(void){staticunsignedcharindex=0;switch(__even_in_range(ADC12IV,34)){case0:break; //Vector0:无中断

case2:break; //Vector2:ADC溢出中断

case4:break; //Vector4:ADC转换时间溢出中断

case6: //Vector6:ADC12IFG0results[index]=ADC12MEM0; //读取转换结果

index++; //计数器自动加1if(index==8){index=0;}case8:break; //Vector8:ADC12IFG1

……default:break;}}6.2模数转换模块(ADC12)第三十页,共一百二十四页,2022年,8月28日(4)序列通道多次转换模式序列通道多次转换模式用来进行多通道的连续转换。ADC12转换结果将顺序写入由CSTARTADDx位定义的以ADCMEMx开始的存储器中。当由ADC12MCTLx寄存器中ADC12EOS位定义的最后一个通道转换完成之后,一次序列通道转换完成,触发信号会触发下一次序列通道转换。序列通道多次转换模式的流程图如图所示。图6.2.9序列通道多次转换流程图6.2模数转换模块(ADC12)第三十一页,共一百二十四页,2022年,8月28日【例6.2.4】序列通道多次转换举例。分析:本实例采用序列通道多次转换模式,选择的采样序列通道为A0、A1、A2和A3。每个通道都选择AVCC和AVSS作为参考电压,采样结果被自动顺序存储在ADC12MEM0、ADC12MEM1、ADC12MEM2和ADC12MEM3中。在本实例中,最终将A0、A1、A2和A3通道的采样结果分别存储在A0results[]、A1results[]、A2results[]、A3results[]数组中。下面给出实例程序代码:#include<msp430f5529.h>#defineNum_of_Results8volatileunsignedintA0results[Num_of_Results];volatileunsignedintA1results[Num_of_Results];volatileunsignedintA2results[Num_of_Results];volatileunsignedintA3results[Num_of_Results];voidmain(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

P6SEL=0x0F; //使能ADC输入通道

ADC12CTL0=ADC12ON+ADC12MSC+ADC12SHT0_8;//打开ADC12,设置采样间隔//设置多次采样转换

ADC12CTL1=ADC12SHP+ADC12CONSEQ_3; //选择采样定时器作为采样触发信号,采样模式选择单通道多次转换模式

ADC12MCTL0=ADC12INCH_0; //ref+=AVcc,channel=A0ADC12MCTL1=ADC12INCH_1; //ref+=AVcc,channel=A1ADC12MCTL2=ADC12INCH_2; //ref+=AVcc,channel=A26.2模数转换模块(ADC12)第三十二页,共一百二十四页,2022年,8月28日ADC12MCTL3=ADC12INCH_3+ADC12EOS; //ref+=AVcc,channel=A3,停止采样

ADC12IE=0x08; //使能ADC12IFG.3中断

ADC12CTL0|=ADC12ENC; //使能转换

ADC12CTL0|=ADC12SC; //开始采样转换

__bis_SR_register(LPM0_bits+GIE); //进入LPM0并启用中断}#pragmavector=ADC12_VECTOR__interruptvoidADC12ISR(void){staticunsignedintindex=0;switch(__even_in_range(ADC12IV,34)){……case12://Vector12:ADC12IFG3A0results[index]=ADC12MEM0;//读取A0采样结果,并自动清除中断标志位

A1results[index]=ADC12MEM1;//读取A1采样结果,并自动清除中断标志位

A2results[index]=ADC12MEM2;//读取A2采样结果,并自动清除中断标志位

A3results[index]=ADC12MEM3;//读取A3采样结果,并自动清除中断标志位

index++;//计数器自动加1if(index==8){(index=0);}……default:break;}}6.2模数转换模块(ADC12)第三十三页,共一百二十四页,2022年,8月28日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)第三十四页,共一百二十四页,2022年,8月28日3.转换存储器典型的模数操作通常用中断请求的方式来通知ADC转换的结束,并需要在下一次ADC执行前将转换结果转存到另一位置。ADC12中的16个转换存储缓冲寄存器(ADC12MEMx)使得ADC可以进行多次转换而不需要软件干预,这一点提高了系统性能,也减少了软件开销。ADC12模块的每个ADC12MEMx缓冲寄存器都可通过相关的ADC12MCTLx控制寄存器来配置,为转换存储提供了很大的灵活性。SREFx控制位定义了参考电压,INCHx控制位选择输入通道。当使用序列通道转换模式时,ADC12EOS控制位定义了转换序列的结束。6.2模数转换模块(ADC12)第三十五页,共一百二十四页,2022年,8月28日4.使用片内集成温度传感器如果需要使用MSP430单片机片内的温度传感器,用户可以选择模拟输入通道INCHx=1010。与选择外部输入通道一样,需要进行其他寄存器的配置,包括参考电压选择、转换存储寄存器选择等。温度传感器典型的转换函数如图所示,该转换函数仅仅作为一个示例,实际的参数可以参考具体芯片的数据手册。当使用温度传感器时,采样周期必须大于30ms。温度传感器的偏移误差比较大,在大多数实际应用中需要进行校准。选择温度传感器会自动地开启片上参考电压发生器作为温度传感器的电源。但是,它不会使能VREF+输出或者影响作为模数转换的参考电压设置,温度传感器的参考电压设置与其他通道相同。6.2模数转换模块(ADC12)图6.2.12片内集成温度传感器温度转换函数第三十六页,共一百二十四页,2022年,8月28日寄存器名称缩写类型访问方式偏移地址初始状态ADC12控制寄存器0ADC12CTL0读/写字访问00h0000hADC12控制寄存器1ADC12CTL1读/写字访问02h0000hADC12控制寄存器2ADC12CTL2读/写字访问04h0020hADC12中断标志寄存器ADC12IFG读/写字访问0Ah0000hADC12中断使能寄存器ADC12IE读字访问0Ch0000hADC12中断向量寄存器ADC12IV读字访问0Eh0000hADC12缓冲寄存器ADC12MEM0~15读/写字访问20h~3Dh未定义ADC12存储控制寄存器ADC12MCTL0~15读/写字节访问10h~1Fh未定义6.2.4ADC12模块寄存器ADC12模块寄存器如表所列,用户可通过实际需要灵活配置ADC12的各功能模块。表6.2.2ADC12模块寄存器列表(基址为0700h)6.2模数转换模块(ADC12)第三十七页,共一百二十四页,2022年,8月28日6.2.5ADC12应用举例【例6.2.5】利用内部2.5V电压和AVSS作为转换参考电压。分析:本实例演示如何使用ADC12内部生成电压作为模数转换参考电压。采用单通道单次采样模式,选择A0通道作为输入通道,参考电压组合选择内部2.5V和AVSS,转换结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include<msp430f5529.h>voidmain(void){volatileunsignedinti;WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

P6SEL|=0x01;//使能A0输入通道

REFCTL0&=~REFMSTR;//复位REFMSTR控制位以控制ADC12参考电压控制寄存器

ADC12CTL0=ADC12ON+ADC12SHT02+ADC12REFON+ADC12REF2_5V;//打开ADC12,设置采样间隔,打开参考电压产生器,并设置参考电压为2.5VADC12CTL1=ADC12SHP;//采样保持触发信号选择采样定时器

ADC12MCTL0=ADC12SREF_1;//Vr+=Vref+,Vr-=AVssfor(i=0;i<0x30;i++);//延迟以使参考电压产生稳定ADC12CTL0|=ADC12ENC;//使能转换

while(1){ADC12CTL0|=ADC12SC;//开始转换while(!(ADC12IFG&BIT0));__no_operation();//可在此处设置端点查看ADC12MEM0缓冲寄存器

}}6.2模数转换模块(ADC12)第三十八页,共一百二十四页,2022年,8月28日【例6.2.6】利用外部输入电压作为转换参考电压。分析:本实例演示如何使用ADC12外部输入电压作为模数转换参考电压。采用单通道单次采样模式,选择A0通道作为输入通道,参考电压组合选择P5.0引脚输入的正参考电压VeREF+和AVSS。转换结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include<msp430f5529.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

P6SEL|=0x01; //使能A0通道

ADC12CTL0=ADC12ON+ADC12SHT0_2; //打开ADC12模块,设置采样间隔

ADC12CTL1=ADC12SHP; //采样保持触发信号选择采样定时器

ADC12MCTL0=ADC12SREF_2; //Vr+=VeREF+(外部),Vr-=AVssADC12CTL0|=ADC12ENC; //使能转换

while(1){ADC12CTL0|=ADC12SC; //开始转换

while(!(ADC12IFG&BIT0));__no_operation(); //可在此处设置断点查看ADC12MEM0缓冲寄存器

}}6.2模数转换模块(ADC12)第三十九页,共一百二十四页,2022年,8月28日【例6.2.7】利用A10通道采样内部温度传感器,并将采样的数值转化为摄氏和华氏温度。分析:本实例利用A10通道采样内部温度传感器,采样参考电压选择内部1.5V和AVSS,选择单通道单次采样模式,采样结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include<msp430f5529.h>longtemp;volatilelongIntDegF;volatilelongIntDegC;voidmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗定时器

REFCTL0&=~REFMSTR;//复位REFMSTR控制位以控制ADC12参考电压控制寄存器

ADC12CTL0=ADC12SHT0_8+ADC12REFON+ADC12ON;//打开ADC12,设置采样间隔,打开内部参考电压产生器,参考电压设置为1.5VADC12CTL1=ADC12SHP;//采样保持触发信号选择采样定时器

ADC12MCTL0=ADC12SREF_1+ADC12INCH_10;//A10通道作为输入,采样温度

ADC12IE=0x001; //使能ADC12IFG0中断

__delay_cycles(75); //延时75us以使参考电压稳定

ADC12CTL0|=ADC12ENC; //使能转换

while(1)6.2模数转换模块(ADC12)第四十页,共一百二十四页,2022年,8月28日{ADC12CTL0|=ADC12SC; //开始采样转换

__bis_SR_register(LPM4_bits+GIE); //进入LPM4,并使能全局中断

IntDegC=((temp-1855)*667)/4096;//采样结果转化为摄氏温度

IntDegF=((temp-1748)*1200)/4096;//采样结果转化为华氏温度

__no_operation(); //可在此处设置端点查看变量

}}#pragmavector=ADC12_VECTOR__interruptvoidADC12ISR(void){switch(__even_in_range(ADC12IV,34)){……case6://Vector6:ADC12IFG0temp=ADC12MEM0;//读取采样存储结果,自动清除中断标志位

_

_bic_SR_register_on_exit(LPM4_bits);//退出低功耗模式

break;

……default:break;}}6.2模数转换模块(ADC12)第四十一页,共一百二十四页,2022年,8月28日6.3比较器B(Comp_B)6.3.1比较器B介绍比较器B模块包含多达16个通道的比较功能,具有以下特性:

反相和同相端输入多路复用器;

比较器输出可编程RC滤波器;

输出提供给定时器A捕获输入;

端口输入缓冲区程序控制;

中断能力;

可选参考电压发生器、电压滞后发生器;

外部参考电压输入;

超低功耗比较器模式;

中断驱动测量系统——支持低功耗运行。第四十二页,共一百二十四页,2022年,8月28日比较器B的结构框图如图所示。图6.3.1比较器B结构框图6.3比较器B(Comp_B)第四十三页,共一百二十四页,2022年,8月28日1.模拟输入开关模拟输入开关通过CBIPSEL和SBIMSEL控制位控制模拟信号的输入,每个输入通道都是相对独立的,且都可以引入比较器B的“+”输入端或“-”输入端。通过CBSHORT控制位可以将比较器B的模拟信号输入短路。比较器B的输入端也可通过CBRSEL和CBEX控制位的配合引入内部基准电压生成器产生的参考电压。通过相应寄存器的配置,比较器B可进行如下模拟电压信号的比较:

两个外部输入电压信号的比较;

每个外部输入电压信号与内部基准电压的比较。6.3比较器B(Comp_B)第四十四页,共一百二十四页,2022年,8月28日2.参考电压发生器比较器B的参考电压发生器的结构框图如图所示。参考电压发生器通过接入梯形电阻电路或内部共享电压来达到产生不同参考电压VREF的目的。如图所示,CBRSx控制位可选择参考电压的来源。若CBRSx为10,内部梯形电阻电路电压来自内部共享电压,内部共享电压可通过CBREFLx控制位产生1.5V、2.0V或2.5V电压。若CBRSx为01,内部梯形电阻电路电压来自VCC,可通过CBON实现参考电源的开关。若CBRSx为00或11,内部梯形电阻电路无电源可用,被禁止。若CBRSx为11,参考电压来自内部共享电压。当CBRSx不为11时,当CBMRVS为0且CBOUT为1时,参考电压来自VREF1;当CBMRVS和CBOUT均为0时,参考电压来自VREF0。当梯形电阻电路可用时,可通过CBREF1和CBREF0控制位对参考电压源进行分压,分压倍数可为1/5、2/5、3/5、4/5、1/4、3/4、1/3、2/3、1/2和1。CBMRVS控制位实现对控制VREF电压的来源信号的控制。若CBMRVS控制位为0,CBOUT控制VREF电压信号的来源;若CBMRVS控制位为1,CBMRVL控制位控制VREF电压信号的来源。图6.3.2比较器B参考电压发生器结构框图6.3比较器B(Comp_B)第四十五页,共一百二十四页,2022年,8月28日3.内部滤波器比较器B的输出可以选择使用或不使用内部RC滤波器。当CBF控制位设为1时,比较器输出信号经过RC滤波,反之,不使用RC滤波。如果在比较器的输入端,模拟电压的电压差很小,那么比较器的输出会产生振荡。如图所示,当比较器“+”输入端的电压减少并越过“-”输入端参考比较电压时,若比较器输出没有经过内部滤波器的过滤,在电压穿越的时刻,比较器输出将会产生较大的振荡;若比较器输出经过内部滤波器的过滤,在电压穿越的时刻,比较器的输出振荡较小。图6.3.3使用和未使用内部滤波器的输出波形比较示意图6.3比较器B(Comp_B)第四十六页,共一百二十四页,2022年,8月28日5.比较器B测量电阻原理利用比较器B测量电阻的电路示意图如图所示。被测电阻和一个标准参考电阻分别连接到两个GPIO端口,被测电阻可以是固定的,也可以是可变的,如温控电阻等。被测电阻和标准电阻的另外一端连接一个固定电容并接入比较器B的正输入端。比较器的负输入端接内部0.25VCC参考电压,比较器输出连接定时器A。图6.3.4利用比较器B测量电阻电路6.3比较器B(Comp_B)第四十七页,共一百二十四页,2022年,8月28日对被测电阻的测量过程为:将Px.x引脚拉高,通过标准参考电阻Rref对电容进行充电;将Px.x引脚拉低,通过标准参考电阻Rref对电容进行放电;再将Px.x引脚拉高,通过标准参考电阻Rref对电容进行充电;然后将Px.y引脚拉低,通过被测电阻Rmeas对电容进行放电。如此往复,利用定时器A准确测量通过Rref和通过Rmeas对电容进行放电的时间,测量过程如图所示。图6.3.5电容充放电示意图6.3比较器B(Comp_B)第四十八页,共一百二十四页,2022年,8月28日被测电阻的计算公式为式中,Nmeas为电容通过被测电阻放电时定时器A的捕获计数值;Nref为电容通过标准参考电阻放电时定时器A的捕获计数值。6.3比较器B(Comp_B)第四十九页,共一百二十四页,2022年,8月28日6.利用比较器B实现电容触摸按键原理首先,人体是具有一定电容的。当我们把PCB上的铜画成如图所示形式时,就做出了一个最基本的触摸感应按键。图6.3.6触摸按键结构图图中左边的图显示了一个基本的触摸按键,中间圆形阴影部分为铜(可以称为“按键”),在这按键中会引出一根导线与单片机相连,单片机通过这根导线来检测是否有按键“按下”(检测的方法将在后面介绍);外围的阴影部分也是铜,不过外围的这些铜是与GND大地相连的。在“按键”和外围的铜之间是空隙(可以称为空隙d)。图中右边的图是左图的截面图,当没有手指接触时,只有一个电容Cp;当有手指接触时,“按键”通过手指就形成了电容Cf。由于两个电容是并联的,所以手指接触“按键”前后,总电容的变化率为C%=((Cp+Cf)-Cp)/Cp=Cf/Cp。6.3比较器B(Comp_B)第五十页,共一百二十四页,2022年,8月28日利用比较器B实现一个张弛振荡触摸按键的电路如图所示。在输入端,比较器正输入端接内部参考电压,比较器负输入端接在电阻Rc与感应电容之间,CBOUT与TACLK相连。当感应电容CSENSOR两端没有电压时,通过比较器B的比较,CBOUT将输出高电平,之后通过Rc对感应电容进行充电。当感应电容两端的电压高于内部比较器“+”输入端的参考电压时,通过比较器B的比较,CBOUT将输出低电平,感应电容通过Rc放电。放电的过程中若感应电容两端的电压低于内部比较器“+”输入端的参考电压,CBOUT又输出高电平,通过Rc对感应电容放电,如此往复,比较器B的输出端CBOUT将输出具有一定频率的矩形波。该矩形波的频率可反映感应电容的充放电时间,进而可检测感应电容的变化,因此只需在固定时间内,利用定时器A作为频率计计算张弛振荡器的输出频率。如果在某一时刻输出频率有较大的变化的话,就说明电容值已经被改变,即按键被“按下”了。图6.3.8张弛振荡器按键电路6.3比较器B(Comp_B)第五十一页,共一百二十四页,2022年,8月28日基于张弛振荡器的电容触摸按键检测方法示意图如图所示,当手指触摸到电容触摸按键以后,电容由C1变化至C2,张弛振荡器的输出频率会降低很多,然后利用定时器在门限时间内计算比较器B的输出频率,即可实现对感应电容的检测。图6.3.9基于张弛振荡器的电容触摸按键检测方法6.3比较器B(Comp_B)第五十二页,共一百二十四页,2022年,8月28日6.3.2比较器B控制寄存器寄存器简写类型偏移地址初始状态比较器B控制寄存器0CBCTL0读/写0x0000由PUC复位比较器B控制寄存器1CBCTL1读/写0x0002由PUC复位比较器B控制寄存器2CBCTL2读/写0x0004由PUC复位比较器B控制寄存器3CBCTL3读/写0x0006由PUC复位比较器B中断控制寄存器CBINT读/写0x由PUC复位比较器B中断向量寄存器CBIV读0x000E由PUC复位表6.3.1比较器B控制寄存器汇总列表(基址为08C0h)6.3比较器B(Comp_B)第五十三页,共一百二十四页,2022年,8月28日6.3.3比较器B应用举例【例6.3.1】比较器B输入通道CB0接外

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论