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

📄 dsp-spwm.c

📁 瑞泰ICETEK-F2812评估板资料
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	CTRLCDCMDR=LCDCMDVERADDRESS+16;				// 起始列=16,操作页=5,屏幕右侧显示"吴莹"的下半字
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<32;i++ )
	{
		CTRLCDRCR=ledwords4[1][i];
		Delay(LCDDELAY);	
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	CTRLCDCMDR=LCDCMDPAGE+7;					// 设置操作页=7,显示当日时间,如"2008/03/28"
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( k=24,n1=8002;k<64;k=k+8 )				// n1为年份,共4位,需到写
	{
		CTRLCDCMDR=LCDCMDVERADDRESS+k;			// 起始列=24
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<8;i++ )
		{
			if ( n1==0 )						// "年份"结束用"/"分隔
			{
				CTRLCDLCR=lednumber[10][i];
				Delay(LCDDELAY);
				CTRLCDCR=0;
				Delay(LCDDELAY);
			}
			else
			{
				CTRLCDLCR=lednumber[n1%10][i];
				Delay(LCDDELAY);
				CTRLCDCR=0;
				Delay(LCDDELAY);							
			}	
		}
		n1=n1/10;
	}
	for ( k=0,n2=30;k<16;k=k+8 )				// n2为月份,共2位,也需到写
	{
		CTRLCDCMDR=LCDCMDVERADDRESS+k;			// 起始列=0
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<8;i++ )
		{
			CTRLCDRCR=lednumber[n2%10][i];
			Delay(LCDDELAY);
			CTRLCDCR=0;
			Delay(LCDDELAY);							
		}	
		n2=n2/10;
	}
	CTRLCDCMDR=LCDCMDVERADDRESS+k;				// 起始列=16,在"月份"结束后用"/"分隔
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for( i=0;i<8;i++ )
	{
		CTRLCDRCR=lednumber[10][i];
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	k=k+8;
	for ( n3=82;k<40;k=k+8 )					// n3为日期,共2位,也需到写
	{
		CTRLCDCMDR=LCDCMDVERADDRESS+k;			// 起始列=24
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<8;i++ )
		{
			CTRLCDRCR=lednumber[n3%10][i];
			Delay(LCDDELAY);
			CTRLCDCR=0;
			Delay(LCDDELAY);							
		}	
		n3=n3/10;
	}
}

/* ----- 测试状态显示程序 ----- */
void TestLCD()
{
	unsigned char ledwords5[2][32]=				// "参数",第一行为其上半字,第二行为其下半字
	{
		{0x20,0x20,0x20,0x28,0xA8,0x6C,0x3B,0x28,0xA8,0x6A,0xAC,0x28,0x20,0x30,0x20,0x00,
		 0x10,0x92,0x54,0x30,0xFF,0x50,0x94,0x32,0xD8,0x17,0x10,0x10,0xF0,0x18,0x10,0x00},
		{0x04,0x84,0x82,0x81,0x4A,0x4A,0x49,0x25,0x24,0x12,0x10,0x09,0x02,0x06,0x02,0x00,
		 0x02,0x82,0x4E,0x33,0x22,0x52,0x8E,0x40,0x23,0x14,0x08,0x16,0x61,0xC0,0x40,0x00}
	};
	unsigned char ledwords6[2][32]=				// "检测",第一行为其上半字,第二行为其下半字
	{
		{0x10,0x10,0xD0,0xFF,0x10,0x50,0x20,0x50,0x4C,0x43,0x4C,0x50,0x20,0x60,0x20,0x00,
		 0x10,0x22,0x6C,0x00,0x80,0xFC,0x04,0xF4,0x04,0xF4,0x04,0xF8,0x00,0xFE,0x00,0x00},
		{0x04,0x03,0x00,0xFF,0x41,0x42,0x42,0x5C,0x40,0x5F,0x40,0x50,0x4E,0x64,0x40,0x00,
		 0x04,0x04,0xFE,0x01,0x40,0x27,0x10,0x0F,0x10,0x67,0x00,0x47,0x80,0x7F,0x00,0x00}
	};
	
	unsigned char symbol1[3][18]=				// 6×6点阵字符,字母和符号
	{
		{0x7E,0x80,0x80,0x80,0x7E,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Ua="
		{0x00,0x82,0xFE,0x82,0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Ia="
		{0x00,0x88,0xFA,0x80,0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00}			// "ia=",表示无功电流
	};
	unsigned char symbol2[3][18]=				// 6×6点阵字符,字母和符号
	{
		{0x7E,0x80,0x80,0x80,0x7E,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Ub="
		{0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Ib="
		{0x00,0x88,0xFA,0x80,0x00,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00}			// "ib=",表示无功电流
	};
	unsigned char symbol3[3][18]=				// 6×6点阵字符,字母和符号
	{
		{0x7E,0x80,0x80,0x80,0x7E,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Uc="
		{0x00,0x82,0xFE,0x82,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00},		// "Ic="
		{0x00,0x88,0xFA,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00}			// "ic=",表示无功电流
	};
	unsigned char symbol4[3][6]=				// 6×6点阵字符,字母和符号
	{
		{0x3E,0x40,0x80,0x40,0x3E,0x00},		// "v"
		{0xFC,0x22,0x22,0x22,0xFC,0x00},		// "A"
		{0xFC,0x22,0x22,0x22,0xFC,0x00}			// "A"
	};
	unsigned char symbol5[58]=					// 8×8点阵字符,字母和符号,在右半屏第7页从第8列开始显示
	{
		0x08,0x08,0xFC,0x0A,0x0A,0x00,			// "f"
		0x28,0x28,0x28,0x28,0x28,0x00,			// "="
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
		0xFE,0x10,0x10,0x10,0xFE,0x00,			// "H"
		0x88,0xC8,0xA8,0x98,0x88,0x00			// "z"
	};
	
	int i,k;
	
	CTRLCDCMDR=LCDCMDPAGE;						// 设置操作页=0,左半屏显示"参数"的上半字
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	CTRLCDCMDR=LCDCMDVERADDRESS+32;				// 起始列=32
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<32;i++ )
	{
		CTRLCDLCR=ledwords5[0][i];
		Delay(LCDDELAY);	
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	CTRLCDCMDR=LCDCMDVERADDRESS;				// 起始列=0,操作页=0,右半屏显示"检测"的上半字
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<32;i++ )
	{
		CTRLCDRCR=ledwords6[0][i];
		Delay(LCDDELAY);	
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	CTRLCDCMDR=LCDCMDPAGE+1;					// 设置操作页=1,左半屏显示"参数"的下半字
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	CTRLCDCMDR=LCDCMDVERADDRESS+32;				// 起始列=32
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<32;i++ )
	{
		CTRLCDLCR=ledwords5[1][i];
		Delay(LCDDELAY);	
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	CTRLCDCMDR=LCDCMDVERADDRESS;				// 起始列=0,操作页=1,右半屏显示"检测"的下半字
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<32;i++ )
	{
		CTRLCDRCR=ledwords6[1][i];
		Delay(LCDDELAY);	
		CTRLCDCR=0;
		Delay(LCDDELAY);
	}
	
	for( k=2;k<5;k++ )
	{
		CTRLCDCMDR=LCDCMDVERADDRESS;			// 起始列=0
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		CTRLCDCMDR=LCDCMDPAGE+k;				// 设置操作页=2~4,起始列=0,左右半屏分别显示"Ua=","Ia=","ia=";"Uc=","Ic=","ic="
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<18;i++ )
		{
			CTRLCDLCR=symbol1[k-2][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
			CTRLCDRCR=symbol3[k-2][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
	}
	for( ;k<8;k++ )
	{
		CTRLCDCMDR=LCDCMDVERADDRESS;			// 起始列=0
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		CTRLCDCMDR=LCDCMDPAGE+k;				// 设置操作页=5~7,起始列=0,左半屏显示"Ub=","Ib=","ib="
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<18;i++ )
		{
			CTRLCDLCR=symbol2[k-5][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
	}
	
	for( k=2;k<5;k++ )
	{
		CTRLCDCMDR=LCDCMDVERADDRESS+58;			// 起始列=58
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		CTRLCDCMDR=LCDCMDPAGE+k;				// 设置操作页=2~4,起始列=58,左右半屏分别显示"V","A","A";"V","A","A"
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<6;i++ )
		{
			CTRLCDLCR=symbol4[k-2][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
			CTRLCDRCR=symbol4[k-2][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
	}
	for( ;k<8;k++ )
	{
		CTRLCDCMDR=LCDCMDVERADDRESS+58;			// 起始列=58
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		CTRLCDCMDR=LCDCMDPAGE+k;				// 设置操作页=5~7,起始列=58,左半屏显示"V","A","A"
		Delay(LCDDELAY);
		CTRLCDCR=0;
		Delay(LCDDELAY);
		for ( i=0;i<6;i++ )
		{
			CTRLCDLCR=symbol4[k-5][i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
	}
	
	CTRLCDCMDR=LCDCMDVERADDRESS+8;				// 起始列=8,右半屏最底下页(第7页)显示"f=    Hz"
	Delay(LCDDELAY);
	CTRLCDCR=0;
	Delay(LCDDELAY);
	for ( i=0;i<58;i++ )
		{
			CTRLCDRCR=symbol5[i];
			Delay(LCDDELAY);	
			CTRLCDCR=0;
			Delay(LCDDELAY);
		}
}

/* ----- EVA模块的PWM初始化程序 ----- */
void init_eva_pwm()								// 定时器T1作为产生PWM的时基,计数时钟75M
{
	EALLOW;
   	PieVectTable.T1PINT = &t1pr_isr;			// 把定时器1周期中断服务程序和向量表该中断对应起来
	GpioMuxRegs.GPAMUX.all = 0x003F;			// GPIOA口被配置为基本功能方式,也即引脚输出为PWM[1~6]
	EDIS;
	
	IER |= M_INT2;								// CPU级可屏蔽中断INT2使能
	PieCtrlRegs.PIEIER2.bit.INTx4 = 1;			// 属于CPU级INT2中断中的T1PINT中断(INTx4)使能
	
	EvaRegs.T1PR = 5814;						// PWM载波周期为5814×2个定标的定时器时钟周期,PWM载波的初始频率为50×129Hz
												// 5814=75M/(50*129)/2
	
	EvaRegs.ACTRA.all = 0x0666;					// 设置输出PWM1-高
												//         PWM2-低
												//         PWM3-高
												//         PWM4-低
												//         PWM5-高
												//         PWM6-低
	EvaRegs.DBTCONA.all = 0x0FF0;				// 配置死区控制器A:死区定时器1、2、3使能,即输出PWM[1~6]带有死区控制
												//                  死区值为15×16个HSPCLK时钟周期3.2us                
	
	EvaRegs.CMPR1 = 2907;						// 初始占空比50%,T1PR/2
	EvaRegs.CMPR2 = 2907;						// 初始占空比50%,T1PR/2
	EvaRegs.CMPR3 = 2907;						// 初始占空比50%,T1PR/2
	
	EvaRegs.COMCONA.all = 0x8200;				// 使能比较操作
												// 全比较输出使能
												// 比较寄存器、比较行为控制寄存器重载条件:T1CNT=0
											
	EvaRegs.T1CNT = 0x0000;						// 定时器1的计数寄存器从0开始计数
	
	EvaRegs.T1CON.all = 0x084C;					// 配置定时器1的控制寄存器
												// 选择连续增/减模式
												// 使用内部时钟HSPCLK,分频系数为1,即定时器1计数时钟为HSPCLK=75M
												// 使能定时器操作
												// 定时器1比较寄存器重载条件:保留
												// 禁止定时器的比较操作
	
	EvaRegs.EVAIMRA.all = 0x0080;				// 仅仅使能EVA模块的定时器1的周期中断T1PINT
   	EvaRegs.EVAIMRB.all = 0x0000;
   	EvaRegs.EVAIMRC.all = 0x0000;
}

/* ----- SPWM波占空比(比较寄存器CMPRx)计算子程序 ----- */
void cmpx_calculate(int i)
{
	int k1,k2,k3;
	k1 = 4*i+1;									// A相电压、电流占空比索引值
	k2 = 4*i+345;								// B相电压、电流占空比索引值
	k3 = 4*i+173;								// C相电压、电流占空比索引值
	
	// 全部采用Q15定标,调制度M=0.8
	if( k1<=258 ) CMP1 = (long)(16384-((long)13107*sin_table[k1]>>15))*EvaRegs.T1PR>>15;
	else CMP1 = (long)(16384+((long)13107*sin_table[k1-258]>>15))*EvaRegs.T1PR>>15;
	
	if( k2>258 && k2<=516 ) CMP2 = (long)(16384+((long)13107*sin_table[k2-258]>>15))*EvaRegs.T1PR>>15;
	else if( k2>516 && k2<=774 ) CMP2 = (long)(16384-((long)13107*sin_table[k2-516]>>15))*EvaRegs.T1PR>>15;
	else CMP2 = (long)(16384+((long)13107*sin_table[k2-774]>>15))*EvaRegs.T1PR>>15;
	
	if( k3<=258 ) CMP3 = (long)(16384-((long)13107*sin_table[k3]>>15))*EvaRegs.T1PR>>15;
	else if( k3>258 && k3<=516 ) CMP3 = (long)(16384+((long)13107*sin_table[k3-258]>>15))*EvaRegs.T1PR>>15;
	else CMP3 = (long)(16384-((long)13107*sin_table[k3-516]>>15))*EvaRegs.T1PR>>15;
	
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -