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

实在没辙了,PIC24FJ256PWM波输出不了

[复制链接]
3168|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Uchar13|  楼主 | 2014-4-29 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先我又出问题了。。。
是这样我要输出PWM波,按照手册上面设置的,但用示波器观察波形就是没有输出波形,我的程序如下:
#include <p24FJ256GA110.h>

_CONFIG1(0X0f7f)
_CONFIG2(0X72fe)       //主振荡器HS振荡器模式11.0592MHZ
_CONFIG3(0X1e01)

typedef  unsigned char  uchar;
typedef  unsigned int   uint;
typedef  unsigned long  ulong;
typedef  unsigned short ushort;

void init()
{
    OSCCON=0x2200;   
    AD1PCFG=0xffff;            //RB9数字io
    TRISB=0X03ff;               //PWM设为输出,即RB9
    RPOR4bits.RP9R=18;     //将OC1输出在RB9
    OC1CON1=0;
    OC1CON2 = 0x001f;      //当前OC1作为触发源
    OC1R=0;                       
    OC1RS=0X01b1;            //75%占空比
    OC1CON1=0X0006;
    PR2=350;
    IPC1bits.T2IP=1;
    IFS0bits.T2IF=0;
    IEC0bits.T2IE=1;
    TMR2=0;
    T2CONbits.TON=1;
}
void __attribute__((__interrupt__, no_auto_psv)) _T2Interrupt()
{
   _T2IF=0;
}
int main()
{
   init();
   while(1);
}

此时用示波器去测RB9输出一直为低电平。
当把OC1R设置为非0时,根据数据手册,此时RB9应输出高电平,再等下次匹配时输出PWM,但是此时测RB9却是一直保持高电平
请大家帮忙看看,实在是没辙了,在实验室搞了一天了。。。



沙发
Uchar13|  楼主 | 2014-4-29 22:19 | 只看该作者
@zhimagod 亲帮忙看看~

使用特权

评论回复
板凳
yewuyi| | 2014-4-30 09:44 | 只看该作者
检查该IO口是否有其他复用功能模块。

使用特权

评论回复
地板
Uchar13|  楼主 | 2014-4-30 14:47 | 只看该作者
yewuyi 发表于 2014-4-30 09:44
检查该IO口是否有其他复用功能模块。

调试出来了。我这程序有3个致命问题。
第一是OC1外设输出选择引脚这一句“RPOR4bits.RP9R=18;     //将OC1输出在RB9”
这句看似是把RP9用来给OC1输出,其实是没有实现的,应该加上IO解锁语句,如下:
        //***************** Unlock Registers ***************//

        __builtin_write_OSCCONL(OSCCON & 0xbf);   //clear the bit 6 of OSCCONL to
                                                  //unlock Pin Re-map
//************* Configure Input/Output Functions *********//
     
     RPOR4bits.RP9R = 18;      //’18’ represents OC1  
                               // Assign OC1 To Pin RP9,PWM
//***************** Lock Registers *************************//

      __builtin_write_OSCCONL(OSCCON | 0x40);   //set the bit 6 of OSCCONL to
                                                //lock Pin Re-map

第二个是我的OC1R初始值为0,这样根据手册,输出会始终是低电平。

第三个就是我的OC1RS的值大于PR2的值,这也就是为什么始终是高电平的原因了。。。。

调试出来真的是太艰难了,太粗心了!

使用特权

评论回复
5
Uchar13|  楼主 | 2014-4-30 18:11 | 只看该作者
又继续做了下实验,补充一下,上面程序出不来PWM波的关键问题其实是选择触发源的问题,当OC1CON2=0X001F时选择的是OC1本身作为触发源,因此在while(1)中就应该设置OC1RS这样才会有pwm波产生;当OC1CON=0X000C时,选择的是timer2触发源,此时,上面的程序可以调通~

使用特权

评论回复
6
Uchar13|  楼主 | 2014-4-30 18:13 | 只看该作者
放一个能调通的例子程序
#include <p24FJ256GA110.h>

_CONFIG1(0X0f7f)
_CONFIG2(0X72fe)//主振荡器HS振荡器模式11.0592MHZ
_CONFIG3(0X1e01)


#define LED1 LATBbits.LATB11
#define LED2 LATAbits.LATA1
#define LED3 LATFbits.LATF13
#define LED4 LATFbits.LATF12
#define LED5 LATBbits.LATB12
#define LED6 LATBbits.LATB13
#define LED7 LATBbits.LATB14
#define LED8 LATBbits.LATB15

typedef  unsigned char  uchar;
typedef  unsigned int   uint;
typedef  unsigned long  ulong;
typedef  unsigned short ushort;

void init()
{
        //***************** Unlock Registers ***************//

        __builtin_write_OSCCONL(OSCCON & 0xbf);   //clear the bit 6 of OSCCONL to
                                                  //unlock Pin Re-map
//************* Configure Input/Output Functions *********//
     
     RPOR4bits.RP9R = 18;      //’18’ represents OC1  
                               // Assign OC1 To Pin RP9,PWM
//***************** Lock Registers *************************//

    __builtin_write_OSCCONL(OSCCON | 0x40);   //set the bit 6 of OSCCONL to
                                                //lock Pin Re-map  
    AD1PCFGL=0xffff;      //数字io
    TRISBbits.TRISB9=0;        //PWM设为输出

    OC1CON1=0;
    OC1R=0x0ad7;
    OC1RS=0x0ad7;         //75%占空比
    OC1CON2=0x000c;     //timer2作为触发源
    OC1CON1=0X0006;
        
    T2CON=0;
    TMR2=0;
    PR2=0x15af;
    IPC1bits.T2IP=1;
    IFS0bits.T2IF=0;
    IEC0bits.T2IE=0;
    T2CONbits.TON=1;

}
void __attribute__((__interrupt__, no_auto_psv)) _T2Interrupt()
{
   _T2IF=0;
}
int main()
{
   init();
   while(1);
}

使用特权

评论回复
7
hlhfootbal| | 2014-9-11 16:24 | 只看该作者
Uchar13 发表于 2014-4-30 14:47
调试出来了。我这程序有3个致命问题。
第一是OC1外设输出选择引脚这一句“RPOR4bits.RP9R=18;     //将OC ...

我实际实验发现不加IO解锁也可以把PIN脚作为OC1输出。
请教加IO解锁和不加的区别。

使用特权

评论回复
8
ltj6111| | 2017-1-7 10:23 | 只看该作者
RPOR4bits.RP9R=18;     //将OC1输出在RB9
正确配置这个后,OC1照样没有输出,这是什么问题呢?

使用特权

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

本版积分规则

2

主题

14

帖子

0

粉丝