请问论坛的同仁们,我用30F2010电机控制模块功能来做逆变电源全桥驱动,具体PWM控制程序如下,调试可通过,但是烧到片子里去,用示波器测无PWM波形,PWML控制口一直是高电平,PWMH一直是低电平,请大家耐心一起探讨看看是否程序问题,谢谢!
**********************************************/
#include"p30f2010.h"
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define RB0 PORTB,0
#define RD0 PORTD,0
uint rec_counter,kgbzw,pwmbzw,spwmbzw,adval;
//_FOSC(0x000303);
_FBORPOR(0x000201);
/*****************PWM 初始化子程序 *******************************/
void init_PWM()
{
INTCON1bits.NSTDIS=1 ; //中断嵌套禁止
INTCON2bits.ALTIVT=0 ; //使用标准向量表(默认)
IPC9=0x6000 ; //电机脉宽调制中断优先控制等级为6
IPC10=0x7000 ; //故障A输入中断优先等级7
PTCON=0x7000 ; /*PWM时基控制寄存器*/
PTMR=0x0000 ; //PWM时基寄存器,0-14bit为时基寄存器记数值
PTPER=50 ; //PWM时基周期寄存器,20KHz(50uS)
SEVTCMP=0x0000 ; //特殊事件比较寄存器
PWMCON1=0x00FF ; //PWMxH,PWMxL使能为互补输出模式
PWMCON2=0x0002 ; //控制寄存器2
DTCON1=0x3FF ; //死区时间控制寄存器1
//DTCON2=0X000F ; //死区时间控制寄存器2
FLTACON=0X008F ; //故障A控制寄存器
//FLTBCON=0X008F ; //故障B控制寄存器
OVDCON=0XFFFF ; //改写控制寄存器
PDC1=50 ; //PWM占空比寄存器1,为50
PDC2=50 ; //PWM占空比寄存器2,为50
PDC3=50 ;
OC1CON=0x0000 ; //关闭比较器输出
PTCON=0X8000 ; //PWM启动
}
/****************************AD中断服务程序*************************/
void __attribute__((interrupt,no_auto_psv)) _adjInterrupt()
{
uint adval;
float advalf;
IFS0bits.ADIF=0 ;
adval=ADCBUF0;
//adval=adval<<8|ADRESL;
//advalf=adval/1023.0*5.0;
// adval=advalf*1000;
return (adval) ;
}
/*****************************延时程序***********************************/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
/*********************************I/O初始化************************/
void init_io()
{
TRISB=0x003F;
TRISC=0xE000;
TRISD=0x0003;
TRISE=0x0000;
TRISF=0x000C;
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=0;
PORTF=0;
}
/*****************************PWM调节*****************************/
void pwm_adj(void)
{
// if(kgbzw) //判断kgbzw=1?
// {
// if(pwmbzw)
// {
PTPER=adval ;
// }
// if(spwmbzw)
// {
// PDC1=rec_counter ;
// PDC2=rec_counter ;
// PDC3=rec_counter ;
// }
//}
}
/****************************ad 模块初始化******************************/
void init_adc(void)
{
ADPCFG=0xFFFE; // 将端口B的RB0配置为模拟引脚
//ADCON1=0x8000; // A/D转换器模块启动
ADCON2=0x0000; // 每没完成一个采样/转换后产生中断
ADCON3=0x0080; // 转换时钟(Tad)来源于内部RC
ADCHS=0x0000; //AD通道选择AN0
IFS0bits.ADIF=0;
IEC0bits.ADIE=1;
ADCON1bits.ADON=1; //A/D转换器模块启动
}
/***************** MAIN ROUTINE(主程序)**************************/
int main()
{
TRISEbits.TRISE0=0; //设置RE0-RE3为输出8、
TRISEbits.TRISE1=0;
TRISEbits.TRISE2=0;
TRISEbits.TRISE3=0;
LATEbits.LATE0=0;
LATEbits.LATE1=0;
LATEbits.LATE2=0;
LATEbits.LATE3=0;
init_io();
init_PWM();
// init_UART();
init_adc();
while(1)
{
//start();
pwm_adj();
// pro();
}
} |