飞思卡尔TPM——PWM边沿输出
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
//===================================================================== ==================================
//函数名:Init_tpm1_ch0_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch0_output(void)
{
TPM1C0VH=0x00;
TPM1C0VL=0xC8;
TPM1C0SC=0x64;//通道0中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm1_ch1_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道1中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch1_output(void)
{
TPM1MODH=0x01;
TPM1MODL=0x90;
TPM1C1VH=0x00;
TPM1C1VL=0xC8;
TPM1C1SC=0x64;//通道1中断使能,边沿PWM模式,通道引脚高有效
TPM1SC=0x08;//TPM1时钟源为总线时钟;分频系数为1;溢出中断禁止
TPM1CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
}
//===================================================================== ==================================
//函数名:Init_tpm1_ch2_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch2_output(void)
{
TPM1C2VH=0x00;
TPM1C2VL=0xC8;
TPM1C2SC=0x64;//通道2中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm1_ch3_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch3_output(void)
{
TPM1C3VH=0x00;
TPM1C3VL=0xC8;
TPM1C3SC=0x64;//通道3中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm1_ch4_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch4_output(void)
{
TPM1C4VH=0x00;
TPM1C4VL=0xC8;
TPM1C4SC=0x64;//通道4中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm1_ch5_output
//作用:初始化TPM1;内部时钟工作于自时钟模式,总线频率8M;TPM1溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=400/(8/1)近似50us
//===================================================================== ==================================
void Init_tpm1_ch5_output(void)
{
TPM1C5VH=0x00;
TPM1C5VL=0xC8;
TPM1C5SC=0x64;//通道5中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm2_ch0_output
//作用:初始化TPM2;内部时钟工作于自时钟模式,总线频率8M;TPM2溢出中断禁止;通道0中断使能;
//通道引脚状态反转时间间隔=800/(8/1)近似100us
//===================================================================== ==================================
void Init_tpm2_ch0_output(void)
{
TPM2C0VH=0x01;//通道寄存器高
TPM2C0VL=0x90;//通道寄存器低
TPM2C0SC=0x64;//通道0中断使能,边沿PWM模式,通道引脚高有效
}
//===================================================================== ==================================
//函数名:Init_tpm2_ch1_output
//作用:初始化TPM2;内部时钟工作于自时钟模式,总线频率8M;TPM2溢出中断禁止;通道1中断使能;
//通道引脚状态反转时间间隔=800/(8/1)近似100us
//===================================================================== ==================================
void Init_tpm2_ch1_output(void)
{
TPM2MODH=0x03;
TPM2MODL=0x20;
TPM2C1VH=0x01;
TPM2C1VL=0x90;
TPM2C1SC=0x64;//通道1中断使能,边沿PWM模式,通道引脚高有效
TPM2SC=0x08;//TPM1时钟源为总线时钟;分频系数为1;溢出中断禁止
TPM2CNTH=0;//任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
}
//======================
void Init_IO(void)
{
//LED
PTBDD = 0xFF;//LED输出
PTCDD_PTCDD3=1;
PTBD = 0x00;
PTCD_PTCD3 = 1;
PTDDD = 0xFF;
}
//=================================================== //函数名:delay()
//作用:延时,该函数浪费CPU时间,在实际工程中酌情使用
//输入参数:无
//输出参数:无
//==================================================== void delay(void)
{
word i;
i=0x7FFF;
while(i--)__RESET_W ATCHDOG();//喂狗;
}
//=============================
void main(void) {
unsigned char val = 0x10;
Init_IO();
Init_tpm1_ch0_output();
Init_tpm1_ch2_output();
Init_tpm1_ch3_output();
Init_tpm1_ch4_output();
Init_tpm1_ch5_output();
Init_tpm1_ch1_output();
Init_tpm2_ch0_output();
Init_tpm2_ch1_output();
EnableInterrupts; /* enable interrupts */
/* include your code here */
for(;;) {
PTBD |= val;
delay();
PTBD &= ~val;
val = val << 1;
if(val == 0){
val = 0x10;
}
__RESET_W ATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
//==================计数器1溢出中断服务程序========================== interrupt VectorNumber_Vtpm1ovf void TPM1_OVF_ISR(void)
{
if((TPM1SC & 0x80)==0x80)
{
TPM1SC_TOF=0;
PTBD_PTBD0=~PTBD_PTBD0;
}
}
//==================计数器2溢出中断服务程序========================== interrupt VectorNumber_Vtpm2ovf void TPM2_OVF_ISR(void)
{
if((TPM2SC & 0x80)==0x80)
{
TPM2SC_TOF=0;
PTBD_PTBD1=~PTBD_PTBD1;
}
}
//==================计数器1通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch0 void TPM1_CH0OUT_ISR(void)
{
if((TPM1C0SC & 0x80)==0x80)
{
TPM1C0SC_CH0F=0;
//TPM1MODH=0x5e;可更改模寄存器的值
//TPM1MODL=0x20;
}
}
//==================计数器1通道1事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch1 void TPM1_CH1OUT_ISR(void)
{
if((TPM1C1SC & 0x80)==0x80)
{
TPM1C1SC_CH1F=0;
}
}
//==================计数器1通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch2 void TPM1_CH2OUT_ISR(void)
{
if((TPM1C2SC & 0x80)==0x80)
{
TPM1C2SC_CH2F=0;
//TPM1MODH=0x5e;可更改模寄存器的值
//TPM1MODL=0x20;
}
}
//==================计数器1通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch3 void TPM1_CH3OUT_ISR(void)
{
if((TPM1C3SC & 0x80)==0x80)
{
TPM1C3SC_CH3F=0;
//TPM1MODH=0x5e;可更改模寄存器的值
//TPM1MODL=0x20;
}
}
//==================计数器1通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch4 void TPM1_CH4OUT_ISR(void)
{
if((TPM1C4SC & 0x80)==0x80)
{
TPM1C4SC_CH4F=0;
//TPM1MODH=0x5e;可更改模寄存器的值
//TPM1MODL=0x20;
}
}
//==================计数器1通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm1ch5 void TPM1_CH5OUT_ISR(void)
{
if((TPM1C5SC & 0x80)==0x80)
{
TPM1C5SC_CH5F=0;
//TPM1MODH=0x5e;可更改模寄存器的值
//TPM1MODL=0x20;
}
}
//==================计数器2通道0事件中断服务程序===========================
interrupt VectorNumber_Vtpm2ch0 void TPM2_CH0OUT_ISR(void)
{
if((TPM2C0SC & 0x80)==0x80)
{
TPM2C0SC_CH0F=0;
}
}
//==================计数器2通道1事件中断服务程序===========================
interrupt VectorNumber_Vtpm2ch1 void TPM2_CH1OUT_ISR(void)
{
if((TPM2C1SC & 0x80)==0x80)
{
TPM2C1SC_CH1F=0;
}
}。