硬件参数:LPC4088 ,控制对象风扇
供电电压24V, 输出PWM可控,风扇转速可读
占空比是接通时间与周期之比
冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同
占空比:就是输出的PWM中,高电平保持的时间与该 PWM的时钟周期的时间之比,如一个PWM的频率是1000Hz,那么它的时钟周期就是1ms,就是1000us,如果高电平出现的时间是200us,那 么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。
分辨率:也就是占空比最小能达到多少,如8位的PWM,理论的分辨率就是1:255(单斜率),16位的的PWM理论就是1:65535(单斜率)。电源设计中需要考虑纹波控制,50V输出,50V/128 = 0.39V 纹波较大
频率就是这样的:如16位的PWM,它的分辨率达到了1:65535,要达到这个分辨率,T/C就必须从0计数到65535才能达到,如果计数从0计到80之后又从0开始计到80.......,那么它的分辨率最小就是1:80了,但是,它也快了,也就是说PWM的输出频率高了。
双斜率 / 单斜率:
假设一个PWM从0计数到80,之后又从0计数到80.......这个就是单斜率
假设一个PWM从0计数到80,之后是从80计数到0.......这个就是双斜率
可见,双斜率的计数时间多了一倍,所以输出的PWM频率就慢了一半,但是分辨率却是1:(80+80) =1:160,就是提高了一倍。
pwm 也就是模拟方式稳定输出,通过调节pwm的占空比(分辨率),和周期调节电压电流大小
硬件使用LPC40XX的MotorPWM实现风扇的控制
#define Error1 1001
unsigned int Error_flag;
/*
*名称:void Fan_PWM_Init(void)
*功能:实现MotorPWM基本初始化
*参数:无
*返回值:无
*/
void Fan_PWM_Init(void)
{
PCON_bit.BODPDM =1;//打开风扇PWM功率控制口; //打开风扇电源
IOCON_P1_25 = 4;//打开风扇0PWM设定
MCCON_CLR_bit.RUN1 = 1;//关闭定时
MCCON_SET_bit.POLA1 =1;//设置极性,默认边沿对齐
MCLIM0 = Timer_Motor; //设置PWM周期
MCMAT0 = 0; //设置Duty初始化为0
MCCNTCON_CLR_bit.CNTR1 = 1;//设置定时器模式
MCCON_SET_bit.RUN1 = 1;//开启定时器
}
/*
*名称:void PWM_SET(float Duty)
*功能:实现PWM占空比设定
*参数:DUty参数传入
*返回值:无
*/
void PWM_SET(float Duty)
{
if (0 < Duty <= 1)
{
MCMAT0 = Timer_Motor*Duty; //设置实际占空比,实际控制设置需要对占空比参数进行线性修正
}
else
{
Error_flag = Error1; //错误处理Flag
}
}
使用通用PWM双通道输出分别为50% 和10%
/* 函数名称: PWM_ALL_Iinit(void)
*函数功能:实现自带PWM信号的多路输出初始化
*函数参数:无
*返回值:无
*/
void PWM_ALL_Iinit(void)
{
PCONP_bit.PCPWM1 = 1;//外部寄存器上电
IOCON_P2_00_bit.FUNC = 1; //设置pwm1
IOCON_P2_01_bit.FUNC = 1;//设置pwm2
//IOCON_P2_02_bit.FUNC = 1;//设置pwm3
//IOCON_P2_03_bit.FUNC = 1;//设置pwm4
//IOCON_P2_04_bit.FUNC = 1;//设置pwm5
//IOCON_P2_05_bit.FUNC = 1;//设置pwm6
PWM1TCR_bit.CR = 1;//复位计数器
PWM1TC = 0;//计数器清零 可以检测溢出
PWM1PR = 0; //不设置预分频
PWM1CTCR_bit.CM = 0;//设置为定时器模式 //默认定时器模式
PWM1MCR_bit.PWMMR0R = 1 ;//匹配MR0复位TC,
PWM1MR0 = Timer_Motor; //设置匹配寄存器占空比初始化为0
PWM1MR1 = 0;
PWM1MR2 = 0;
//PWM1MR3 = 0;
//PWM1MR4 = 0;
// PWM1MR5 = 0;
// PWM1MR6 = 0;
PWM1LER_bit.EM0L = 1; //锁存PWM1寄存器
PWM1LER_bit.EM1L = 1; //锁存PWM1寄存器
PWM1PCR_bit.PWMENA1 = 1;//使能PWM输出
PWM1PCR_bit.PWMENA2 = 1;
// PWM1PCR_bit.PWMENA3 = 1;
// PWM1PCR_bit.PWMENA4 = 1;
// PWM1PCR_bit.PWMENA5 = 1;
// PWM1PCR_bit.PWMENA6 = 1;
PWM1TCR_bit.CR = 0;//清除复位
PWM1TCR_bit.CE = 1;//计数器使能
PWM1TCR_bit.PWMEN =1;//使能PWM定时器
NVIC_IntPri(NVIC_PWM1, 0); //清除中端标识
NVIC_IntEnable(NVIC_PWM1); //使能中断
}
/*
*名称:void PWM_Genaral_SET(float Duty)
*功能:实现PWM占空比设定
*参数:DUty参数传入
*返回值:无
*/
void PWM_All_Set(fp32 PWM)
{
PWM1MR1 = (uint32)Timer_Motor/2;
PWM1MR2 = (uint32)Timer_Motor/10;
//MCMAT1
PWM1LER_bit.EM2L = 1; //锁存PWM寄存器
PWM1LER_bit.EM1L = 1; //锁存PWM寄存器
}
PWM1MR0设置:在不进行系统预分频和倍频的情况下,直接对外部时钟进行配置
举例:外部时钟为120MZH
unsigned int Period = 1000;
PWM1MR0 = 1/120000000 *Period ; //设置输出PWM周期为8.3uS
PWM1MR1 = (uint32)Timer_Motor/2;//设置占空比为50%输出,输出必须锁存