ADSP-BF533之PWM控制LED灯渐暗渐明
0赞通过之前的学习,对于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