打印
[PIC®/AVR®/dsPIC®产品]

pic16f887产生20Khz的PWM,波形出来1ms有波形,1ms没有波形。

[复制链接]
2335|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 18354265752 于 2016-4-18 18:12 编辑

求助,为什么PWM波形断断续续的,谢谢各位了。

D5A41D05-9F3B-4024-B301-BAF45CC10595.JPG (368.95 KB )

D5A41D05-9F3B-4024-B301-BAF45CC10595.JPG
沙发
suicune66| | 2016-4-18 18:14 | 只看该作者
是不是CONFIG设置问题?

使用特权

评论回复
板凳
18354265752|  楼主 | 2016-4-18 18:17 | 只看该作者
suicune66 发表于 2016-4-18 18:14
是不是CONFIG设置问题?

配置字应该没有错误啊。

使用特权

评论回复
地板
18354265752|  楼主 | 2016-4-18 19:52 | 只看该作者
求助啊,哪位大哥知道啊。

使用特权

评论回复
5
Latin_newday| | 2016-4-19 08:44 | 只看该作者
检查一下PWM初始化,确认最后有没有将PWM口设置为输出!

使用特权

评论回复
6
18354265752|  楼主 | 2016-4-19 10:34 | 只看该作者
Latin_newday 发表于 2016-4-19 08:44
检查一下PWM初始化,确认最后有没有将PWM口设置为输出!

PWM口设置为输出口了,我变了一下占空比,当占空比10%的时候,示波器在1ms(这个1ms是示波器的量程,2ms是我把示波器的时间量程变大了)的时候是连续的波形,但在2ms的时候,会出现上述波形,而且当1ms时暂停示波器,会发现波形并没有断续,没有2ms时出现的那种情况;当我把占空比变成20%时,波形不管是1ms还是2ms都是连续的了。

使用特权

评论回复
7
EthanHen| | 2016-4-19 20:05 | 只看该作者
像是不停复位的现象

使用特权

评论回复
8
18354265752|  楼主 | 2016-4-20 21:24 | 只看该作者
EthanHen 发表于 2016-4-19 20:05
像是不停复位的现象

那应该怎么办呢?

使用特权

评论回复
9
18354265752|  楼主 | 2016-4-21 13:59 | 只看该作者
Latin_newday 发表于 2016-4-21 08:39
可以模拟调试,在程序起始处设置断点,如果跑到断点处,就确实是复位了!
当然也可以在程序开头增加一些显 ...

你好,我在程序前面加了一个输出引脚,使这个引脚翻转10次,经测波形发现并没有出现复位,有没有可能是PWM复位?

使用特权

评论回复
10
Latin_newday| | 2016-4-21 14:11 | 只看该作者
18354265752 发表于 2016-4-21 13:59
你好,我在程序前面加了一个输出引脚,使这个引脚翻转10次,经测波形发现并没有出现复位,有没有可能是PW ...

没有碰到PWM还会自动复位的!你把程序贴出来或者把设置PWM段贴出来看看!

使用特权

评论回复
11
18354265752|  楼主 | 2016-4-21 14:41 | 只看该作者
#include "pic.h"

//_CONFIG=0xD0D3;         
unsigned int g_Period =99;
unsigned int g_Dutywidth =40;
void InitPWM()
{
   
        TRISC0 =0;
    unsigned int r;
    for(r=0;r>20;r++)
{
    RC0=1;
    RC0=~RC0;
}                                //以上程序用于检测是否复位的。
        OSCCON =0b01110111;
    P1M1 =0;
        P1M0 =0;
        CCP1M3=1;
        CCP1M2=1;
        CCP1M1=0;
        CCP1M0=0;
    PSTRCON=0b00010001;       //脉冲转向,控制哪个引脚输出pwm
    T2CON =0b00000100;
    ECCPAS =0b00000100;     //禁止自动关断
        PWM1CON =0b10000000;
    TRISC2=0;
   
        PR2 =g_Period;
        CCPR1L =(g_Dutywidth>>2)&0x00FF;
        DC1B1 =(g_Dutywidth>>1)&0x01;
        DC1B0 =g_Dutywidth&0x01;

}

void main()
{
   
        InitPWM();
        while(1)
        {
        }
}
其中配置字在MPLAB中配置的,。

使用特权

评论回复
12
18354265752|  楼主 | 2016-4-21 14:42 | 只看该作者
Latin_newday 发表于 2016-4-21 14:11
没有碰到PWM还会自动复位的!你把程序贴出来或者把设置PWM段贴出来看看! ...

你好,麻烦你看一下了。

使用特权

评论回复
13
Latin_newday| | 2016-4-21 15:07 | 只看该作者
for(r=0;r>20;r++)
{
    RC0=1;
    RC0=~RC0;
}                                //以上程序用于检测是否复位的。
这个for循环都写错了啊!你把for循环仔细看下!

没看到你的配置位,我自己用如下配置位,没有发现问题!注意前面是两个下横线。
__CONFIG(0x3FD4);
__CONFIG(0x3fff);   

初步判定是你没有关闭看门狗,造成看门狗复位了!

使用特权

评论回复
14
EthanHen| | 2016-4-21 15:19 | 只看该作者
Latin_newday 发表于 2016-4-21 15:07
for(r=0;r>20;r++)
{
    RC0=1;

for循环写错,导致你看不到复位现象,看门狗没关,程序中没有喂狗指令,同意楼上的判断。

使用特权

评论回复
15
Latin_newday| | 2016-4-21 15:20 | 只看该作者
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照标准规范写,是有很大概率要出错的!

使用特权

评论回复
16
18354265752|  楼主 | 2016-4-21 20:20 | 只看该作者
本帖最后由 18354265752 于 2016-4-21 20:37 编辑

你好,我重新改了一下for循环,看门狗也关了,但是没有出现复位现象。配置字为__CONFIG(0x20D5);__CONFIG(0x3Eff);

使用特权

评论回复
17
18354265752|  楼主 | 2016-4-21 20:23 | 只看该作者
本帖最后由 18354265752 于 2016-4-21 20:36 编辑
EthanHen 发表于 2016-4-21 15:19
for循环写错,导致你看不到复位现象,看门狗没关,程序中没有喂狗指令,同意楼上的判断。 ...

你好,实验发现没有发现复位现象,看门狗也没开,配置字为__CONFIG(0x20D5);__CONFIG(0x3Eff)

使用特权

评论回复
18
18354265752|  楼主 | 2016-4-21 20:38 | 只看该作者
Latin_newday 发表于 2016-4-21 15:20
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照 ...

你好,你说的规格书,是数据手册吗?还是?

使用特权

评论回复
19
18354265752|  楼主 | 2016-4-21 20:54 | 只看该作者
本帖最后由 18354265752 于 2016-4-21 20:56 编辑

这是把时间量程调到1ms时的波形图,左右移动并没有出现断续。

A1251354-F61F-47A7-8529-F25EB0D32D5F.JPG (338.73 KB )

A1251354-F61F-47A7-8529-F25EB0D32D5F.JPG

使用特权

评论回复
20
18354265752|  楼主 | 2016-4-21 20:57 | 只看该作者
Latin_newday 发表于 2016-4-21 15:20
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照 ...

此外我把占空比调到20%,在2ms这个量程中也没有了断续情况。

使用特权

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

本版积分规则

2

主题

16

帖子

0

粉丝