📄 timera练习.c
字号:
//MSP430的TimerA练习实例[入门必学]
//微控设计网原创作品 作者:DC版主
//作者:微控设计网 DC版主
// MC430F11实验参考图片
//增计数模式工作示意图
//关于TA的详细原理,请到学习专区中查看我整理的TA资料。
//此例程已在MC430F11实验板上验证过
//利用MC430F11开发板实验的TimerA
//增计数模式学习实验.
#include <msp430x11x1.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止
P1DIR |= BIT0+BIT2+BIT3; // P1.0,P1.2,P1.3为输出
CCTL0 = CCIE; // CCR0中断允许
CCR0 = 8000; // 为CCR0写入初值
CCTL1 = CCIE; // 类同上...
CCR1 = 6000;
CCTL2 = CCIE; // 类同上...
CCR2 = 4000;
TACTL = TASSEL_1 + MC_1; // 设置TA工作模式
// 时钟源=ACLK,工作在增计数模式
_EINT(); //开总中断
LPM0; //进入低功耗模式0
}
//****************************************************************************
// Timer A0 中断服务程序, A0是指CCR0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
P1OUT ^= BIT0; // MC430F11板上的D1 LED闪烁
}
//****************************************************************************
// Timer A3 中断服务程序, A3是指CCR1,CCR2,TAR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A3(void)
{
switch( TAIV )
{
case 2: P1OUT ^= BIT2; // CCR1
break; // MC430F11板上的D2 LED闪烁
case 4: P1OUT ^= BIT3; // CCR2
break; // MC430F11板上的D3 LED闪烁
case 10: // TAR
break;
}
}
[ 此帖最后由DC在2010-5-5 19:26:26从 DIY制作分享区 转移过来 ]
欢迎热心网友积极参与回贴,共同创造有活力的论坛。
DC 2007-03-11 19:48:45 引用评价第2楼
门派网站成员职务总版主声望+9财富5积分3276经验372930文章5838注册2006-03-07 到淘宝MCCS店购买微控产品,现可提供发票!
TimerA连续计数模式例程
//连续计数模式工作示意图
关于TA的详细原理,请到学习专区中查看我整理的TA资料。
此例程已在MC430F11实验板上验证过
//利用MC430F11开发板实验的TimerA 增计数模式学习实验.
//编写:www.microcontrol.cn DC
#include <msp430x11x1.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止
P1DIR |= BIT0+BIT2+BIT3; // P1.0,P1.2,P1.3为输出
CCTL0 = CCIE; // CCR0中断允许
CCR0 = 8000; // 为CCR0写入初值
CCTL1 = CCIE;
CCR1 = 6000;
CCTL2 = CCIE;
CCR2 = 4000;
TACTL = TASSEL_1 + MC_2; // 设置TA工作模式
// 时钟源=ACLK,工作在连续计数模式
_EINT();
LPM0;
}
// Timer A0 中断服务程序, A0是指CCR0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
P1OUT ^= BIT0; // MC430F11板上的D1 LED闪烁
CCR0 = CCR0+8000; //增加下一次相等的计数值
}
// Timer A3 中断服务程序, A3是指CCR1,CCR2,TAR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A3(void)
{
switch( TAIV )
{
case 2: P1OUT ^= BIT2; // CCR1-CCIFG1
CCR1 = CCR1+6000; //增加下一次相等的计数值
break; // MC430F11板上的D2 LED闪烁
case 4: P1OUT ^= BIT3; // CCR2-CCIFG2
CCR2 = CCR2+4000; //增加下一次相等的计数值
break; // MC430F11板上的D3 LED闪烁
case 10: // TAR-TAIFG,TAR中断在此例程中未用上
break;
}
}
[ 此贴最后由DC在2008-11-1 13:10:47编辑过 ]
欢迎热心网友积极参与回贴,共同创造有活力的论坛。
DC 2007-03-11 21:08:01 引用评价第3楼
门派网站成员职务总版主声望+9财富5积分3276经验372930文章5838注册2006-03-07
//增减计数模式例程
//利用MC430F11开发板实验的TimerA 增减计数模式学习实验.
//利用CCR0,CCR1,CCR2结合增减计数模式产生两路PWM信号输出.
//timer_A.out1输出为PWM 翻位/置位模式
//timer_A.out2输出为PWM 翻位/复位模式
//编写:www.microcontrol.cn DC
#include <msp430x11x1.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 狗仔放假
P1DIR |= BIT0; // P1.0为输出
P2DIR |= BIT3+BIT4; // P2.3,P2.4为输出
P2SEL |= BIT3+BIT4; // TimerA-OUT1,OUT2功能输出
TACCTL1 |= OUTMOD_6; //timer_A.out1输出为PWM 翻位/置位模式
TACCTL2 |= OUTMOD_2; //timer_A.out2输出为PWM 翻位/复位模式
CCTL0 = CCIE; //CCR0中断在实际应用中,可以省去.
CCR0 = 1666; //选择ACLK约30us,增减计数周期是CCR0周期时间的2倍
//CCR0在增减计数模式,PWM周期约1666*30us*2=100mS
CCR1 = 833; //半方周期约833*30us*2=50mS
CCR2 = 600; //6003*30us*2=36mS (死区时则为50-36=14ms/2=7mS)
TACTL = TASSEL_1 + MC_3; // 设置TA工作模式
// 时钟源=ACLK,工作在增减计数模式
_EINT();
LPM0;
}
//在实际PWM输出中,可以不使用CCR0中断,此例只用于LED指示.
// Timer A0 中断服务程序, A0是指CCR0
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
P1OUT ^= BIT0; // MC430F11板上的D1 LED闪烁
}
本例子中,是在驱动H桥时可以避免两相驱动电路产生关闭不当时时产生的过载。在本例两个PWM信号中,开与关之间产生了死区时间。有效防止两相同时开启的可能。
死区时间=TimerA_clk * (CCR1-CCR2)
TimerAclk:是定时器A的输入时钟周期。
CCR1,CCR1则是分别CCR1,2的值。
以下是本例程中用ezDSO虚拟示波器测量到的实验波形,图中标示的是死区时间。
[ 此贴最后由DC在2008-11-1 13:11:15编辑过 ]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -