程序如下:
输出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输出,可以不断改变占空比。 |