本帖最后由 Ryanhsiung 于 2011-10-15 11:14 编辑
虽然说呼吸灯比较简单,但一直没有玩过,正好有这个资源顺带玩一下! 先感谢一下 “lixiaoxu2meng”这兄弟的例程真是全,没有他的范例我没有怎么快写出来!
PWM设置的设置是照着例程做的,小做修改。
PWM库很直观,但是封装了底层,若在高速可变 频率的PWM,不能用库函数去设置,一定手动对寄存器进行操作 特别是DrvPWM_SetTimerClk这个函数。
配置代码:
void PWM0_Configuration(void)
{
S_DRVPWM_TIME_DATA_T sPt;
DrvSYS_SelectIPClockSource(E_SYS_PWM01_CLKSRC,0); // 使用外设时注意必须设置该外设的时钟 设置PWM01的时钟源为外部12MHZ
//PWM Timer property
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; // 自动重载模式
// PWM 频率 为100HZ即10000us为一周期 CNR != u32Frequency,DrvPWM_SetTimerClk会根据我们相应的配置自己求出 CNR
sPt.u32Frequency = 100;
// 占空比 u8HighPulseRatio CMR != u8HighPulseRatio,DrvPWM_SetTimerClk会根据我们相应的配置自己求出 CMR
sPt.u8HighPulseRatio =25; // 高脉冲宽度时间所占周期的百分比: 25%*/
sPt.i32Inverter = 0; // 反向关闭
DrvPWM_Open(); // 打开 PWM 时钟并且复位PWM
//DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);//设置PWM 定时器0 为外部12 MHz crystal 时钟
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt); // 配置PWM 定时器0的一些参数 如配置频率/脉冲/模式/逆转功能
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1); // 使能或关闭PWM定时器0对应的IO口输出使能
//不能使用 SYS->GPAMFP.GPA_MFP12 = 1;(没有定义 GPA_MFP12),也不能使用DrvGPIO_InitFunction(E_FUNC_PWM01); 这个函数操作了两个I0
outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) | (0x01<<12));// 指定多功能引脚 即 PA12为PWM0
DrvPWM_Enable(DRVPWM_TIMER0, 1); // 使能/关闭PWM定时器0
}void PWM_Configuration(void){ PWM0_Configuration(); printf("PWM 初始成功!!\n");}
改变占空比 实现亮暗变化 这个放由SYSTICK定时调用! 大家也可以让它由其它事件调用
void PWM_Light(void)
{
static uint8_t flag = 1; // 标志位,用于变亮还是变暗
static uint32_t cmr = 0; // 计数
if(flag == 1) // 变亮
{
if(cmr++ >= 998)
{
flag =0 ;
}
}
else // 变暗
{
if(cmr-- <= 1)
{
flag = 1 ;
}
}
PWM_AdjustDuty(0, cmr ,999) ; // 这个是直接设置CNR CMR 的值,频率 = F主频/分频/(CNR+1)
}
变更占空比的函数:
void PWM_AdjustDuty(uint8_t pwm,uint16_t cmr,uint16_t cnr)
{
switch(pwm)
{
case 0:
{
PWMA->CMR0 = cmr; //修改占空比
PWMA->CNR0 = cnr; //修改占空比
}break;
case 1:
{
PWMA->CMR1 = cmr; //修改占空比
PWMA->CNR1 = cnr; //修改占空比
}break;
case 2:
{
PWMA->CMR2 = cmr; //修改占空比
PWMA->CNR2 = cnr; //修改占空比
}break;
case 3:
{
PWMA->CMR3 = cmr; //修改占空比
PWMA->CNR3 = cnr; //修改占空比
}break;
default:break;
}
}
|