📄 lpc_lib_pwm.c
字号:
#include "lpc_lib_pwm.h"
void pwm_init (INT8U edge,pwm_sel channel,INT8U onoff) //initialize the pwm channels
{
INT32U p0_pwm_en,p0_pwm_mask; //edge: 0:single edge 1:double edge
INT32U i; //onoff: 0:off 1:on
if (edge==0)
{
if (channel==pwm5) //apart pwm5 from other pwm channels
{
p0_pwm_en=P0_21_PWM5_EN;
p0_pwm_mask=P0_21_PWM5_MASK;
if (onoff==0)
{
//off the pwm5 channel
}
else
{ i = PINSEL1;
i &= (~p0_pwm_mask);
i |= p0_pwm_en;
PINSEL1 = i;
}
return;
}
else
{
switch(channel)
{case pwm1: p0_pwm_en=P0_0_PWM1_EN;
p0_pwm_mask=P0_0_PWM1_MASK;
break;
case pwm2: p0_pwm_en=P0_7_PWM2_EN;
p0_pwm_mask=P0_7_PWM2_MASK;
break;
case pwm3: p0_pwm_en=P0_1_PWM3_EN;
p0_pwm_mask=P0_1_PWM3_MASK;
break;
case pwm4: p0_pwm_en=P0_8_PWM4_EN;
p0_pwm_mask=P0_8_PWM4_MASK;
break;
case pwm6: p0_pwm_en=P0_9_PWM6_EN;
p0_pwm_mask=P0_9_PWM6_MASK;
break;
default:
break;
}
}
}
else
{
switch(channel)
{
case pwm2: p0_pwm_en=P0_7_PWM2_EN;
p0_pwm_mask=P0_7_PWM2_MASK;
i=PWM_PCR;
i |=0x04; // enble double edge
PWM_PCR=i;
break;
case pwm4: p0_pwm_en=P0_8_PWM4_EN;
p0_pwm_mask=P0_8_PWM4_MASK;
i=PWM_PCR;
i |=0x10;
PWM_PCR=i;
break;
case pwm6: p0_pwm_en=P0_9_PWM6_EN;
p0_pwm_mask=P0_9_PWM6_MASK;
i=PWM_PCR;
i |=0x40;
PWM_PCR=i;
break;
default:
break;
}
}
if (onoff==0)
{ //off the pwm channels
}
else
{ i = PINSEL0;
i &= (~p0_pwm_mask);
i |= p0_pwm_en;
PINSEL0 = i;
}
}
void pwm_set_f(INT32U f)
{
INT32U i;
PWM_PR=PWMPR;
i=(INT32U)( PCLKF/((PWMPR+1)*f));
PWM_MR0=i;
i=PWM_MCR; //enable pwm0 to reset
i |=0x02;
PWM_MCR=i;
i=PWM_LER; //lock enable MR0
i |=0x1;
PWM_LER=i;
}
void pwm_single_edge(pwm_sel channel,INT32U f,FP32 pulse_prop)
{
INT32U i,j;
INT32U ler_en,output_en;
i=(PCLKF*pulse_prop)/((PWMPR+1)*f);
switch(channel)
{ case pwm1: PWM_MR1=i;
ler_en=(0x01<<1);
output_en=(0x01<<9);
break;
case pwm2: PWM_MR2=i;
ler_en=(0x01<<2);
output_en=(0x01<<10);
break;
case pwm3: PWM_MR3=i;
ler_en=(0x01<<3);
output_en=(0x01<<11);
break;
case pwm4: PWM_MR4=i;
ler_en=(0x01<<4);
output_en=(0x01<<12);
break;
case pwm5: PWM_MR5=i;
ler_en=(0x01<<5);
output_en=(0x01<<13);
break;
case pwm6: PWM_MR6=i;
ler_en=(0x01<<6);
output_en=(0x01<<14);
break;
default:
break;
}
i=PWM_LER;//lock enable MRx
i |=ler_en;
PWM_LER=i;
i=PWM_PCR; //pwm output enable
i |=output_en;
PWM_PCR=i;
// PWM_TCR=0x09; //enable pwm function
}
void pwm_double_edge(pwm_sel channel,INT32U f,INT32U polarity,FP32 pulse_prop,FP32 pulse_position)
{
INT32U i,j,temp; //polarity: 0:positive pulse 1:negtive pulse
INT32U ler_en,output_en; //
temp=PCLKF/((PWMPR+1)*f);
i=pulse_prop*temp/2;
temp=pulse_position*temp;
j=temp+i;
i=temp-i;
if(polarity!=0)
{ temp=i;
i=j;
j=temp;
}
switch(channel)
{
case pwm2: PWM_MR1=i;
PWM_MR2=j;
ler_en=(0x01<<2);
output_en=(0x01<<10);
break;
case pwm4: PWM_MR3=i;
PWM_MR4=j;
ler_en=(0x01<<4);
output_en=(0x01<<12);
break;
case pwm6: PWM_MR5=i;
PWM_MR6=j;
ler_en=(0x01<<6);
output_en=(0x01<<14);
break;
default:
break;
}
i=PWM_LER; //lock enable MRx
i |=ler_en;
PWM_LER=i;
i=PWM_PCR; //pwm output enable
i |=output_en;
PWM_PCR=i;
}
void pwm_enable(void)
{
PWM_TCR=0x09; //enable pwm function
}
void pwm_close(void)
{
PWM_TCR=0x0; //disable pwm function and stop counter
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -