一、实验室名称:MSP430 单片机实验室
二、实验项目名称:25Hz 方波发生及峰值幅度测量
三、实验原理:
(1)通用功能 I/O
参见实验一中相关原理介绍。
(2)定时器(Timer)
定时功能模块是 MSP430 应用系统中经常用到的重要部分,可用来实现定时控制、延迟、
频率测量、脉宽测量和信号产生、信号检测等等。一般来说,MSP430 所需的定时信号可以
用软件和硬件两种方法来获得。
MSP430 系列有丰富定时器资源:看门狗定时器(WDT),定时器 A(Timer_A),定
时器 B(Timer_B)和定时器 D(Timer_D)等。MSP430 系列定时器部件功能,如表 2-1 所
示:
表 2-1 MSP430 中定时器的功能
(a)看门狗定时器,主要作用在于当“程序跑飞”时,会产生溢出,从而产生系统复位,
CPU 需要重新运行用户程序,这样程序就可以又回到正常运行状态。MSP430 看门狗模块
具有以下特性:
8 种软件可选的定时时间
看门狗工作模式
定时器工作模式
带密码保护的 WDT 控制寄存器
时钟源可选择
为降低功耗,可停止
1
时钟失效保护
(b)定时器 A 由一个 16 位定时器和多路捕获/比较通道组成。MSP430X5XX / 6XX 系列单
片机的 Timer _A 有以下特性:
带有 4 种操作模式的异步 16 位定时/计数器
输入时钟可以有多种选择,可以是慢时钟,快时钟以及外部时钟
可配置捕获/比较寄存器数多达 7 个
可配置的 PWM(脉宽调制)输出
异步输入和同步锁存。不仅能捕获外部事件发生的时间还可锁定其发生时的高低电平
完善的中断服务功能。快速响应 Timer_A 中断的中断向量寄存器
8 种输出方式选择
可实现串行通讯
Timer_A 由以下 4 部分组成:
定时计数器:16 位定时/计数寄存器——TAxR
时钟源的选择和分频 :定时器时钟 TACLK 可以选择 ACLK,SMCLK 或者来自外部的
TAxCLK。选择的时钟源,可以通过软件选择分频系数(2、3、4、5、6、7、8)。
捕获/比较器:用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要是为了
提高 I/O 端口处理事务的能力和速度。
输出单元:具有可选的 8 种输出模式,用于产生用户需要的输出信号,支持 PWM。
定 时 器 工 作 模 式 包括 停 止 模 式 、 增 计 数 模 式 、 连 续计 数 模 式 和 增/ 减 计 数 模 式 。
MSP430X5XX / 6XX 系列单片机的 Timer_A 的 4 种计数模式如表 2-2 所示。
表 2-2 Timer_A 的 4 种计数模式
Timer_A 有多个相同的捕获/比较模块,为实时处理提供灵活的手段,每个模块都可用
于捕获事件发生的时间或产生定时间隔。通过 TAxCCTLn 中的 CAP 位选择模式,该模块既
可用于捕获模式,也可用于比较模式。当发生捕获事件或定时时间到都将引起中断。
捕获模式
当 TAxCCTLn 中的 CAP = 1,该模块工作在捕获模式。每个捕获/比较寄存器可以用来
记录时间事件,例如:
▲ 测量软件程序所用时间
▲ 测量硬件事件之间的时间
2
▲ 测量系统频率
用 CM1 和 CM0 位选择捕获条件,可以选择禁止捕获、上升沿捕获、下降沿捕获或者
上升沿下降沿都捕获。当捕获完成后,定时器的值被复制到 TAxCCRn 寄存器,并且中断
标志 CCIFG 置位。如果总的中断允许位 GIE 允许,相应的中断允许位 CCIE 也允许,则将
产生中断请求。
比较模式
当 TACCTLx 中的 CAP = 0,该模块工作在比较模式。比较方式主要用于为软件或应用
硬件产生定时,还可为 D/A 转换功能或者马达控制等各种用途产生脉宽调制(PWM)输出
信号。
在计数器 TAxR 计数到 TAxCCRn(n 代表具体的捕获比较寄存器)的值时:
▲ 中断标志 CCIFG 置位
▲ 内部信号 EQUx=1
▲ EQUx 根据输出模式影响输出
▲ 输入信号 CCI 被锁存在 SCCI
每个捕获/比较模块都包含一个输出单元,用于产生输出信号。每个输出单元有 8 种工
作模式,可产生基于 EQUx 的多种信号。除模式 0 外,其他模式的输出都在定时器时钟上
升沿时发生变化。输出模式 2,3,6,7 不适合输出单元 0,因为 EQUx=EQU0。
输出单元在输出控制位 OUTMODx 的控制下,有 8 种输出模式输出信号。这些模式与
TAxR、TACCTLx、TAxCCR0 的值有关,如表 2-3 所示。
表 2-3 输出单元的 8 种输出模式
Timer_A 中断可由计数器溢出引起,也可以来自捕获/比较寄存器。每个捕获/比较模块
可独立编程,由捕获/比较外部信号以产生中断。Timer_A 模块使用两个中断向量,一个单
独分配给捕获/比较寄存器 TAxCCR0;另一个作为共用中断向量用于定时器和其他的捕获/
比较寄存器。TAxCCR1~TAxCCRx 和定时器按照优先次序结合共用一个中断向量,属于多
源中断。中断向量寄存器用于确定哪个标志请求中断。
3
(c)定时器 B(Timer_B)是一个带有多路捕获/比较寄存器的 16 位定时/计数器。除了在
捕获/比较模块中 Timer_B 比 Timer_A 增加了比较锁存器,Timer_B 和 Timer_A 的结构几乎
相同。多个比较锁存器还可以成组工作,以达到同步更新比较数据的目的。
Timer_B 与 Timer_A 的对比:
Timer_B 计数长度为 8 位,10 位,12 位和 16 位可编程,而 Timer_A 的计数长度固定为
16 位。
Timer_B 中没有实现 Timer_A 中的 SCCI 寄存器位的功能。
Timer_B 在比较模式下的捕获/比较寄存器功能与 Timer_A 不同,增加了比较锁存器。
所有的 Timer_B 输出实现了高阻输出。
比较模式的原理稍有不同:在 Timer_A 中,TAxCCRx 寄存器中保存与 TAxR 相比较的
数据;而在 Timer_B 中,TBxCCRx 寄存器中保存的是要比较的数据,但并不直接与定
时器 TBxR 相比较,而是将 TBxCCRx 送到与之相对应的锁存器之后,由锁存器与定时
器 TBxR 相比较。
(d)定时器 D(Timer_D)是一个带有多路捕获/比较寄存器的 16 位定时/计数器。除了在
捕获/比较模块中 Timer_D 比 Timer_B 增加了高分辨率生成器,Timer_D 和 Timer_B 的结构
几乎相同。
Timer_D 与 Timer_B 的对比:
支持高分辨率模式。
Timer_D 支持在同一个捕获/比较通道中,合并使用两个相邻的 TDCCRx 寄存器,控
制 PWM 的上升沿或下降沿。
Timer_D 支持双捕获事件模式。
Timer_D 支持外部故障输入,外部清除输入和信号。
Timer_D 可以与第二个定时器同步。
定时器 A 的控制流程大约分四步:定时器的配置和初使化、 定时器的输出、定时器
的中断处理。
(3)模数转换器(AD)
模数转换器(ADC)从信号系统中采集信号电压,经过信号处理之后,将其转换为等
效的数字量。模/数转换电路的作用是将输入连续变化的模拟信号变换为与其成正比的数字
量信号输出。在进行模/数(即 A/D)转换时,通常按取样、保持、量化、编码四个步骤进
行。
MSP430 的 ADC12_A 模块支持快速 12 位模数转换;该模块包含:
12 位 SAR 核
采样选择控制
参考电流发生器
ADC12_A 模块特点是:
4
大于 200 ksps 的最大转换速率
无失码的 12 位单调转换器
软件或定时器控制的可编程采样保持周期
通过软件或定时器控制转换开始
软件可选择的片上参考电压生成器(MSP430F54xx:1.5 V 或 2.5 V,其他设备:1.5 V,
2.0 V,2.5 V)
软件选择的内部或外部参考
多达 12 个可单独配置的外部输入通道
内部温度传感器的转换通道,AVCC,和外部参考
独立的信道选择的正负电压参考源(仅限 MSP430F54xx 系列)
可选择的转换时钟源
单通道,重复单通道,序列(自动扫描),重复序列(重复自动扫描)转换模式
ADC 内核和参考电压可单独实现掉电
快速解码的 18 位 ADC 中断的中断向量寄存器
16 个转换结果存储寄存器
详细的关于 MSP430F5529 的 ADC 模块的使用说明,请参见数据手册。
(3)OLED 操作
参见实验一
四、实验目的:
要求学习掌握基于定时器产生某种频率方波的原理,MSP430 单片机 IO 口的操作和使
用 AD 进行采样并测量的操作。学习基于 430 单片机集成编译仿真环境的代码调试。
五、实验内容:
通过对 MSP430F5529 开发板编程,从 IO 口产生一个 25Hz 方波信号,并用 AD 模块测
量该方波信号的峰值幅度值显示于 OLED 上,要求:
1、利用 MSP430 定时器和通用 IO 产生 25Hz 方波。
2、利用 MSP430 内部 AD 测量出该方波峰值幅度并显示在 OLED 上。
拓展要求:
1、通过往复按键改变所产生方波的频率为 50Hz,75Hz 和 100Hz。
2、利用 AD 同时测量出其频率变化显示于 OLED。
六、实验器材(设备、元器件):
MSP430F5529 开发板,下载线,IAR
5
七、实验步骤及实验数据结果分析:
(1)实验的程序流程框图:
设置时钟和定时器
以及 ADC
打开 ADC
计数上升沿
等待 1S
显 示 上 升 沿 个
数(频率)
N
N
ADC12IFG1
读取 ADC12MEM1
显示峰值
(2)实验的程序代码(含注释):
#include "msp430f5529.h"
#include "IIC.c"
#include "stdio.h"
unsigned int HZ[4]={25,50,75,100};
unsigned int index=0;
unsigned int result;
6
unsigned int test_hz;
unsigned int flag;
unsigned char *string;
unsigned char buff[3];
//float result_s;
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW+WDTHOLD;
UCSCTL3|=SELREF_2;
UCSCTL0_H=0x08;
UCSCTL1|=DCORSEL_4;
UCSCTL2|=304;
UCSCTL2|=FLLD_0; //10MHZ,MCLK,主时钟
UCSCTL4|=SELA_2;
//PWM 波产生
P2DIR|=BIT0;
//p2.0 为方波输出端口
//Aclk 选择 refoclock,32768hz
TA0CCR0=(int)(32768/(2*HZ[index]));
TA0CTL|=TASSEL_1+MC_1+TACLR;
TA0CCTL0=CCIE;
//使能中断
//设置半周期中断一次,使输出反转
//time a0 增计数模式
P6SEL|=BIT1;
P6DIR&=~BIT1; //ADC12 选择 6.1 端口通道
ADC12CTL0=ADC12SHT0_2+ADC12ON;
ADC12CTL1=ADC12SHP+ADC12CSTARTADD_1+ADC12CONSEQ_0;
//采样输入信号上升沿触发采样定时器+选择 MEM1+单次采样
ADC12MCTL2|=ADC12INCH_1; //选择通道 A1
//设置采样周期+启动 adc12
P2DIR&=~BIT1;
P2IFG=0x00;
P2IE|=BIT1;
P2IES|=BIT1;
P2REN|=BIT1;
P2OUT|=BIT1;
//按键中断设置
7
LCD_Init();
__enable_interrupt(); //使能中断
while(1)
{
ADC12CTL0|=ADC12ENC;
ADC12CTL0|=ADC12SC;
//开始采样
TA1CTL|=TASSEL_1+MC_1+TACLR; //设置定时器 A1
TA1CCR0=0XFFFF;
while(TA1R<32768)
{
//定时 1S
if((P2OUT&BIT0)==0)
flag=1;
if((flag==1)&&(P2OUT&BIT0))
{
test_hz++; //检测到上升沿,加一,即频率
flag=0;
}
}
LCD_ShowNum(10,1,test_hz,4,16); //显示频率
LCD_ShowChar(50,1,'H',16);
LCD_ShowChar(58,1,'Z',16);
test_hz=0;
if(ADC12IFG1)
//检测转换完成
{
result=ADC12MEM1;
//读取采样的值
}
/*
result_s=(result*3.3)/4096;
sprintf(buff,"%3.2f",result_s);
string=&buff[0];
LCD_ShowString(10,3,string,16); //显示浮点数
//转换为小数
*/
LCD_ShowNum(10,3,result,4,16);
//显示采样值
}
}
//TIMEA0 中断
#pragma vector=TIMER0_A0_VECTOR
__interrupt void time_a0(void)
{
P2OUT^=0x01;
//输出电平反转
}
8