📄 pwm.h
字号:
void PWM_Init()
{
*ACTRA = 0x0666; // Page 159 ,PWM1,3,5高有效;PWM2,4,6低有效
*DBTCONA = 0x00; // Page 161 ,不使能死区控制
*CMPR1 = 100*12;
*CMPR2 = 200*12;
*CMPR3 = 600*12;
*T1PER = 1000*12;//12M晶振,预分频系数是1X,最长时间是 5461 us。
*COMCONA = 0x8200;//Page 158 ,比较控制寄存器,使能比较操作,使能引脚的PWM状态。
*T1CON = 0x0802; // Page 140 ,定时器为连续增减模式
}
//使用等效面积法
void SPWM_Test()
{
float PI = 3.1415926;
float T = 300;//正弦周期,以毫秒ms为单位。
UINT T_n = 50;//每一个正弦周期被分的等份个数。
UINT k1 = 0;//第一相正弦的索引。
UINT k2 = T_n/3;//第二相正弦的索引。
UINT k3 = 2*T_n/3;//第三相正弦的索引。
float M = 1;//调制深度
float tk = 0;//每一份中的脉冲宽度
UINT test = 0;
while(1)
{
// if(Next_Loop == 0)
// continue;
// Next_Loop = 0;
T = (Get_Group_Key()+1)*20;
*T1PER = (T/T_n) * 12*1000;//(微秒)
k1++; k2++; k3++;
if(k1 == T_n) k1 = 0;
if(k2 == T_n) k2 = 0;
if(k3 == T_n) k3 = 0;
tk = (M*T/PI)*(cos(2*k1*PI/T_n)-cos(2*(k1+1)*PI/T_n))/2;
if(tk < 0) tk = -tk;
*CMPR1 = ((T/T_n)-tk) * 12*1000;//(微秒)
tk = (M*T/PI)*(cos(2*k2*PI/T_n)-cos(2*(k2+1)*PI/T_n))/2;
if(tk < 0) tk = -tk;
*CMPR2 = ((T/T_n)-tk) * 12*1000;//(微秒)
tk = (M*T/PI)*(cos(2*k3*PI/T_n)-cos(2*(k3+1)*PI/T_n))/2;
if(tk < 0) tk = -tk;
*CMPR3 = ((T/T_n)-tk) * 12*1000;//(微秒)
}
}
void SVPWM_Test()
{
/* float Ua[200],Ub[200];
int sector[200];
float PI2 = 2*3.1415926;
float DETA = PI2/200;
float INIA = 3.1415926/180;
unsigned int TP = 5000;
float KP = 0.7;
unsigned int count = 0;
//--------------------------------------------------
int anticlk[6] = {0x1666,0x3666,0x2666,0x6666,0x4666,0x5666};
int k = 0;
int i,a,b,c,cmp1,cmp2;
float vref1,vref2,vref3;
float x,y,z;
//--------------------------------------------------
asm(" setc INTM");//禁止所有中断
*IFR = 0xFFFF;
*IMR = 0x0;
*SCSR1 = 0x02FC; //2倍频
*WDCR = 0x0E8;//禁止看门狗
*T1PER = TP;
*T1CON = 0x0802;
*ACTRA = 0x0666;
*COMCONA = 0x9200;
*EVAIMRA = 0X00;
*T1CNT = 0;
*EVAIFRA = 0XFFFF;
*MCRA = 0x0FDF;
*MCRB = 0xFFFC;
*MCRC = 0x0000;
*PADATDIR = 0xFFFF;
*PCDATDIR = 0x0200;
*PFDATDIR = 0xF300;
WSGR = 0;
//--------------------------------------------------
for(i=0;i<200;i++)
{
Ua[i] = KP * cos(INIA + i*DETA);
Ub[i] = KP * sin(INIA + i*DETA);
}
//--------------------------------------------------
for(i=0;i<200;i++)
{
vref1 = Ub[i];
vref2 = (-Ub[i] + Ua[i]*1.732051)/2;
vref3 = (-Ub[i] - Ua[i]*1.732051)/2;
a = (vref1>0 ? 1 : 0);
b = (vref2>0 ? 1 : 0);
c = (vref3>0 ? 1 : 0);
a = 4*c + 2*b + a;
switch(a)
{
case 1:
sector[i] = 1;
break;
case 2:
sector[i] = 5;
break;
case 3:
sector[i] = 0;
break;
case 4:
sector[i] = 3;
break;
case 5:
sector[i] = 2;
break;
case 6:
sector[i] = 4;
break;
default:
break;
}
}
//--------------------------------------------------
while(1)
{
Set_LED(count/10);
count++;
if(count > 2560)
count = 0;
for(i=0;i<200;i++)
{
*ACTRA = anticlk[sector[i]];
x = Ub[i];
y = (1.732051*Ua[i] + Ub[i])/2;
z = (-1.732051*Ua[i] + Ub[i])/2;
switch(sector[i])
{
case 0:
cmp1 = (int)(-z*TP); cmp2 = (int)(x*TP); break;
case 1:
cmp1 = (int)(y*TP); cmp2 = (int)(z*TP); break;
case 2:
cmp1 = (int)(x*TP); cmp2 = (int)(-y*TP); break;
case 3:
cmp1 = (int)(z*TP); cmp2 = (int)(-x*TP); break;
case 4:
cmp1 = (int)(-y*TP); cmp2 = (int)(-z*TP); break;
case 5:
cmp1 = (int)(-x*TP); cmp2 = (int)(y*TP); break;
default:
break;
}
*CMPR1 = cmp1;
*CMPR2 = cmp1 + cmp2;
if((i+k) == 0)
*T1CON |= 0x040;
while(*EVAIFRA & 0x0200 != 0x0200)
;
}
}
//--------------------------------------------------
*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -