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

dsPIC30F2010 PWM输出,无法更新占空比问题,求教

[复制链接]
2677|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gentleyidao|  楼主 | 2015-1-9 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下:
输出PWM波,没法改变占空比。还有一个问题,初始化时把PDC1赋值为ffff,UDIS=1时,PWM输出为4.92;UDIS=0,PWM输出为3.79V。不知道为啥?
#include "p30f2010.h"
#include <stdio.h>
_FOSC(CSW_FSCM_OFF&XT_PLL4 );//配置时钟,选用外部晶振,10Mz*PLL4
_FWDT(WDT_OFF );             // 关闭看门狗定时器
_FBORPOR(PBOR_OFF&MCLR_EN);  //掉电复位禁止;MCLR复位使能
_FGS(CODE_PROT_OFF);         //代码保护禁止
#define uchar unsigned char
#define PWM_up       PORTEbits.RE2    //PWM占空比增加键
#define PWM_down     PORTEbits.RE4    //PWM占空比减少键
//#define PWM_on_off   PORTEbits.RE0    //PWM输出on/off键或PWM通道切换
void delay(uchar t);    //按键防抖动延时
void initPWM();                //PWM初始化
/*********************************************
主函数功能:PWM初始化,PWM占空比随增加按键增加至100%
            随减少按键减少至0为止
*******************************************/
void main()
{
  uchar Flag;   //按键中断标志位                                                   
unsigned int PWM=0;
  initPWM();        //初始化,定义PWM周期,设置占空比初值及PWM输出I/O口,预分频值
   while(1)
   {
    if(PWM_up==1&&PWM_down==1)
            {Flag=0;}
       if(PWM_up==0)
             {
                delay((uchar)4000);                   //按键去抖动
               if(PWM_up==0&&Flag==0)       
                        {       
                                if(PWM<65500)             //按增加键,占空比增加10%,同时启动定时器T2
                                {   
                    PWM +=655;PDC1=PWM;
                 }
                 else
                    {PDC1= 65500;  //如果占空比达到最大值后,再按增加键时,一直保持最大占空比状态                    }
             }
           Flag = 1;
          }
        }
           if(PWM_down==0)                    
            {
                delay((uchar)4000);                          //按键去抖动
              if(PWM_down==0&&Flag==0)              //按减少键,占空比增加减少10%,同时启动定时器T2
           {
                 if(PWM>0)
              {
                              PWM -=65500; PDC1=PWM;
              }
                      else
                   {PDC1=0;//如果占空比达到最小值后,再按减少键时,一直保持最小占空比状态                   }
                          
                    }
                        Flag=1;       
          }
       }
    }
}
  /********************************************
函数功能:PWM初始化,设置PWM周期;
**********************************************/
void initPWM()
{
        PDC1             = 0x0000;   //PWM1 占空比值
        PDC2             = 0x0000;   //PWM2 占空比值
        PDC3             = 0x0000;   //PWM3 占空比值
        
        OVDCON           = 0x2A00;    //PWM1H、 PWM2H和PWM3H引脚由PWM控制强制寄存器
        
        FLTACON           = 0;       //故障A控制寄存器,外部故障输入无效
        //FLTBCON           = 0;       //故障B控制寄存器,外部故障输入无效
        DTCON1            = 0;       //死区控制器1
        //DTCON2            = 0;       //死区控制器2
        //PWMCON1           = 0x0770;
        PWMCON2           = 0x0001;      //使能从占空比和周期缓冲寄存器更新
         
        PWMCON1bits.PEN1H  = 1;      //PWM1H PWM输出模式
        PWMCON1bits.PEN2H  = 1;      //PWM2H PWM输出模式
        PWMCON1bits.PEN3H  = 1;      //PWM3H PWM输出模式
        
        PWMCON1bits.PMOD1  = 1;      //PWM1  独立输出模式
        PWMCON1bits.PMOD2  = 1;      //PWM2  独立输出模式
        PWMCON1bits.PMOD3  = 1;      //PWM3  独立输出模式
        
        SEVTCMPbits.SEVTDIR = 0;     //PWM 时基向上计数产生特殊事件信号
        
        PTPER            = 0x0070;   //PWM 时基周期寄存器值,ptper=50,产生2KHZPWM波
        
        PTMRbits.PTMR    = 0x0000;   //bit15 PWM时基向上计数,PWM时基寄存器计数值
//PTCON PWM时基控制寄存器

        PTCONbits.PTMOD  = 0;        //PWM 工作于自由运行模式
        PTCONbits.PTCKPS = 0;        //PWM 前分频比 1:1   PWM时基预分频比选择
        PTCONbits.PTOPS  = 0;        //PWM 后分频比 1:1   
        PTCONbits.PTSIDL = 0;        //PWM 空闲模式下运行  空闲模式IDLE
        PTCONbits.PTEN   = 1;        //PWM 定时器时基使能 启动时基定时器        
   
    IEC2bits.PWMIE=1;    //中断允许标志
        IFS2bits.PWMIF=0;   //清楚中断标志位
          IPC9bits.PWMIP=6;    //中断优先级设为6、、、、
     SRbits.IPL    =1;                  //cpu中断优先级1
}
/*********************************************************/
// 延时程序
/*********************************************************/
void delay(uchar t)
{
while(t--);
}
请大神们指教,想实现PWM输出,可以不断改变占空比。
沙发
DONGXU| | 2015-1-9 21:31 | 只看该作者
官网上有例程

使用特权

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

本版积分规则

3

主题

7

帖子

0

粉丝