kinetis的FTM例程——输出比较和PWM
0赞FTM不仅能简单计数,还可以进行通道操作,当计数到通道比较值时可“置高、置低、翻转引脚”或是PWM输出。
FTMx_CnSC - 通道状态和控制寄存器,用来设置通道模式和读取通道状态。
FTMx_CnV - 通道值寄存器,用来设置比较值。
下面的例子在实现跑马灯基础上,实现2路比较输出和1路PWM输出。
/*
* main implementation: use this 'C' sample to create your own application
*
*/
#define GPIO_PIN_MASK 0x3C000000
#define GPIO_PIN(x) ((1<<x)&GPIO_PIN_MASK)
#include <stdio.h>
#include "derivative.h" /* include peripheral declarations */
void delay()
{
int i =0;
int j=0;
for(i=0;i<3000;i++)
for(j=0;j<1000;j++)
asm("nop");
}
void GPIO_Init()
{
SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
/* Set GPIOA pin26~29 as GPIO*/
PORTA_PCR26=(PORT_PCR_MUX(1));
PORTA_PCR27=(PORT_PCR_MUX(1));
PORTA_PCR28=(PORT_PCR_MUX(1));
PORTA_PCR29=(PORT_PCR_MUX(1));
PORTA_PCR5=(PORT_PCR_MUX(3));
PORTA_PCR6=(PORT_PCR_MUX(3));
PORTA_PCR7=(PORT_PCR_MUX(3));
//set GPIOA pin26~29 to be output
GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(26))
| GPIO_PDDR_PDD(GPIO_PIN(27))
| GPIO_PDDR_PDD(GPIO_PIN(28))
| GPIO_PDDR_PDD(GPIO_PIN(29))
| GPIO_PDDR_PDD(GPIO_PIN(5))
| GPIO_PDDR_PDD(GPIO_PIN(6))
| GPIO_PDDR_PDD(GPIO_PIN(7));
GPIOA_PDOR = 0;//所有LED灭
}
void FTM0_Init()
{
SIM_SCGC6 |= (uint32_t)0x01000000UL;
FTM0_MODE = (uint32_t)0x04UL;
FTM0_SC = (uint32_t)0x00UL;
FTM0_C2SC = 0x68; //PWM模式,匹配时引脚翻转并产生中断
FTM0_C2V = 20000;
FTM0_C3SC = 0x14; //输出比较模式,匹配时引脚翻转,不产生中断
FTM0_C3V = 10000;
FTM0_C4SC = 0x14; //输出比较模式,匹配时引脚翻转,不产生中断
FTM0_C4V = 30000;
FTM0_CNTIN = (uint32_t)0;//初值值0
FTM0_CNT = (uint32_t)0;//计数值0
FTM0_MOD = (uint32_t)50000;//模50000
FTM0_SC = (uint32_t)0x0FUL;//系统时钟,128分频
NVICISER1 |= (uint32_t)0x40000000UL;//使能中断NVICISERn=m,其中n=62/32,m=62%32
}
int main(void)
{
static int counter = 26;
FTM0_Init();
GPIO_Init();
printf("Hello (Kinetis) World in 'C' from PK60X256 derivative! \n\r");
for(;;)
{
}
return 0;
}
void FTM0_Interrupt(void)
{
unsigned int tmp;
static int counter = 26;
tmp = FTM0_SC;
if( (tmp&0x80) !=0)
{
FTM0_SC &= ~0x80;
}
tmp = FTM0_C2SC;
if( (tmp&0x80)!=0 )
{
FTM0_C2SC &= ~0x80;
}
GPIOA_PDOR = GPIO_PDOR_PDO(GPIO_PIN(counter));
counter++;
if(counter > 29)
{
counter = 26;
}
}
上图第1路是第2路(J10第6脚)输出波形,是40%的PWM。
上图第1路是第3路(J10第7脚)输出波形,第2路是第4路(J10第8脚)输出波形。二者频率相同,有相位差。


