Freescale MC9S08单片机芯定时器6
1、MC9S08AW60有几个TPM模块?每个模块有几个通道?每个通道都有什么功能?每个TPM模块有几个中断资源?
(1)2
(2)TPM1:6 TPM2:2
(3)输入捕捉,输出比较,PWM
(4)TPM1有7个中断源(一个溢出事件6个通道事件),TPM2有3个中断源(一个溢出事件,2个通道事件)
2、TPM模块的核心部分有几个控制寄存器?都有什么功能?如果设计一个定时间隔时要进行什么设置?(如设计接在B口上的八个LED每隔500ms一亮一灭)完成这个功能的程序设计?
(1)1个
(2)D7:TOF 定时器溢出标志位
D6:TOIE 定时器溢出中断允许位
D5:CPWMS 中心对齐PWM选择位
D3~D4:CLKS 时钟源选择位
D2~D0:定时器分频因子选择位
(3)【注:程序仅为大体思路,变量的定义等细节自己注意】
TPM初始化
void TPM1Init(void){
TPM1SC=( 0b00010111);
//TPM1时钟源选择系统时钟(20MHZ), 分频因子128
TPM1MODH= 0x3D ;
TPM1MODL= 0x09 ; //根据时钟源及分频因子,将TPM1的定时时间设定为100ms
TPM1CNTH=0x00;
TPM1CNTL=0x00;
}
注意:定时器设置TPMxMODH:L的值必须先要列出计算该值的计算过程
计算方式为:
(1/系统时钟)*分频因子=a 设定时间ms/a*10^-3(最后的值不能超过65535)
中断实现灯灭灯亮
interrupt 11 void TPM1_100msover(void)
{
uint8 temp;
Count_100ms++;
while(Count_100ms== 5 ){
PTBD= ~PTBD ;
Count_100ms= 0 ;
}
temp = TPM1SC ;
TPM1SC&=~TPM1SC_TOF_MASK;
}
3、每个TPM模块的每个通道有什么控制寄存器?各控制寄存器的功能?
TPM通道数值寄存器:当指定的沿跳变发生(即定时系统捕捉到沿跳变)时,锁存计数寄存器的值
TPM通道状态和控制寄存器:
4、TPM模块的某个通道设置为输入捕捉,并计数捕捉到的脉冲数(例如TPM1 的通道0上接入光电编码器,设计完成相关程序使通道0对光电编码的输出 脉冲计数)
TPM1的初始化
void TPM1Init(void){
TPM1SC= 0b00001110 ;
//TPM1不允许溢出中断, 时钟源选择系统时钟(20MHZ), 分频因子64
TPM1MODH= 0x18 ;
TPM1MODL= 0x6A ; //如果只是输入捕捉并不需要一个特定的定时周期,只要定时 器工作就可以
TPM1CNTH=0x00;
TPM1CNTL=0x00;
}
void TPM1ChInit(void){
//设置通道0允许中断,输入捕捉,捕捉上升沿
TPM1C0SC= 0b00000100; }
中断完成脉冲计数
interrupt 13 void TPM1Ch0_isr(void){
uint8 temp;
uint16 P2_count;
P2_count++;
if (P2_count==65535) {
P2_count=0;
P2Sum++;
}
temp= TPM1C0SC ;
TPM1C0SC&= ~(TPM1C0SC-CH1F-MASK); //清除中断标志位
}
5、TPM模块的某个通道设置为输出比较,输出方波(例如TPM1的通道1输 出10KHZ的方波,设计完成相关程序)
TPM1的初始化
void TPM1Init(void){
TPM1SC= 0b00001001 ;
//TPM1不允许溢出中断, 时钟源选择系统时钟(20MHZ), 分频因子2
TPM1MODH= 0x01 ;
TPM1MODL= 0xF4 ; //根据时钟源及分频因子,将TPM1的定时周期设定为0.1ms
【注:周期两倍的关系,即真正计算时间为50us;周期设定计算方法为:1/10kHZ】
TPM1CNTH=0x00;
TPM1CNTL=0x00;
}
void TPM1ChInit(void){
//设置通道1为禁止中断,输出比较输出方式为翻转
TPM1C1SC= 0b01010100;
//以下两行可设可不设
TPM1C1VH=0x01;
TPM1C1VL=0x01;
}
6、TPM模块的某个通道输出某个占空比的PWM脉冲(例如TPM1的通道2输 出20KHZ、占空比为60%的PWM,设计相关程序)
TPM初始化
void TPM1Init(void)
{
//设置TPM1禁止溢出中断,时钟源为总线时钟,2分频
TPM1SC= 0b00001001;
TPM1CNTH=0x00;
TPM1CNTL=0x00;
TPM1MODH=0x01 ;
TPM1MODL=0xF4;
}
void TPM1Ch_Init(void) {
TPM1C2SC= 0b00101000 ;
//设置TPM1通道2不允许中断,low-truePWM方式
TPM1C2VL=((模数寄存器值/100 )*60 )/256;
TPM1C2VH=((模数寄存器值/100 )*60 )%256;
}
注:整理自网络