各位老大,我用单相逆变桥做一个交流电源,如下图:
上半桥IGBT从左到右排列为Q1,Q3,下半桥IGBT从左到右排列为Q2,Q4;
控制系统采用2407A,主要程序如下:
void SpwmInit(void)
{
//只用EVA来控制产生SPWM波;只用T1,
//只用4,2和3,1组成单线全控桥,6,5禁止;
//设为双极性SPWM调制方式,
*MCRA |= 0x03c0; //使能PWM1,2,3,4功能,IOPB7,PWM5,6设为I/O
//比较方式控制寄存器A, 00-强制低,01-低有效,10-高有效,11-强制高
*ACTRA = 0x0f99; //1111 1001 1001–PWM1,4 低有效,PWM2,3高有效;产生互补脉冲
*DBTCONA = 0x0AF4; //死区时间控制, 周期A 32分频 8us
//三角波(载波)设置
*T1CNT = 0; //计数单元
*T1CON = 0x0800; //T1控制寄存器,12~11–>01为连续增减计数模式,10~8bit–>000以CPU时钟频率为准
*T1PR = 2000; //T1周期寄存器,载波频率10k , 4000个时钟周期
//比较控制寄存器,15->使能比较操作,
//14~13->T1CNT下溢重载,11~10->ACTRA下溢重载,9->比较输出允许
*COMCONA = 0x8200; //1000 0010
//中断屏蔽寄存器A,B,C
*EVAIMRA = 0x0081; //0–屏蔽;1–使能;7bit–>T1周期、1–>PDPINTA中断使能
*EVAIMRB = 0x0001; //T2周期中断使能
*EVAIMRC = 0x0000; //全部屏蔽
//中断标志寄存器A,B,C,全部清中断标志
*EVAIFRA = 0x078F;
*EVAIFRB = 0x000F;
*EVAIFRC = 0x0007;
M_wave_Cnt=0;
}
//每个T1中断调用一次;
//计算0~2pi周期均匀的200个点对应的脉冲导通时间
//Ton= Tc/2*(1+M*sin(2*K*PI*Fm/Fc)),其中: K = 0,1,2,,,N-1
void SPWM_D_calu(void)
{
long Q14_tmp; //注意,有正负32bit
int Q14_sin; //注意,有正负
M_wave_Cnt++; //三角载波中断次数计数器
if(M_wave_Cnt >= 200){ //一个正弦波周期结束
M_wave_Cnt = 0; //重新从0度开始
}
Q14_M_tmp = 256<<6; //假设为最大
//SIN值为sin(2*K*PI*Fm/Fc),分为200个点
Q14_sin = PFUNC_wordRead(SIN_LIB + M_wave_Cnt);
Q14_tmp = ((long)Q14_M_tmp*(long)Q14_sin) >> 14;
Q14_tmp = (Q14_tmp+16384); //1–>Q14===1<<14
Q14_tmp = Q14_tmp >> 1;
Q14_tmp = Q14_tmp * Tc;
Q14_tmp = Q14_tmp >> 14;
//设置比较寄存器值
*CMPR1 = (unsigned int)Q14_tmp;
*CMPR2 = (unsigned int)Q14_tmp;
}
问题:
1. 脉冲宽度计算值在0~4000个时钟周期,可是三角波的周期一般为2000,我感觉好像不对!
2. 输出波形也不对;在正半周,PWM1全为高电平(Q1不导通),负半周有脉冲!
3. 电压上不去,只有50v~60v
请先知给与指点,不胜感激!
jin zhao:
修正:
看到了一篇文章,做了一下修改
Q14_tmp1= 2000-((unsigned int)Q14_tmp>>1);
//设置比较寄存器值
*CMPR1 = Q14_tmp1;
*CMPR2 = Q14_tmp1; }
问题就剩下:
输出波形看不到什么问题,可是电压输出不够,只有220v,可输入有576v直流啊!
请先知给与指点,不胜感激!
各位老大,我用单相逆变桥做一个交流电源,如下图:
上半桥IGBT从左到右排列为Q1,Q3,下半桥IGBT从左到右排列为Q2,Q4;
控制系统采用2407A,主要程序如下:
void SpwmInit(void)
{
//只用EVA来控制产生SPWM波;只用T1,
//只用4,2和3,1组成单线全控桥,6,5禁止;
//设为双极性SPWM调制方式,
*MCRA |= 0x03c0; //使能PWM1,2,3,4功能,IOPB7,PWM5,6设为I/O
//比较方式控制寄存器A, 00-强制低,01-低有效,10-高有效,11-强制高
*ACTRA = 0x0f99; //1111 1001 1001–PWM1,4 低有效,PWM2,3高有效;产生互补脉冲
*DBTCONA = 0x0AF4; //死区时间控制, 周期A 32分频 8us
//三角波(载波)设置
*T1CNT = 0; //计数单元
*T1CON = 0x0800; //T1控制寄存器,12~11–>01为连续增减计数模式,10~8bit–>000以CPU时钟频率为准
*T1PR = 2000; //T1周期寄存器,载波频率10k , 4000个时钟周期
//比较控制寄存器,15->使能比较操作,
//14~13->T1CNT下溢重载,11~10->ACTRA下溢重载,9->比较输出允许
*COMCONA = 0x8200; //1000 0010
//中断屏蔽寄存器A,B,C
*EVAIMRA = 0x0081; //0–屏蔽;1–使能;7bit–>T1周期、1–>PDPINTA中断使能
*EVAIMRB = 0x0001; //T2周期中断使能
*EVAIMRC = 0x0000; //全部屏蔽
//中断标志寄存器A,B,C,全部清中断标志
*EVAIFRA = 0x078F;
*EVAIFRB = 0x000F;
*EVAIFRC = 0x0007;
M_wave_Cnt=0;
}
//每个T1中断调用一次;
//计算0~2pi周期均匀的200个点对应的脉冲导通时间
//Ton= Tc/2*(1+M*sin(2*K*PI*Fm/Fc)),其中: K = 0,1,2,,,N-1
void SPWM_D_calu(void)
{
long Q14_tmp; //注意,有正负32bit
int Q14_sin; //注意,有正负
M_wave_Cnt++; //三角载波中断次数计数器
if(M_wave_Cnt >= 200){ //一个正弦波周期结束
M_wave_Cnt = 0; //重新从0度开始
}
Q14_M_tmp = 256<<6; //假设为最大
//SIN值为sin(2*K*PI*Fm/Fc),分为200个点
Q14_sin = PFUNC_wordRead(SIN_LIB + M_wave_Cnt);
Q14_tmp = ((long)Q14_M_tmp*(long)Q14_sin) >> 14;
Q14_tmp = (Q14_tmp+16384); //1–>Q14===1<<14
Q14_tmp = Q14_tmp >> 1;
Q14_tmp = Q14_tmp * Tc;
Q14_tmp = Q14_tmp >> 14;
//设置比较寄存器值
*CMPR1 = (unsigned int)Q14_tmp;
*CMPR2 = (unsigned int)Q14_tmp;
}
问题:
1. 脉冲宽度计算值在0~4000个时钟周期,可是三角波的周期一般为2000,我感觉好像不对!
2. 输出波形也不对;在正半周,PWM1全为高电平(Q1不导通),负半周有脉冲!
3. 电压上不去,只有50v~60v
请先知给与指点,不胜感激!
jin zhao:
再补充:上图为,PWM位置图;
1.电压只有50~60v也不对;是压根就没有电压;
2.修改
*CMPR1 = (unsigned int)Q14_tmp;
*CMPR2 =*T1PR- (unsigned int)Q14_tmp;
出现短路保护提示;
难道还没高手给与指点吗?