各位高手,急请指教!我利用PIC30F2010写的PWM程序总是不正常.数组中等的数据是逐渐增大的.利用这个数组的数据做为占空比,利用PWM中断输出的脉冲波形
的宽度也应该是逐渐增大的,可事实就不是,前两个脉冲总是很宽,为什么?急请指教!下面是我的全部程序.拜托了.
#include "p30f2010.h"
//配置位
_FOSC(CSW_FSCM_OFF&XT_PLL4); //4倍频锁相环,晶振频率7.3728M
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF&MCLR_EN);
_FGS(CODE_PROT_OFF);
unsigned char countP;
//unsigned int countP; //16位二进制值,用于对PWM脉冲数目进行计数
unsigned int FT; //逻辑变量,用于高、低脉宽的互换
/*
#define TRUE (1)
#define FALSE (0)
typedef int BOOL;
BOOL bool_flag = TRUE;
*/
unsigned int SinTable[11]={0x30,0x4B,0x82,0XC8,0x118,0x15E,0x1D6,0x226,0X262,0x2BC};//定义一个正弦表格,表格中是占空比的值
// (60, 96, 104, 190, 230, 2bc, 3ac, 44c, 4c4, 578)
void PWMinitial() //PWM初始化
{
PWMCON1=0x0777; //独立输出模式,PWMXH使能为PWM输出,PWMXL使能为PWM输出
PWMCON2=0x0002; //强制输出同步
PTPER=0x2E1; //频率为10K赫兹
PTCON=0; //先关闭PWM时基,IDLE时工作,后分频为1:1,输入PWM时钟周期为1Tcy,工作在自由运行模式
PDC1=SinTable[0];
PDC2=SinTable[0];
PDC3=SinTable[0];
// DTCON1=0x000F; //死区时钟周期为1Tcy,死区时间值为15个Tcy,死区时间为2个u秒
// IPC9bits.PWMIP=3; //设定PWM的中断优先级为3级
IEC2bits.PWMIE=1; //允许PWM中断
OVDCON=0x2A00; //PWM1H,PWM2H,PWM3H为PWM输出,PWM1L,PWM2L,PWM3L输出无效
PTCONbits.PTEN=1; //打开PWM时基,开始工作
IFS2bits.PWMIF=0; //清PWM中断标志
return;
}
int main()
{
countP=0; //从表格的第1个数据开始
FT=0;
INTCON1=0x0000;
INTCON2=0x0000; //关闭所有中断
// SRbits.IPL=2; //设定CPU的优先级为2级
PWMinitial();
while(1)
{
}
}
//PWM中断函数
void __attribute__((__interrupt__))_PWMInterrupt(void)
{
PDC1=(SinTable[countP]<<1); //LS位不是有效位,因此左移一位让开
PDC2=(SinTable[countP]<<1);
PDC3=(SinTable[countP]<<1);
countP++;
if(countP>=10&&FT==0) //半个周期结束,原来是PWM1H为PWM输出,现在要换成PWM1L为PWM输出
{
countP=0;
FT=1;
OVDCON=0x1500; //PWM1L,PWM2L,PWM3L为PWM输出,PWM1H,PWM2H,PWM3H输出无效
}
if(countP>=10&&FT==1)
{
countP=0;
FT=0;
OVDCON=0x2A00; //PWM1H,PWM2H,PWM3H为PWM输出,PWM1L,PWM2L,PWM3L输出无效
} //表格索引
IFS2bits.PWMIF=0; //清PWM中断标志
}
一周热门 更多>