msp430的定时器主要是指基本定时器,看门狗定时器和TA\TB定时器,两种定时器从功能和用法的角度基本相似,TB功能更为强大,有7个CCR0寄存器,即可输出六路PWM,在做三相逆变的时候,需要六路每路相差60°的spwm波,就是用TB来发生的。
定时器的PWM发生利用的是比较模式,即在CCR0中储存周期,CCR1中储存一个小于CCR0的数字,CCR1/CCR0的比值即为占空比,其原理如下图所示:
在一个16位计数器TAR增加的过程中,当达到CCR1前输出高电平,达到CCR0值前输出低电平,达到CCR0后,重新置位。
与TA相关的寄存器分为四类:
1、TACCRx(CCRx) //捕获/比较寄存器
2、TACCTLx(CCTLx) //捕获/比较控制寄存器
3、TACTL //控制寄存器
4、TAIV //中断向量寄存器
/*************TACCRx*************/
该寄存器使用最简单,可读可写,在PWM输出中CCR0常用作周期,CCR1中用作占空比。,具体作用方法见7-2图
/************TACCTLx*************/
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CAPTMOD1-0 CCIS1-0 SCS SCCIx CAP OUTMODx CCIEx CCIx OUT COV CCIFx
CAPTMOD1-0 :
选择捕获模式
00 禁止捕获模式
01 上升沿捕获
10 下降沿捕获
11 上升沿与下降沿都捕获
CCISI1-0 :
在捕获模式中用来定提供捕获事件的输入端
00 选择CCIxA
01 选择CCIxB
10 选择GND
11 选择VCC
SCS:
选择捕获信号与定时器时钟同步、异步关系
0 异步捕获
1 同步捕获
异步捕获模式允许在请求时立即将CCIFG置位和捕获定时器值,适用于捕获信号的周期远大于定时器时钟周期的情况。但是,如果定时器时钟和捕获信号发生时间竞争,则捕获寄存器的值可能出错。
在实际中经常使用同步捕获模式,而且捕获总是有效的。
SSCIx 比较相等信号EQUx将选择中的捕获、比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。
CAP:
选择捕获模式还是比较模式。
0 比较模式
1 捕获模式
注意:同时捕获和捕获模式选择
如果通过捕获比较寄存器CCTLx中的CAP使工作模式从比较模式变为捕获模式,那么不应同时进行捕获;否则,在捕获比较寄存器中的值是不可预料的,推荐的指令顺序为:[1]修改控制寄存器,由比较模式换到捕获模式。
[2]捕获
OUTMODx :
选择输出模式
000 输出
001 置位
010 PWM翻转/复位
011 PWM置位/复位
100 翻转/置位
101 复位
110 PWM翻转/置位
111 PWM复位/置位
关于2和3的关系:
置位就是对寄存器的某一位写"1"
复位就是使寄存器恢复到初始状态值。
翻转就是该位的电平由"1"变为"0"或者由"0"变为"1"
在实际应用中,一般使用3和6或者2和7输出一对可以互补的pwm,其他几种感觉实际应用不是很强,此外翻转与置位感觉在此差别不大
同时关于输出模式,有下图
CCIx :
捕获比较模的输入信号
捕获模式:由CCIS0和CCIS1选择的输入信号通过该位读出。
比较模式:CCIx复位。
OUT :
输出信号
0 输出低电平
1 输出高电平
如果OUTMODx选择输出模式0(输出),则该位对应于输入状态。
COV :
捕获溢出标志
0 输出低电平
1 输出高电平
[1]当CAP=0时,选择比较模式。捕获信号发生复位,没有使COV置位的捕获事件。
[2]当CAP=1时,选择捕获模式,如果捕获寄存器的值被读出再次发生捕获事件,则COV置位。程序可检测COV来断定原值读出前是否又发生捕获事件。读捕获寄存器时不会使溢出标志复位,须用软件复位。
CCIFGx:
捕获比较中断标志
捕获模式:寄存器CCRx捕获了定时器TAR值时置位。
比较模式:定时器TAR值等于寄存器CCRx值时置位。
1、在比较模式输出pwm的情况下,一般对TACCTL设置的方法是CCTL0 = OUTMOD_2;而若另外一个IO口设置为CCTL0 = OUTMOD_6;则两路为互补的,这在做逆变两个导通情况需要正好相反的情况下是非常方便的,用这种方法,也只要控制每两路之间相差120°,每一个再输出一个差180°的就可以输出六路,从而实现三相逆变。
2、在捕获模式下,一般设置的方法是
CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.1) + Capture Mode + Interrupt
/************TACTL*************/
15--10 9 8 7 6 5 4 3 2 1 0
未用 SSEL1 SSEL0 ID1 ID0 MC1 MC0 未用 CLR TAIE TAIFG
SSEL1、SSEL0:
选择定时器输入分频器的时钟源
Timer_A时钟源
SSEL1 SSEL0 输入时钟源 说明
0 0 TACLK 用特定的外部引脚信号
0 1 ACLK 辅助时钟
1 0 SMCLK 子系统时钟
1 1 INCLK 见器件说明
ID1,ID0:
输入分频选择
00 不分频
01 2分频
10 4分频
11 8分频
MC1,MC0 :
计数模式控制位
00 停止模式
01 增计数模式
10 连续计数模式
11 增/减计数模式
CLR:
定时器清除位
POR或CLR置位时定时器和输入分频器复位。CLR由硬件自动复位,其读出始终为0。定时器在下一个有效输入沿开始工作。如果不是被清除模式控制暂停,则定时器以增计数模式开始工作。
TAIE :
定时器中断允许位
0 禁止定时器溢出中断
1 允许定时器溢出中断
TAIFG:
定时器溢出标志位
增计数模式: 当定时器由CCR0计数到到0时,TAIFG置位。
连续计数模式:当定时器由0FFFFH计数到0时,TAIFG置位。
增/减计数模式:当定时器由CCR0减计数到0时,TAIFG置位。
TACTL设置起来比较简单,而且变化不多,不论是捕获还是比较模式相差都不很大,基本上都是只要选择一个时钟源(TASSEL)和一个计数模式(MC),时钟源一般会选择TASSEL_2(SMCLK,在没开XT2的情况下,默认800khz,在开XT2的情况下可达8MHZ),TASSEL_1(ACLK,一般不需分频,则为32768HZ)。计数方式一般都会选择增计数模式MC_1;少数情况下MC_3据说可用来生成对称波,没有试过,但是MC_3会把普通pwm的频率减半.......(使我naive的以为语句要占运行时间,所以即使使用8M晶振也只能达到4M频率而已)
TA总结如是,TB只是比他多了几个CCR和CCLT而已,可以用来输出6路pwm,总的评价一下定时器,主要用比较模式来生成PWM波(含SPWM波),捕获模式用来测频,测频精度非常高,感觉基本能满足鄙人要求....,以后在构架系统的时候,应该会利用TB来输出PWM,用TA测频及测相,在需要测频较多的情况下使用TB测频测相。P2.4-P2.7用来键盘,P5.2-P5.6用来液晶显示,基本人机交互和系统需求应该都可以满足