在线时间1342 小时
UID3124330
注册时间2015-11-26
NXP金币3905
TA的每日心情 | 开心 2019-3-5 08:47 |
|---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 9242
- 最后登录
- 2025-10-26
|
这款芯片的PWM是和Timer分开的,能够看到直观效果的方法就是常用的呼吸灯。参考使用手册,发现基本设置(Basic Configuration),是不是感觉套路感挺强的。很多细节先不用去研究,先能实现想实现的功能就好了。时钟,功率设置,引脚配置,PWM初始化,功能实现。
按手册说,PWM基于标准的定时器模块并继承了定时器的所有特性,只将PWM功能输出到引脚,它可以对外设时钟PCLK进行计数,可选择产生中断或在出现指定的计数值时执行其他操作。PWM功能是一个附加特性,建立在匹配寄存器的基础之上。两个匹配寄存器可用于提供单边沿控制的PWM输出。可提供单边沿和双边沿控制的PWM输出。
闲言少叙,在原理图中发现一个可用于PWM控制的LED,USB_UP_LED2,这个引脚的复用功能中有PWM1。如图1所示。
本次使用单边沿实现,因为外设时钟为25M,设置basic rate 为256,即频率为25M/256,这个频率可以通过示波器观察。当然也可以通过改变basic rate,来改变PWM频率。这里通道1默认为单边沿,可参考使用手册。实现呼吸灯就是不断地改变占空比,实现输出led的明暗的变化。参考代码如图2:
- /* Set match value for PWM match channel 0 = 256, update immediately, */
- PWM_MatchUpdate(LPC_PWM1, 0, 256, PWM_MATCH_UPDATE_NOW);//定义了频率25M(pclk)/256
- PWM_MatchUpdate(LPC_PWM1, 1, 100, PWM_MATCH_UPDATE_NOW);
复制代码
void PWMValueChange(void)
{ static uint8_t temp=0;
static uint8_t tempflag =0;
// for(uint8_t i=0;i<10;i++)
// {
PWM_MatchUpdate(LPC_PWM1, 1,temp , PWM_MATCH_UPDATE_NOW);
PWM_MatchConfigStruct.MatchChannel = 0;
PWM_MatchConfigStruct.IntOnMatch = DISABLE;//TRUE;
PWM_MatchConfigStruct.ResetOnMatch = ENABLE ;//TRUE;
PWM_MatchConfigStruct.StopOnMatch = DISABLE ;//FALSE;
PWM_ConfigMatch(LPC_PWM1,&PWM_MatchConfigStruct);
PWM_ChannelCmd (LPC_PWM1 ,1,ENABLE);
if((tempflag==0)&&(temp <240))
temp = temp+10;
// }
else tempflag=1;
if((tempflag ==1)&&(temp >10))
temp = temp-10;
else tempflag =0;
}
由于最近用手机砸核桃了,都不聚焦了,效果如图3所示:
|
-
图1
-
图2
|