/****************************************************************
**电机控制专用PWM模块,占空比|死区时间|故障|周期|互补等都可以调**
****************************************************************/
#include
//////////设置配置位/////////////
_FPOR (PWMPIN_ON & HPOL_ON & LPOL_ON);//注意这种格式,置1或置0用ON或OFF
int k=0;
void __attribute__((__interrupt__)) _PWMInterrupt()
{
k=k+1;
IFS3bits.PWMIF = 0;
///////十秒后关闭PWM,这个可以换成占空比赋值等其他程序////////
if(k == 10000) //小心这是等号不是赋值,后者会被当成真值执行
{
// PTEN:PWM 时基定时器使能位
// 1 = 使能 PWM 时基
// 0 = 禁止 PWM 时基
PTCONbits.PTEN=0;
}
}
main()
{
///////设置周期和占空比步骤//////////
// PWMCON2:PWM 控制寄存器 2
// UDIS:PWM 更新禁止位
// 1 = 禁止从占空比缓冲寄存器和周期缓冲寄存器进行更新
// 0 = 允许从占空比缓冲寄存器和周期缓冲寄存器进行更新
PWMCON2bits.UDIS = 1;//这个不是多余的,
// PTPER:PWM 时基周期寄存器
PTPER = 0x1000; //因为它可用来控制什么时候更新占空比等寄存器
////////注意,实际占空比=PDCx/(2*PTPER)/////////
// PDC1:PWM 占空比寄存器 1
PDC1 = 0x0800;
PDC2 = 0x1000;
PDC3 = 0x1500;
PDC4 =0x1800;
PWMCON2bits.UDIS = 0;
/////////设置控制寄存器/////////
// PTCON:PWM 时基控制寄存器
PTCON = 0; //以下包括时基的工作模式、PWM工作模式、故障、改写等
PWMCON1 = 0x00FF; //直接把PWMCON1bits.PMOD置F即可运行于独立模式
FLTACON=0; //置0则直接运行于没有死区时间的互补模式
FLTBCON=0;
OVDCON=0XFF00; //改写寄存器中POVDxH/L位须置1,
//否则PWM发生器没有I/O脚的控制权
/////////设置死区时间///////////
DTCON1=0X3F1F; // 死区时间值*死区时间单元=实际死区时间
DTCON2=0X000F; //实际死区时间不能超过占空比
////////设置中断相关寄存器//////
IFS3bits.PWMIF=0;
IEC3bits.PWMIE=1;
IPC14bits.PWMIP=4;
////////开启PWM时基//////////
PTCONbits.PTEN=1;
/////////以下这个无限循环不要省,离开它等于跟成功说bye-bye//////////
while(1)
{
; //可以写其他程序
}
}//注意,该程序在运行时有跑飞现象,关闭的时基有时自动开启时基