最近在用2530的定时器做捕捉和生成pwm,其中一块2530负责捕捉,另一块2530负责生成pwm,整理下笔记,方便以后查阅。
一、普通定时使用定时器来定时将tick自加,获得更精确的时间。代码如下(在其他地方将系统的时钟配置了32M,此处未贴出),说明如下。1,本例中定时器4的分频值为64,频率为2us,即每隔2us,T4CNT的值加1,直接写入0xC0是为了将其他位清除。
2,定时器的模式选择。简单来说,自由模式是从0到0xFF,倒计数是从T4CC0到0,模模式是从0到T4CC0,正反计数是从0到T4CC0再到0,所以在T4CC0相同的情况下,正反计数模式进入中断的时间为倒计数以及模模式的时间的两倍,当然是在允许中断的情况下,T4CCTLn的bit6为中断使能位。
3,本例子在T4的中断服务函数中将tick值加一(未贴出),每次进中断的时间为2us(定时器基础时钟)*10(T4CC0 的值)*2(正反计数所以乘以2)=40us,在外部获取tick 的值即可计算出精确时间。
static void Init_Timer4(void)
{
T4CTL = 0xc0; //定时器预分频值 64;32M/64 = 500k HZ 即2us
T4CTL |= 0x04; //计数器清零
T4CTL |= 0x3; // 3 使用正反计数模式
T4IE = 0; // Disable interrupt
T4CCTL0 = (1<<6) | (1<<2); //使能中断,设置比较模式
T4CC0 = 10; // 10*2 = 20 次产生一次中断 = > gettick的单位为40us(20*2us)
T4CTL = T4CTL | (1<<4); // Start timer
T4IE = 1; //Enable interrupt
}
二、输入捕获。
使用定时器3来捕获,代码如下。需要注意的有以下几个点。
1,确定定时器使用的位置。
2,确定所使用的通道对应的io口,并将该io口设置为复用功能。以及方向。
3,根据需要配置T3CTL和 T3CCTL1n即可,
static void Init_CaptureGPIO(void)
{
P1SEL |= (1<<7); //复用功能
P1DIR &= ~(1<<7); //设置 GPIO 口为输入
P1_7 = 1;
PERCFG |= (1<<5); //定时器3的备用位置2,必须设置
P2SEL |= (1<<5); //定时器3优先
}
static void Init_Timer3(void)
{
T3CTL = 0X00; //T3溢出中断屏蔽
T3CTL |= (1<<7); //16分频 - 1MHz
T3CTL |= (1<<2); //清除计数器
T3CTL |= (1<<3); //溢出中断使能
T3CTL |= (1<<4); //启动定时器 T3
T3CCTL1 &= ~(1<<2); //捕获模式
T3CCTL1 |= 0X01; //上升沿捕获
T3CCTL1 |= (1<<6); //使能通道1中断
IRCON = 0; //清除中断标志
T3IE = 1; //使能定时器3中断
}
三,生成pwm。
本例使用定时器1通道4来生成pwm,大致要注意以下几点。
1,首先要配置io口复用,然后是优先级,以及定时器选择的位置。
2,t1定时器是16位的,和t3、t4有一点要不同要注意,T1CCnL写入之后会先缓存,需要紧接着写对应的T1CCnH才能完全部16位数据的写入。
3,T1CTL 的配置同上,不再重复说明。
4,T1CCTL4 的配置比较简单,参考寄存器说明。模式的选择根据需要自行选择。本例选择的模式6,所以t1cnt从0开始计数时,输出高,到达T1CC4(也就是T1CC4H:T1CC4L,这里方便描述简写成T1CC4,T1CC0同理),输出低,并产生t1通道4的中断(如果允许中断的话),然后t1cnt继续加到T1CC0,输出高,自此一个周期完成。所以生成的pwm的高电平时间为0x7d(即T1CC4)*4us(定时器的频率),低电平的时间为(0xfa(即T1CC0)-0x7d(即T1CC4))*4us(定时器的频率),占空比为50%。
5,因为本例需要同时更改pwm的周期和占空比,以达到循环生成两种pwm的目的。而t1通道4进入中断的时候计数还没有结束,这个时候更改t1cc0的值会无效,所以需要使用t1通道1的中断。做法为关闭t1通道4的中断,并将t1通道1的中断打开。配置成模模式,其t1cc1的默认值为0,所以t1通道1进入中断的时候,t1cnt已经归零,此时在T1的中断服务函数中更改t1cc0和t1cc4的值即可,(中断服务函数未贴出)。
uint8 TickInit(void)
{
//T1做PWM产生
P0SEL |= (1<<6); //复用功能
P2SEL = P2SEL | (1<<3); //定时器1比定时器4优先
P2SEL &= ~(1<<4); //定时器1比uart0优先
PERCFG &= ~(1<<6); //定时器1位置1
T1CTL = 0x00 ;
T1CTL |=(3<<2); //128分频 4us
T1CTL |=(1<<1); //模模式
T1CC0L = 0xfa;
T1CC0H = 0x00;
T1CC4L=0x7d;
T1CC4H=0x00;
T1CCTL4 |=(6<<3);// 6 比较模式3 0或者等于T1CC0时,清除输出(输出1)等于T1CC4时设置输出(输出0)
T1CCTL4 |=0x04; //比较模式。不捕获
//定时器开始运行
T1CCTL4 &= ~(1<<6); //不允许中断
T1CCTL1 |=0x04; //比较模式。不捕获
T1CCTL1 |= (1<<6);//允许中断
T1IE=1;
}
同时更改周期和占空比的方法是在TI社区上受大牛指点,然后亲测可行,另外,如果文中我有理解的不对的地方欢迎大家指出。