[学习资料]

PWM呼吸灯

[复制链接]
9064|8
手机看帖
扫描二维码
随时随地手机跟帖
zljiu|  楼主 | 2019-6-21 14:11 | 显示全部楼层 |阅读模式
PWM类似于开关电源,将高电压中间插入地脉冲,来将有效电压降低,在某些电压不敏感器件中,可以实现电压降低的效果。例如LED的亮度变化。

前文有说过,Harmony的Dynamic还不是很完善,在PWM上就有体现,PWM需要OC与静态Timer配合,如果有其它Timer在在使用Dynamic,不想全部改为Static,可以直接使用PLIB函数,可以从其它Static函数往底层去看,也是通过static调用的PLIB函数。

所以,在这里我们只配置OC,而对应的Timer则采用直接调用底层函数的方法使用static驱动。

注意,PWM的占空比指的是高电位占空比,例如80%指的是80%为高电位。
呼吸灯则是使用另外一个Timer,来分段设置不同的占空比,0-100% 、100%-0 不断修改占空比,Timer分的越细,呼吸灯越流畅,例如定时器每隔10ms变化1%与每隔1ms变化0.1%相比,都是1s由亮变暗或者由暗变量,后者肯定比前者过渡更好,更细腻。但是为了确保不会出现频繁终端,在人眼无法分辨情况下,定时器间隔越大越好。




使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:11 | 显示全部楼层

1、配置驱动

Center.jpg


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:12 | 显示全部楼层

2、配置输出引脚

Center.jpg


使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:12 | 显示全部楼层
3、生成代码,使用PWM



//high level occupy timer period Percentage,example:80 express 80% time high,20% low
void Start_PWM_OUT(uint8_t DutyCycle)
{
    DRV_OC0_Start();

    PLIB_OC_PulseWidth16BitSet(OC_ID_1, 2000*DutyCycle/100);

    /* Initialize Timer Instance0 */
    /* Disable Timer */
    PLIB_TMR_Stop(TMR_ID_2);
    /* Select clock source */
    PLIB_TMR_ClockSourceSelect(TMR_ID_2, TMR_CLOCK_SOURCE_PERIPHERAL_CLOCK);
    /* Select prescalar value */
    PLIB_TMR_PrescaleSelect(TMR_ID_2, TMR_PRESCALE_VALUE_256);
    /* Enable 16 bit mode */
    PLIB_TMR_Mode16BitEnable(TMR_ID_2);
    /* Clear counter */
    PLIB_TMR_Counter16BitClear(TMR_ID_2);
    /*Set period */
    PLIB_TMR_Period16BitSet(TMR_ID_2, 2000);

    PLIB_TMR_Start(TMR_ID_2);
}



使用特权

评论回复
zljiu|  楼主 | 2019-6-21 14:13 | 显示全部楼层



void Stop_PWM_OUT(void)
{
     DRV_OC0_Stop();
     
     PLIB_TMR_Stop(TMR_ID_2);
}


使用特权

评论回复
玛尼玛尼哄| | 2019-6-22 20:05 | 显示全部楼层
PWM应用入门

使用特权

评论回复
小卡| | 2019-6-25 11:01 | 显示全部楼层
不错啊~

使用特权

评论回复
zljiu|  楼主 | 2019-7-25 15:06 | 显示全部楼层
是的 是非常基础的知识

使用特权

评论回复
21mengnan| | 2019-12-24 19:56 | 显示全部楼层
看了,效果如何?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

3319

帖子

3

粉丝