MCU

ADSP-BF533之PWM控制LED灯渐暗渐明

0
阅读(49757)

通过之前的学习,对于ADSP-BF533的PWM功能算是有一个基本的了解,今天打算编一个程序实现PWM功能,具体是通过PWM功能控制LED灯渐暗渐明。要实现LED灯渐暗渐明,只要让LED灯连接至BF533控制器的GPIO口,并且连接一个1K的电阻到GND,然后通过BF533使得该GPIO口输出不同占空比的PWM脉冲即可。

接着说一下为什么灯会渐暗渐明,因为BF533控制器输出的PWM脉冲的占空比是变化的,所以GPIO口输出的平均电压也是变化的,从而流过LED灯的电流也是变化的,而LED灯的亮度会随着经过电流的变化而变化,所以可以通过调压来实现调亮度。假如BF533控制器GPIO口输出VCC电压,PWM高电平部分时间是a,PWM周期是T,则电压=VCC*a/T。以上便是PWM控制的GPIO口上的平均电压的计算公式啦。

最后说一下本程序中BF533如何通过PWM功能控制LED灯渐暗渐明。在本设计中,由于BF533控制器的PWM功能有一个输出端口TMRx可以输出PWM信号,所以直接将TMRx直接连接LED灯和1K的电阻到GND,这样只要调节PWM脉冲信号的脉冲宽度,即可实现TMRx端口输出电压的变化,从而实现LED灯渐暗渐明。

下面为其关键代码:

void Init_Timers(void)//定时器初始化函数

{

       *pTIMER0_CONFIG = 0x0019; //配置定时器0工作模式为PWM_OUT模式

       *pTIMER0_PERIOD = 0x00800000;//设置定时周期,定时时间大概为0.1S,具体的计算可参考前面的文章

       *pTIMER0_WIDTH = 0x00000064;//设置PWM脉冲宽度最初为100

       *pTIMER_ENABLE = 0x0001;//使能定时器0

}

void Init_Interrupts(void)

{

       *pSIC_IAR0 = 0xffffffff;

       *pSIC_IAR1 = 0xffffffff;

       *pSIC_IAR2 = 0xfffffff4; //定时器0的中断等级设置位于SIC_IAR2的0~3位         

       register_handler(ik_ivg11, TIMER0_ISR); //注册中断等级为11,标识符为TIMER0_ISR

       *pSIC_IMASK = 0x00010000; //使能定时器0中断

}

EX_INTERRUPT_HANDLER(TIMER0_ISR)

{

       *pTIMER_STATUS = 0x0001; //注意必须在中断程序清除中断标志位TIMIL0

       *pTIMER0_WIDTH+=100;//脉冲宽度值每次变化100

       if(*pTIMER0_WIDTH>*pTIMER0_PERIOD)//判断是否大于定时周期

       *pTIMER0_WIDTH = 0x00000064;    //如果大于则重新设置为100

}

void main(void)

{    

       Set_PLL(16,3);//时钟初始化

       Init_EBIU();   //EBIU初始化

       Init_SDRAM();//SDRAM初始化

       Init_Timers();//定时器0初始化

       Init_Interrupts();//中断初始化

       while(1);//等待进入定时器的PWM中断处理函数

}

在程序中,通过不断地改变脉冲宽度*pTIMER0_WIDTH的值,使其以100的速度变化,从而实现PWM脉冲宽度的变化,最终实现PWM输出端口TMRx的输出电压在不断地变化,LED灯渐暗渐明。

最后给出整个项目文件2927571072674.zip