6.PWM编程进阶1

PWM编程进阶1

硬件参数: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的占空比(分辨率),和周期调节电压电流大小

 

6.PWM编程进阶1_第1张图片

硬件使用LPC40XX的MotorPWM实现风扇的控制

1.左对齐PWM

#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
    }

}

 

2.通用PWM单边沿输出

6.PWM编程进阶1_第2张图片

使用通用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%输出,输出必须锁存

你可能感兴趣的:(控制)