[PIC®/AVR®/dsPIC®产品] PWM波为什么出不来呢?

[复制链接]
 楼主| Matthew179 发表于 2014-4-9 19:38 | 显示全部楼层 |阅读模式
用PIC18F生成2个PWM波为什么示波器一点反应都没有呢?
都按着书看了好几遍了~求高人救我~好苦

#include<pic18f46k80.h>
#define uchar unsigned char
#define uint  unsigned int
#define nop() asm("nop")

void init();
void PWMset1();
void PWMset2();

#pragma config XINST = OFF//使不能extended CPU
void main()
{
    init();
    PWMset1();
    PWMset2();
    while(1);
}

void init()// PWM 初始化
{
    INTCON=0x00;
    ADCON1=0X00;
    PIE1=0;
    PIE2=0;
    PIE3=0;
    PIE4=0;
    PIE5=0;//关所有中断
}

void PWMset1()//2MHZ 输出 50%占空比 CCP3
{
    TRISC6=0;//ccp3输出引脚rc6为输出状态
    PR2=0;
    CCPR3L=0;
    CCP3CON=0X2C;
    T2CON=0X05;
//    PR2=0x00;//周期设定 1/2M=(PR2+1)*4*1/8M*分频比(1)
//    CCPR3L=0x7F;
//    CCP3CON=0x3C;//PWM模式
//    T2CON=0x00;//设置前后分频比均为1
//    CCP3IE=0;//CCP3关中断
}

void PWMset2()//8kHZ 输出 50%占空比 CCP4
{
    TRISC7=0;//ccp4输出引脚rc7为输出状态
    PR4=0xF9;//周期设定 1/8k=(PR2+1)*4*1/8M*分频比(1)
    CCPR4L=0x7F;
    CCP4CON=0x3C;//PWM模式
    T4CON=0x04;//设置前后分频比均为1
    CCPTMRS=0x08;//CCP4基于TMR4
    CCP4IE=0;//CCP4关中断
}

 楼主| Matthew179 发表于 2014-4-10 15:15 | 显示全部楼层
木有人知道么~~~:'(:'(
wangtao478552 发表于 2014-4-11 14:53 | 显示全部楼层
本帖最后由 wangtao478552 于 2014-4-11 14:56 编辑

楼主你写得太不规范了,自己参考对照一下下面的代码,在写一个试试

void pwm_init()
{
    TRISCbits.TRISC2=1;                      /*暂时配置引脚为输入*/

    CCP1CON=0b00001100;               /*P1A调制输出,占空比低2位00,模式1100*/

    PR2=255;                                       /*周期=(255+1)*4*(1/500k)*1         */
    CCPR1L=0x7f;                                 /*占空比高位0111 1111*/
    CCP1CONbits.DC1B=0b00;             /*占空比低2位00*/

    PIR1bits.TMR2IF=0;                     /*清空中断标志位*/
    T2CONbits.T2CKPS=0b01;            /*1:1分频*/
    T2CONbits.TMR2ON=1;                /*启动定时器2*/

    while(PIR1bits.TMR2IF==0);          /*等待第一次溢出*/
    TRISCbits.TRISC2=0;                 /*配置引脚为输出*/
}
 楼主| Matthew179 发表于 2014-4-11 18:22 | 显示全部楼层
wangtao478552 发表于 2014-4-11 14:53
楼主你写得太不规范了,自己参考对照一下下面的代码,在写一个试试

void pwm_init()

感谢~让我去试试
 楼主| Matthew179 发表于 2014-4-11 21:30 | 显示全部楼层
wangtao478552 发表于 2014-4-11 14:53
楼主你写得太不规范了,自己参考对照一下下面的代码,在写一个试试

void pwm_init()

已经重写了~果然这么写可读性强多了~但是示波器还是没有反应~是不是主函数有错?还是初始化函数?实在是找不到啊~~~大神救救我
yklstudent 发表于 2014-4-11 22:18 | 显示全部楼层
楼主还是先确认MCU能否工作吧 闪个灯啥的
再忙其它的好了
 楼主| Matthew179 发表于 2014-4-13 09:58 | 显示全部楼层
yklstudent 发表于 2014-4-11 22:18
楼主还是先确认MCU能否工作吧 闪个灯啥的
再忙其它的好了

额~不是啊~我这块板子是前辈留下的~而且前两天还跑过他的程序~只不过他现在出门了~所以~~~~
wangtao478552 发表于 2014-4-16 08:09 | 显示全部楼层
本帖最后由 wangtao478552 于 2014-4-16 08:12 编辑

如果初始化函数写对了的话,应该直接就出PWM了,看看引脚配置好了没,例如是否将引脚配置成了模拟输入,注意ADCON寄存器,还有测试时接对了引脚没有。

工程芯片选对了没
wangtao478552 发表于 2014-4-16 08:11 | 显示全部楼层
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int

void pwm_init();

void main()
{
    OSCCON=0b01100001;      /*4MHz*/
    pwm_init();
    while(1);
}

以上是主函数部分,我写的是PIC16F886,你改下管脚调吧
 楼主| Matthew179 发表于 2014-4-18 21:11 | 显示全部楼层
wangtao478552 发表于 2014-4-16 08:11
#include
#define uchar unsigned char
#define uint unsigned int

感谢~明天去实验室看一看~
阳光的味道3121 发表于 2014-4-20 13:55 来自手机 | 显示全部楼层
你看看你的主程序,main就那几句,你的程序一直在while(1);那块死着。应该改为while(1){PWMset1();    PWMset2()};
 楼主| Matthew179 发表于 2014-4-21 12:20 | 显示全部楼层
问题解决了~ 配置字的问题~加了一条#pragma config IESO=OFF 就好了~
 楼主| Matthew179 发表于 2014-4-21 12:21 | 显示全部楼层
阳光的味道3121 发表于 2014-4-20 13:55
你看看你的主程序,main就那几句,你的程序一直在while(1);那块死着。应该改为while(1){PWMset1();    P ...

首先感谢你的回复~~~但是 PWM是硬件实现的~ 不需要反复设置的吧
wangtao478552 发表于 2014-4-22 16:27 | 显示全部楼层
Matthew179 发表于 2014-4-21 12:21
首先感谢你的回复~~~但是 PWM是硬件实现的~ 不需要反复设置的吧

没有反复设置啊
wangtao478552 发表于 2014-4-22 16:28 | 显示全部楼层
Matthew179 发表于 2014-4-21 12:20
问题解决了~ 配置字的问题~加了一条#pragma config IESO=OFF 就好了~

回错了
wangtao478552 发表于 2014-4-22 16:28 | 显示全部楼层
阳光的味道3121 发表于 2014-4-20 13:55
你看看你的主程序,main就那几句,你的程序一直在while(1);那块死着。应该改为while(1){PWMset1();    P ...

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

本版积分规则

1

主题

9

帖子

0

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

1

主题

9

帖子

0

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