[PIC®/AVR®/dsPIC®产品] pic16f887产生20Khz的PWM,波形出来1ms有波形,1ms没有波形。

[复制链接]
 楼主| 18354265752 发表于 2016-4-18 18:09 | 显示全部楼层 |阅读模式
本帖最后由 18354265752 于 2016-4-18 18:12 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
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 | 显示全部楼层
求助啊,哪位大哥知道啊。
Latin_newday 发表于 2016-4-19 08:44 | 显示全部楼层
检查一下PWM初始化,确认最后有没有将PWM口设置为输出!
 楼主| 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都是连续的了。
EthanHen 发表于 2016-4-19 20:05 | 显示全部楼层
像是不停复位的现象
 楼主| 18354265752 发表于 2016-4-20 21:24 | 显示全部楼层
EthanHen 发表于 2016-4-19 20:05
像是不停复位的现象

那应该怎么办呢?
 楼主| 18354265752 发表于 2016-4-21 13:59 | 显示全部楼层
Latin_newday 发表于 2016-4-21 08:39
可以模拟调试,在程序起始处设置断点,如果跑到断点处,就确实是复位了!
当然也可以在程序开头增加一些显 ...

你好,我在程序前面加了一个输出引脚,使这个引脚翻转10次,经测波形发现并没有出现复位,有没有可能是PWM复位?
Latin_newday 发表于 2016-4-21 14:11 | 显示全部楼层
18354265752 发表于 2016-4-21 13:59
你好,我在程序前面加了一个输出引脚,使这个引脚翻转10次,经测波形发现并没有出现复位,有没有可能是PW ...

没有碰到PWM还会自动复位的!你把程序贴出来或者把设置PWM段贴出来看看!
 楼主| 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中配置的,。
 楼主| 18354265752 发表于 2016-4-21 14:42 | 显示全部楼层
Latin_newday 发表于 2016-4-21 14:11
没有碰到PWM还会自动复位的!你把程序贴出来或者把设置PWM段贴出来看看! ...

你好,麻烦你看一下了。
Latin_newday 发表于 2016-4-21 15:07 | 显示全部楼层
for(r=0;r>20;r++)
{
    RC0=1;
    RC0=~RC0;
}                                //以上程序用于检测是否复位的。
这个for循环都写错了啊!你把for循环仔细看下!

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

初步判定是你没有关闭看门狗,造成看门狗复位了!
EthanHen 发表于 2016-4-21 15:19 | 显示全部楼层
Latin_newday 发表于 2016-4-21 15:07
for(r=0;r>20;r++)
{
    RC0=1;

for循环写错,导致你看不到复位现象,看门狗没关,程序中没有喂狗指令,同意楼上的判断。
Latin_newday 发表于 2016-4-21 15:20 | 显示全部楼层
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照标准规范写,是有很大概率要出错的!
 楼主| 18354265752 发表于 2016-4-21 20:20 | 显示全部楼层
本帖最后由 18354265752 于 2016-4-21 20:37 编辑

你好,我重新改了一下for循环,看门狗也关了,但是没有出现复位现象。配置字为__CONFIG(0x20D5);__CONFIG(0x3Eff);
 楼主| 18354265752 发表于 2016-4-21 20:23 | 显示全部楼层
本帖最后由 18354265752 于 2016-4-21 20:36 编辑
EthanHen 发表于 2016-4-21 15:19
for循环写错,导致你看不到复位现象,看门狗没关,程序中没有喂狗指令,同意楼上的判断。 ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 18354265752 发表于 2016-4-21 20:38 | 显示全部楼层
Latin_newday 发表于 2016-4-21 15:20
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照 ...

你好,你说的规格书,是数据手册吗?还是?
 楼主| 18354265752 发表于 2016-4-21 20:54 | 显示全部楼层
本帖最后由 18354265752 于 2016-4-21 20:56 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 18354265752 发表于 2016-4-21 20:57 | 显示全部楼层
Latin_newday 发表于 2016-4-21 15:20
PWM设置都没有按照规范来写,规格书上都有标准流程!
还是按照规格书标准流程,一步步重新写下吧!
不按照 ...

此外我把占空比调到20%,在2ms这个量程中也没有了断续情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部