




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、合肥工业大学DSP及MSP430实验室 MSP430单片机原理与应用单片机原理与应用 http:/ MSP430单片机的输入输出模块 单片机中的输入/输出模块是供信号输入、输出所用的模块化单元。MSP430单片机的片内输入/输出模块非常丰富,典型的输入/输出模块有:通用I/O端口、模数转换模块、比较器、定时器与段式液晶驱动模块。本章重点讲述各典型输入/输出模块的结构、原理及功能,并针对各个模块给出简单的应用例程。通用通用IO端口端口(GPIO)6.1模数转换模块模数转换模块(ADC12)6.2比较器比较器B(Comp_B)6.3定时器定时器6.4LCD_C段式液晶驱动模块段式液晶驱动模块6.5
2、6.1 通用IO端口6.1.1 MSP430端口概述 通用I/O端口是MSP430单片机最重要也是最常用的外设模块。通用I/O端口不仅可以直接用于输入/输出,而且可以为MSP430单片机应用系统提供必要的逻辑控制信号。 MSP430F5xx/6xx系列单片机最多可以提供12个通用I/O端口(P1P11和PJ),大部分端口有8个引脚,少数端口引脚数少于8个。每个I/O引脚都可以被独立地设置为输入或者输出引脚,并且每个I/O引脚都可以被独立地读取或者写入,所有的端口寄存器都可以被独立地置位或者清零。 P1和P2引脚具有中断能力。从P1和P2端口的各个I/O引脚引入的中断可以独立地被使能,并且被设置
3、为上升沿或者下降沿触发中断。所有P1端口的I/O引脚的中断都来源于同一个中断向量P1IV。同理,P2端口的中断源都来源于另一个中断向量P2IV。 可以对每个独立的端口进行字节访问,或者将两个结合起来进行字访问。端口组合P1和P2、P3和P4、P5和P6、P7和P8可结合起来称为PA、PB、PC和PD端口。当进行字操作写入PA口时,所有的16位数据都被写入这个端口;利用字节操作写入PA端口低字节时,高字节保持不变;利用字节指令写入PA端口的高字节时,低字节保持不变。其他端口也是一样。当写入的数据长度小于端口的最大长度时,那些没有用到的位保持不变。应用这个规则来访问所有端口,除了中断向量寄存器P1
4、IV和P2IV,它们只能进行字节操作。6.1 通用IO端口6.1.2 通用IO端口输出特性 MSP430单片机在默认输出驱动(PxDS.y=0,即欠驱动强度)且单片机供电电压VCC为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、.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端口的输出缓冲寄存器。其内容可以像操作内存数据
6、一样写入,以达到改变I/O口输出状态的目的。在读取时,输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。 0:输出为低; 1:输出为高。6.1 通用IO端口6.1.3 端口P1和P2 3方向寄存器PxDIR 相互独立的8位分别定义了8个引脚的输入/输出方向。8位在PUC之后都被复位。使用输入或输出功能时,应先定义端口的方向,输入/输出才能满足设计者的要求。作为输入时,只能读;作为输出时,可读可写。 0:输入模式; 1:输出模式。 4上拉/下拉电阻使能寄存器PxREN 该寄存器的每一位可以使能相应I/O引脚的上拉/下拉电阻。该寄存器需和输出寄存器配合使用,才能完成上
7、拉/下拉电阻的配置。 0:上拉/下拉电阻禁止; 1:上拉/下拉电阻使能。 5输出驱动能力调节寄存器PxDSPxDS寄存器的每一位可使相关引脚选择全驱动模式和次驱动模式(减弱驱动能力)。默认的是次驱动模式。 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、脚一一对应,其中每一位用以控制相应引脚的中断允许。 8中断触发边沿选择寄存器PxIES 如果允许Px口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的8位分别定义了Px口的8个引脚的中断触发沿。 9 中断标志寄存器PxIFG 该寄存器有8个标志位,它们含有相应引脚是否有待处理中断的信息,即相应引脚是否有中断请求。如果Px的某个引脚允许中断,同时选择上升沿,则当该引脚发生由低电平向高电平跳变时,PxIFG的相应位就会置位,表明该引脚上有中断事件发生。6.1 通用IO端口6.1.4 端口P3P11 这些端口没有中断能力,其余功能与P1、P2端口一样,能实现输入/输出功能和外围模块功能。每个端
9、口有6个寄存器供用户使用,用户可通过这6个寄存器对它们进行访问和控制。每个端口的6个寄存器分别为:输入寄存器(PxIN)、输出寄存器(PxOUT)、方向选择寄存器(PxDIR)、输出驱动能力调节寄存器(PxDS)、上拉/下拉电阻使能寄存器(PxREN)和功能选择寄存器(PxSEL)。具体用法同P1和P2端口。6.1 通用IO端口6.1.5 端口的应用 端口是单片机中最经常使用的外设资源。一般在程序的初始化阶段对端口进行配置。配置时,先配置功能选择寄存器PxSEL,若为I/O端口功能,则继续配置方向寄存器PxDIR;若为输入,则继续配置中断使能寄存器PxIE;若允许中断,则继续配置中断触发沿选择
10、寄存器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(
11、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输出低电平。该程序采用查询的方式检测按键是否被按下。为调试
12、方便,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 &= BIT0; / 否则,使P1.0输出低电平 6.1 通用IO端口【例6.1.3】 利用按键外部中断方式,实现反转P1.0引脚输出状态。P1.4选择GPIO功能,内部上拉电阻使能,且使能中断。当P1.4引脚
13、上产生下降沿时,触发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
14、 |= BIT4; P1OUT |= BIT4; / 以上两句组合功能为使能P1.4引脚上拉电阻 P1IES |= BIT4; / P1.4中断下降沿触发 P1IFG &= BIT4; / 清除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 &= BIT4; / 清除P1.4中断标志位
15、6.2 模数转换模块(ADC12)6.2.1 模数转换概述 在MSP430单片机的实时控制和智能仪表等实际应用系统中,常常会遇到连续变化的物理量,如温度、流量、压力和速度等。利用传感器把这些物理量检测出来,转换为模拟电信号,再经过模数转换模块(ADC)转换成数字量,模拟量才能够被MSP430单片机处理和控制。 1模数转换基本过程 首先连续时间输入信号x(t)输入ADC的采样保持器中,ADC每隔Ts(采样周期)读出一次x(t)的采样值,对此采样值进行量化。量化的过程是将此信号转换成离散时间、离散幅度的多电平信号。从数学角度理解,量化是把一个连续幅度值的无限数集合映射到一个离散幅度值的有限数集合。
16、在进行ADC转换时,必须把采样电压表示为某个规定的最小数量单位的整数倍,所取的最小数量单位叫做量化单位,用表示。显然,数字信号最低有效位(LSB)的1所代表的数量大小就等于。把量化的结果用代码表示出来,这个过程称为编码。这些代码就是ADC转换的输出结果。6.2 模数转换模块(ADC12)2ADC的位数ADC的位数为ADC模块采样转换后输出代码的位数。例如,一个12位的ADC模块,采样转换后的代码即为12位,表示数值的取值范围为04095。3分辨率分辨率表示输出数字量变化的一个相邻数码所需输入模拟电压的变化量。它定义为转换器的满刻度电压与2n的比值,其中n为ADC的位数。因此,分辨率与ADC的位
17、数有关。例如,一个8位ADC模块的分辨率为满刻度电压的1/256。如果满刻度输入电压为5V,该ADC模块的分辨率即为5V/256=20mV。分辨率代表了ADC模块对输入信号的分辨能力,一般来说,ADC模块位数越高,数据采集的精度就越高。4量化误差量化误差是由于用有限数字对模拟数值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率,即1/2LSB。量化误差是无法消除的,但是,通过提高分辨率可以减少量化误差。6.2 模数转换模块(ADC12) 5采样周期 采样周期是每两次采样之间的时间间隔。采样周期包括采样保持时间和转换时间。采样保持时间是指ADC模块完成一次采样和保持的时间,
18、转换时间是指ADC模块完成一次模数转换所需要的时间。在MSP430单片机的ADC12模块中,采样保持时间可通过控制寄存器进行设置,而转换时间一般需要13个ADCCLK的时间。 6采样频率 采样频率,也称为采样速率或者采样率,定义为每秒从连续信号中提取并组成离散信号的采样个数,单位为赫兹(Hz)。采样频率的倒数是采样周期。为了确定对一个模拟信号的采样频率,在此简单介绍采样定理。采样定理又称香农采样定理或者奈奎斯特采样定理,即在进行模数信号的转换过程中,当采样频率fs.max大于信号中最高频率分量fmax的2倍时(fs.max2fmax),采样之后的数字信号能保留原始信号中的信息。在一般应用中,采
19、样频率应为被采样信号中最高频率的510倍。6.2 模数转换模块(ADC12) 7采样保持电路 采样保持电路(S/H或者SH)是模数转换系统中的一种重要电路,其作用是采集模拟输入电压在某一时刻的瞬时值,并在模数转换器进行转换期间保持输出电压不变,以供模数转换。该电路存在的原因在于模数转换需要一定时间,在转换过程中,如果送给ADC的模拟量发生变化,就不能保证采样的精度。为了简单起见,在此只分析单端输入ADC的采样保持电路,如图6.2.1所示。图6.2.1 采样保持电路示意图 采样保持电路有两种工作状态:采样状态和保持状态。当控制开关S闭合时,输出跟随输入变化,称为采样状态;当控制开关S断开时,由保
20、持电容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单片机集成的ADC
21、12模块局部 图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路可单独配置的外部输入通道; 可为内部温度传感器、AVCC和外部参考电压分配转换通
22、道; 正或负参考电压通道可独立选择; 转换时钟源可选; 具有单通道单次、单通道多次、序列通道单次和序列通道多次的转换模式; ADC内核和参考电压都可独立关闭; 具有18路快速响应的ADC中断; 具有16个转换结果存储寄存器。6.2 模数转换模块(ADC12) ADC12模块的结构框图如图6.2.4所示。ADC12模块支持快速的12位模数转换。该模块具有一个12位的逐次逼近(SAR)内核、模拟输入多路复用器、参考电压发生器、采样及转换所需的时序控制电路和16个转换结果缓冲及控制寄存器。转换结果缓冲及控制寄存器允许在没有CPU干预的情况下,进行多达16路ADC采样、转换和保存。图6.2.4 ADC
23、12模块结构框图6.2 模数转换模块(ADC12)6.2.3 MSP430单片机ADC12模块操作1ADC12的转换模式ADC12模块有4种转换模式,可以通过CONSEQx控制位进行选择,具体转换模式说明如表6.2.1所示。ADC12CONSEQx转换模式操作说明00单通道单次转换一个单通道转换一次01序列通道单次转换一个序列多个通道转换一次10单通道多次转换一个单通道重复转换11序列通道多次转换一个序列多个通道重复转换表6.2.1 各种转换模式说明列表6.2 模数转换模块(ADC12)(1)单通道单次转换模式该模式对单一通道实现单次转换。模数转换结果被写入由CSTARTADDx位定义的存储寄
24、存器ADC12MEMx中。单通道单次转换的流程图如图6.2.6所示。当用户利用软件使ADC12SC启动转换时,下一次转换可以通过简单地设置ADC12SC位来启动。当有其他任何触发源用于转换时,ADC12ENC位必须在等待触发信号之前置位(上升沿)。其他的采样输入信号将在ADC12ENC复位并置位之前被忽略。【例6.2.1】 单通道单次转换举例。分析:本实例采用单通道单次转换模式,参考电压对选择:VR+=AVCC、VR-=AVSS,ADC12采样参考时钟源选择内部默认参考时钟ADC12OSC。在主函数中,ADC12在采样转换的过程中,MSP430单片机进入低功耗模式以降低功耗,当采样转换完成,会
25、自动进入ADC12中断服务程序,唤醒CPU并读取采样转换结果。最终实现当输入模拟电压信号大于0.5倍AVCC时,使P1.0引脚输出高电平;否则,使P1.0引脚输出低电平。下面给出实例程序: #include void main(void) WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗 ADC12CTL0 = ADC12SHT02 + ADC12ON; / 选择采样周期,打开ADC12模块 ADC12CTL1 = ADC12SHP; / 使用采样定时器作为采样触发信号 ADC12IE = 0 x01; / 使能ADC采样中断 ADC12CTL0 |= ADC12ENC; /
26、 置位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: br
27、eak; / 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 &= BIT0; / P1.0 = 0 _ _bic_SR_register_on_exit(LPM0_bits); / 退出低功耗模式0 case 8: break; / Ve
28、ctor 8: ADC12IFG1 case 34: break; / Vector 34: ADC12IFG14 default: break; 6.2 模数转换模块(ADC12)(2)序列通道单次转换模式该模式对序列通道做单次转换。ADC12转换结果将顺序写入由CSTARTADDx位定义的以A D C M E M x 开 始 的 转 换 存 储 器 中 。 当 由ADC12MCTLx寄存器中ADC12EOS位定义的最后一个通道转换完成之后,整个序列通道转换完成。序列通道单次转换的流程图如图6.2.7所示。当使用ADC12SC位启动转换时,下一次转换可以通过简单地设置ADC12SC位来启动。
29、当有其他任何触发源用于开始转换,ADC12ENC位必须在等待触发信号前置位(上升沿)。其他的采样输入信号将在ADC12ENC复位并置位之前被忽略。图6.2.7 序列通道单次转换流程图6.2 模数转换模块(ADC12)【例6.2.2】 序列通道单次转换举例。分析:本实例采用序列通道单次转换模式,选择的采样序列通道为A0、A1、A2和A3。每个通道都选择AVCC和AVSS作为参考电压,采样结果被顺序存储在ADC12MEM0、ADC12MEM1、ADC12MEM2和ADC12MEM3中,本实例程序最终将采样结果存储在results数组中。下面给出实例程序代码:#include volatile un
30、signed 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
31、= 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)
32、; / 进入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:
33、 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
34、: break; / Vector 14: ADC12IFG4 default: break; 6.2 模数转换模块(ADC12)(3)单通道多次转换模式单通道多次转换模式是在选定的通道上进行多 次 转 换 。 A D C 转 换 的 结 果 被 存 入 由CSTARTADDx位定义的ADC12MEMx寄存器中。在这种转换模式下,当每次转换完成后CPU必须读取ADC12MEMx寄存器的值,否则在下一次转换中,ADC12MEMx寄存器的值会被覆盖。单通道多次转换模式的流程图如图6.2.8所示。在此模式下,若复位ADC12ENC位,则在当前转换完成 之 后 , 转 换 将 立 即 停 止 。 同
35、时 设 置CONSEQx=0和ADC12ENC=0,也可以立即停止当前的转换,但是,转换结果是不可靠的。图6.2.8 单通道多次转换模式流程图6.2 模数转换模块(ADC12)【例6.2.3】 单通道多次转换举例。分析:本实例采用单通道多次转换模式,选择的采样通道为A0,参考电压选择AVCC和AVSS。在内存中开辟出8个16位内存空间results,将多次采样转换结果循环存储在results数组中。实例程序代码如下:#include #define Num_of_Results 8volatile unsigned int resultsNum_of_Results;/ 开辟8个16位内存空间
36、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;
37、 / 启动转换 _ _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:
38、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位定义的
39、最后一个通道转换完成之后,一次序列通道转换完成,触发信号会触发下一次序列通道转换。序列通道多次转换模式的流程图如图6.2.9所示。图6.2.9 序列通道多次转换流程图6.2 模数转换模块(ADC12)【例6.2.4】 序列通道多次转换举例。分析:本实例采用序列通道多次转换模式,选择的采样序列通道为A0、A1、A2和A3。每个通道都选择AVCC和AVSS作为参考电压,采样结果被自动顺序存储在ADC12MEM0、ADC12MEM1、ADC12MEM2和ADC12MEM3中。在本实例中,最终将A0、A1、A2和A3通道的采样结果分别存储在A0results、A1results、A2results、A
40、3results数组中。下面给出实例程序代码:#include #define Num_of_Results 8volatile 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 x0
41、F; / 使能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, ch
42、annel = A26.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) st
43、atic 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采样结果,并自动清除中断标志位 ind
44、ex+; / 计数器自动加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或采
45、样定时器,能够控制采样的周期及转换的开始。当SAMPCON信号为高电平时采样被激活,SAMPCON的下降沿将触发模数转换。ADC12SHP定义了两种不同的采样时序方法:扩展采样时序模式和脉冲采样时序模式。6.2 模数转换模块(ADC12) 3转换存储器 典型的模数操作通常用中断请求的方式来通知ADC转换的结束,并需要在下一次ADC执行前将转换结果转存到另一位置。ADC12中的16个转换存储缓冲寄存器(ADC12MEMx)使得ADC可以进行多次转换而不需要软件干预,这一点提高了系统性能,也减少了软件开销。ADC12模块的每个ADC12MEMx缓冲寄存器都可通过相关的ADC12MCTLx控制寄存器
46、来配置,为转换存储提供了很大的灵活性。SREFx控制位定义了参考电压,INCHx控制位选择输入通道。当使用序列通道转换模式时,ADC12EOS控制位定义了转换序列的结束。6.2 模数转换模块(ADC12)4使用片内集成温度传感器如果需要使用MSP430单片机片内的温度传感器,用户可以选择模拟输入通道INCHx=1010。与选择外部输入通道一样,需要进行其他寄存器的配置,包括参考电压选择、转换存储寄存器选择等。温度传感器典型的转换函数如图6.2.12所示,该转换函数仅仅作为一个示例,实际的参数可以参考具体芯片的数据手册。当使用温度传感器时,采样周期必须大于30ms。温度传感器的偏移误差比较大,在
47、大多数实际应用中需要进行校准。选择温度传感器会自动地开启片上参考电压发生器作为温度传感器的电源。但是,它不会使能VREF+输出或者影响作为模数转换的参考电压设置,温度传感器的参考电压设置与其他通道相同。6.2 模数转换模块(ADC12)图6.2.12 片内集成温度传感器温度转换函数寄存器名称缩写类型访问方式偏移地址初始状态ADC12控制寄存器0ADC12CTL0读/写字访问00h0000hADC12控制寄存器1ADC12CTL1读/写字访问02h0000hADC12控制寄存器2ADC12CTL2读/写字访问04h0020hADC12中断标志寄存器ADC12IFG读/写字访问0Ah0000hAD
48、C12中断使能寄存器ADC12IE读字访问0Ch0000hADC12中断向量寄存器ADC12IV读字访问0Eh0000hADC12缓冲寄存器ADC12MEM015读/写字访问20h3Dh未定义ADC12存储控制寄存器ADC12MCTL015读/写字节访问10h1Fh未定义6.2.4 ADC12模块寄存器ADC12模块寄存器如表6.2.2所列,用户可通过实际需要灵活配置ADC12的各功能模块。表6.2.2 ADC12模块寄存器列表(基址为0700h)6.2 模数转换模块(ADC12)6.2.5 ADC12应用举例【例6.2.5】 利用内部2.5V电压和AVSS作为转换参考电压。分析:本实例演示如
49、何使用ADC12内部生成电压作为模数转换参考电压。采用单通道单次采样模式,选择A0通道作为输入通道,参考电压组合选择内部2.5V和AVSS,转换结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include void main(void) volatile unsigned int i; WDTCTL = WDTPW+WDTHOLD; / 关闭看门狗 P6SEL |= 0 x01; / 使能A0输入通道 REFCTL0 &= REFMSTR; / 复位REFMSTR控制位以控制ADC12参考电压控制寄存器 ADC12CTL0 = ADC12ON+ADC12SHT02+ADC12R
50、EFON+ADC12REF2_5V; / 打开ADC12,设置采样间隔,打开参考电压产生器,并设置参考电压为2.5V ADC12CTL1 = ADC12SHP; / 采样保持触发信号选择采样定时器 ADC12MCTL0 = ADC12SREF_1; / Vr+=Vref+ ,Vr-=AVss for ( i=0; i0 x30; i+); / 延迟以使参考电压产生稳定 ADC12CTL0 |= ADC12ENC; / 使能转换 while (1) ADC12CTL0 |= ADC12SC; / 开始转换while (!(ADC12IFG & BIT0);_ _no_operation(); /
51、 可在此处设置端点查看ADC12MEM0缓冲寄存器 6.2 模数转换模块(ADC12)【例6.2.6】 利用外部输入电压作为转换参考电压。分析:本实例演示如何使用ADC12外部输入电压作为模数转换参考电压。采用单通道单次采样模式,选择A0通道作为输入通道,参考电压组合选择P5.0引脚输入的正参考电压VeREF+和AVSS。转换结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include void main(void) WDTCTL = WDTPW+WDTHOLD; / 关闭看门狗 P6SEL |= 0 x01; / 使能A0通道 ADC12CTL0 = ADC12ON+ADC1
52、2SHT0_2; / 打开ADC12模块,设置采样间隔 ADC12CTL1 = ADC12SHP; / 采样保持触发信号选择采样定时器 ADC12MCTL0 = ADC12SREF_2; / Vr+ = VeREF+(外部), Vr-=AVss ADC12CTL0 |= ADC12ENC; / 使能转换 while (1) ADC12CTL0 |= ADC12SC; / 开始转换 while (!(ADC12IFG & BIT0);_ _no_operation(); / 可在此处设置断点查看ADC12MEM0缓冲寄存器 6.2 模数转换模块(ADC12)【例6.2.7】 利用A10通道采样内
53、部温度传感器,并将采样的数值转化为摄氏和华氏温度。分析:本实例利用A10通道采样内部温度传感器,采样参考电压选择内部1.5V和AVSS,选择单通道单次采样模式,采样结果存储在ADC12MEM0缓冲寄存器中,实例程序代码如下:#include long temp;volatile long IntDegF;volatile long IntDegC;void main(void) WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗定时器 REFCTL0 &= REFMSTR; / 复位REFMSTR控制位以控制ADC12参考电压控制寄存器 ADC12CTL0 = ADC12SHT
54、0_8 + ADC12REFON + ADC12ON; / 打开ADC12,设置采样间隔,打开内部参考电压产生器,参考电压设置为1.5V ADC12CTL1 = ADC12SHP; / 采样保持触发信号选择采样定时器 ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_10; / A10通道作为输入,采样温度 ADC12IE = 0 x001; / 使能ADC12IFG0中断 _ _delay_cycles(75); / 延时75us以使参考电压稳定 ADC12CTL0 |= ADC12ENC; / 使能转换 while(1)6.2 模数转换模块(ADC12) ADC12
55、CTL0 |= ADC12SC; / 开始采样转换 _ _bis_SR_register(LPM4_bits + GIE); / 进入LPM4,并使能全局中断 IntDegC = (temp - 1855) * 667) / 4096; / 采样结果转化为摄氏温度 IntDegF = (temp - 1748) * 1200) / 4096;/ 采样结果转化为华氏温度 _ _no_operation(); / 可在此处设置端点查看变量 #pragma vector=ADC12_VECTOR_ _interrupt void ADC12ISR (void) switch(_ _even_in_r
56、ange(ADC12IV,34) case 6: / Vector 6: ADC12IFG0 temp = ADC12MEM0; / 读取采样存储结果,自动清除中断标志位 _ _bic_SR_register_on_exit(LPM4_bits); / 退出低功耗模式 break; default: break; 6.2 模数转换模块(ADC12)6.3 比较器B(Comp_B)6.3.1 比较器B介绍比较器B模块包含多达16个通道的比较功能,具有以下特性: 反相和同相端输入多路复用器; 比较器输出可编程RC滤波器; 输出提供给定时器A捕获输入; 端口输入缓冲区程序控制; 中断能力; 可选参考
57、电压发生器、电压滞后发生器; 外部参考电压输入; 超低功耗比较器模式; 中断驱动测量系统支持低功耗运行。比较器B的结构框图如图6.3.1所示。图6.3.1 比较器B结构框图6.3 比较器B(Comp_B) 1模拟输入开关 模拟输入开关通过CBIPSEL和SBIMSEL控制位控制模拟信号的输入,每个输入通道都是相对独立的,且都可以引入比较器B的“+”输入端或“-”输入端。通过CBSHORT控制位可以将比较器B的模拟信号输入短路。比较器B的输入端也可通过CBRSEL和CBEX控制位的配合引入内部基准电压生成器产生的参考电压。 通过相应寄存器的配置,比较器B可进行如下模拟电压信号的比较: 两个外部输
58、入电压信号的比较; 每个外部输入电压信号与内部基准电压的比较。6.3 比较器B(Comp_B)2参考电压发生器比较器B的参考电压发生器的结构框图如图6.3.2所示。参考电压发生器通过接入梯形电阻电路或内部共享电压来达到产生不同参考电压VREF的目的。如图6.3.2所示,CBRSx控制位可选择参考电压的来源。若CBRSx为10,内部梯形电阻电路电压来自内部共享电压,内部共享电压可通过CBREFLx控制位产生1.5V、2.0V或2.5V电压。若CBRSx为01,内部梯形电阻电路电压来自VCC,可通过CBON实现参考电源的开关。若CBRSx为00或11,内部梯形电阻电路无电源可用,被禁止。若CBRS
59、x为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控制位实现 对 控 制 VR E F电 压 的 来 源 信 号 的 控 制 。 若CBMRVS控制位为0,CBOUT控制VREF电压信号的来源;若CBMRVS控制位为1,CBMRVL控制位控制VREF电压信号的来源。图6.3.2 比较器
60、B参考电压发生器结构框图6.3 比较器B(Comp_B)3内部滤波器比较器B的输出可以选择使用或不使用内部RC滤波器。当CBF控制位设为1时,比较器输出信号经过RC滤波,反之,不使用RC滤波。如果在比较器的输入端,模拟电压的电压差很小,那么比较器的输出会产生振荡。如图6.3.3所示,当比较器“+”输入端的电压减少并越过“-”输入端参考比较电压时,若比较器输出没有经过内部滤波器的过滤,在电压穿越的时刻,比较器输出将会产生较大的振荡;若比较器输出经过内部滤波器的过滤,在电压穿越的时刻,比较器的输出振荡较小。图6.3.3 使用和未使用内部滤波器的输出波形比较示意图6.3 比较器B(Comp_B)5比
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度专利技术价格保密合同书
- 2025年度休闲渔业发展鱼塘承包经营合同
- 2025年度护肤品专业渠道代理商招募合同
- 2025年度业主起诉解除物业服务合同法律依据与实践应用
- 2025年度商业街场地租赁合同解除书
- 2025年度大型活动安全预案人身免责及应急处理合同
- 2025年度山地滑雪场租赁管理服务协议
- 2025年广东环境保护工程职业学院单招职业适应性测试题库含答案
- 2025年度智能公寓简易版租赁合同
- 2025年度教育培训机构中途入股投资及分红合作协议
- 产品结构设计概述课件
- 八年级下综合实践教案全套
- 胸痹心痛中医诊疗方案及临床路径
- 第8课《山山水水》教学设计(新人教版小学美术六年级上册)
- word 公章 模板
- 泛读2unit2-music
- 世界技能大赛PPT幻灯片课件(PPT 21页)
- 中学生防溺水安全教育课件(PPT 44页)
- Python程序设计ppt课件完整版
- T∕ZSQX 008-2020 建设工程全过程质量行为导则
- 《腹膜透析》ppt课件
评论
0/150
提交评论