社区导航

 
查看: 463|回复: 11

[求助] PIC单片机产生PWM波波形出问题了

[复制链接]

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-11-5 20:20:14 | 显示全部楼层 |阅读模式
本帖最后由 Sevenfee 于 2018-11-6 20:32 编辑

用PIC16F887单片机产生方波,当我把方波频率设为4KHz时波形是正常的,当我改变TIMER2的分频值,从4改为16 ,此时频率应该变为1KHz,此时频率是对了,可是波形却变得很奇怪。  求有经验的大神指导下!

这是产生的4KHZ正常波形,占空比为50%
微信图片_20181105201023.jpg



这是1KHZ有问题的波形,占空比为60%。  这个高电平会突然下降到一个比较低的电平再上升。


微信图片_20181105201034.jpg
1KHz占空比80%就正常了
微信图片_20181106202735.jpg
此帖出自单片机论坛


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-11-5 20:23:01 | 显示全部楼层
主要的程序我也贴上来各位看一下

/********端口初始化函数********/
void init()
{
        ANSELH=0x00;                     //设置B口为数字I/O口
        OPTION_REG=0x00;
        WPUB=0xFF;         //设置B口弱上拉
        INTCON=0x00;       //关总中断
        PIE1=0;            //PIE1的中断禁止
        PIE2=0;            //PIE2的中断禁止
        TRISB0=1;
        TRISB1=1;          //将RB1设置为输入口,按按键
        TRISB2=1;          //将RB2设置为输入口,按按键
        TRISB3=1;
        TRISB4=1;
        RC1=0;
        TRISC1=0;          //脉宽调制输出引脚,设置为输出
}
/********PWM初始化函数********/
void PWM_Init()
{
        PR2=249;           //脉宽调制波形的周期为1000us        
        CCP2CON=0x0C;      //CCP2模块工作在PWM模式,占空因数的低两位为00
        T2CON=0x02;        //禁止TMR2,且前后分频值为16,同时开始输出PWM
        CCPR2L=0xB8;       //脉宽调制波形的占空比初始值
}
/********键盘扫描函数*******    */
void keyscan()
{
        if(RB1==0)                  //如果是RB1键按下
        {
                delay_ms(5);              //延时去抖
                if(RB1==0)              //确认是否有键按下
                {
                        while(!RB1);        //等待按键释放
                        CCP2CON=0x0C;
                        CCPR2L=0xB8;                   //80%占空比
                        TMR2ON=1;
                }
        }
        if(RB2==0)                  //如果是RB2键按下
        {
                delay_ms(5);              //延时去抖
                if(RB2==0)              //确认是否有键按下
                {
                        while(!RB2);        //等待按键释放
                        CCP2CON=0x0C;
                        CCPR2L=0x96;                   //60%占空比
                        TMR2ON=1;
                }
        }
        if(RB0==0)                  //如果是RB0键按下
        {
                delay_ms(5);              //延时去抖
                if(RB0==0)              //确认是否有键按下
                {
                        while(!RB0);        //等待按键释放
                        CCP2CON=0x00;                   //关PWM
                        TMR2ON=0;                        //禁止TMR2
                        //delay_ms(5);
                        RC1=0;
                }
        }
}
/********主函数********/
void main()
{
        init();                     //系统初始化
        PWM_Init();                 //脉冲宽度初始化
        while(1)
        {
                keyscan();              //调用按键扫描处理脉宽因数
        }
}


回复

使用道具 举报

497

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-11-5 23:56:23 | 显示全部楼层
有可能是切换占空比的时候出现的抖动
刻苦学习,共同进步


回复

使用道具 举报

370

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2018-11-6 08:04:21 | 显示全部楼层
和關狗,有沒有關係?


回复

使用道具 举报

3385

TA的帖子

170

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2018-11-6 08:52:39 | 显示全部楼层
帮你呼叫版主@dingzy_2002


回复

使用道具 举报

525

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-6 11:27:14 | 显示全部楼层
PIC8位普通单片机的PWM输出设置确实较其它8位单片机要不同,而且我也曾经走过类似的弯路。
主要还是要严格按数据手册的设置来:尤其是初始化时
1.png
另外,如果改变PWM的周期频率,分辨率等,也要按上图的设置来

如果是确定了PWM的周期频率,分辨率后,仅改变点空比,则只需要修改CCPR1L即可,不要顺便CCP1CON值,这会引起不必要的异常发生。

点评

我刚试过不修改CCP2ON,波形还是会出现图中异常  详情 回复 发表于 2018-11-6 20:15


回复

使用道具 举报

525

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-6 11:32:18 | 显示全部楼层
另外,如果关闭PWM后再开启,也同样要按上楼图中设置初始化。
所以,想暂时使PWM无输出(PWM还要继续工作),只要设置CCPR1L=0就可以了
就不需要再次对PWM初始化了。(这对低功耗不利,因为PWM模块始终工作,在低功耗要求下,则只能关闭,再初始化开启)。


回复

使用道具 举报

525

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-6 11:36:34 | 显示全部楼层
本帖最后由 dingzy_2002 于 2018-11-6 11:37 编辑

给个我的例程(基于PIC12F615):

1.初始化部分:
//PWM:
        CCP1CON        = 0x0C;        //普通PWM模式,CCP1输出高电平有效
        CCPR1L        = (PWM_MAX);

...
//管脚方向设置:
        TRISIO        =        0b00001011;
//        
        PIE1=WPUA=IOCA        =0;
        PR2        = (PWM_MAX-1);//2MHz/125=16kHz,后分频4时,中断频率4KHz

...
        PIR1        = 0x00;
        PIE1        = 0x00;
        TMR2IE        = 1;
        TMR2ON        = 1;
        INTCON        = 0xC0;                //打开外部,T2中断

...

2.在程序中修改点空比(连续调节):
                DA_TEMP=CCPR1L;
                if(I_AVE>Iset_value)
                {
                        if(--DA_TEMP>=(PWM_MAX))
                                DA_TEMP = 0x00;
                }
                if(I_AVE<Iset_value)
                {
                        if(++DA_TEMP>=(PWM_MAX))
                                DA_TEMP = (PWM_MAX);
                }
                CCPR1L        =DA_TEMP;        





回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-11-6 20:07:02 | 显示全部楼层
dingzy_2002 发表于 2018-11-6 11:36
给个我的例程(基于PIC12F615):

1.初始化部分:
//PWM:
        CCP1CON        = 0x0C;        //普 ...

感谢版主的回答,  现在我的问题是,我在选取了一个频率后,可能80%占空比是正常的波形,当我把占空比调到60% 就会出现图中的电平下降再上升的一段,我认为 这样程序主体应该是没有问题的。  今天我换了一个4MHZ的晶振重新编了几个波形,结果还是这个样子。 同一频率下 占空比不同,波形可能就会乱。    问题还是没有解决哎


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-11-6 20:09:12 | 显示全部楼层
迈尔风随 发表于 2018-11-5 23:56
有可能是切换占空比的时候出现的抖动

同一频率,80%占空比可得到正常波形,60%占空比出来就会跟上图的错误一样,应该不是抖动原因造成的,今天我还换了一个晶振,结果还是那样。  


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-11-6 20:15:41 | 显示全部楼层
dingzy_2002 发表于 2018-11-6 11:27
PIC8位普通单片机的PWM输出设置确实较其它8位单片机要不同,而且我也曾经走过类似的弯路。
主要还是要严格 ...

我刚试过不修改CCP2ON,波形还是会出现图中异常


回复

使用道具 举报

525

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-11-7 08:31:53 来自手机 | 显示全部楼层
再看下是否有其他程序影响PWM输出,如中断,引脚操作等。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-11-18 16:17 , Processed in 0.336333 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表