⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.h

📁 LF2407的各个模块的测试程序,包含2407里面的所有模块,均已经调试通过,心血所致,希望对大家有所帮助.
💻 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 + -