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

📄 spwm.c

📁 这是一个控制交流电机的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		rxd_buffer[rxd_counter]=rxd;
		rxd_counter++;
	}
*/			
	PieCtrl.PIEACK.all|=PIEACK_GROUP9;
}


/*
void rxd_operate(void)
{
//	uchar checkout;
	if(rxd_counter!=rxd_NUM)return;		//不满一帧数据退出

	rxd_counter=0;						//一帧数据已满,数据指针清零
		
//	checkout=rxd_buffer[0]^rxd_buffer[1]^rxd_buffer[2]^rxd_buffer[3];	//计算校验数据
	
	if(rxd_buffer[0]==0xeb&&rxd_buffer[rxd_NUM-1]==0x90)	//判断数据是否正确		
	{	
//		txd_flag=0x55;
		if(rxd_buffer[1]==0x55)fr=rxd_buffer[2];	//正转
		if(rxd_buffer[1]==0xa5)fr=0;				//停止
	}
//	else
//	{	
//		error=0x55;	//数据错误,置错误标志
//	}
}
*/

/*********************************************************************************
**函数名称:Timer0
**功能描述:定时器0中断服务程序,0.02s中断一次
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
interrupt void Timer0(void)
{ 	
	//电机加速
	if(f < fr)
	{
		speed_up++;
		if(speed_up == speedup_times)
		{
			f++;
			speed_up = 0;
		}
	}
	//电机减速
	if((f > fr) && (f > 1))
	{
		speed_down++;
		if(speed_down == speeddown_times)
		{
			f--;
			speed_down = 0;
		}
	}
	AD_times++;
	if(AD_times == 10)
	{
		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;		//软件触发,启动SEQ1
		AD_times = 0;
	}
			
  	PieCtrl.PIEACK.all |= PIEACK_GROUP1;	//写1清除中断响应标志位
}


/*********************************************************************************
**函数名称:Delay(unsigned int n)
**功能描述:延迟子程序
**输入参数:n,控制延迟时间参数
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
void Delay(unsigned int n)
{ 
	unsigned int m=n;
	for(;m>0;m--);
}


/*****************************************************************************
**函数名称:Motor_operate()
**功能描述:2812从双口RAM中读取电机控制命令;
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*****************************************************************************/
void Motor_operate()
{
	unsigned int temp1,temp2,temp3;
	
	//设置数据方向从双口RAM到DSP2812
	read_RAM;					
	Delay(100);
	
	//读取电机启动标志,如果电机没有启动,退出
	temp1 = motor_run;
	temp1 = motor_run & 0x00ff;	
	if(temp1 != 0x0055)
	{	
		if(f <= 1)
		{
			motor_state = motor_stop;
			
			//点亮目前电机状态指示灯,停止
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 0;	//电机停止
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;	//电机反转
			GpioDataRegs.GPFDAT.bit.GPIOF0 = 1;	//电机正转
			
		}
		fr = 1;							
		return;
	}	
	
	//读取电机正反转命令
	temp2 = motor_control ;
	temp2 = motor_control & 0x00ff ;

	//读取设定的频率
	if(frequence_select == 0)
	{
		temp3 = frequence_enactment ;
		temp3 = frequence_enactment & 0x00ff ;
		
		GpioDataRegs.GPFDAT.bit.GPIOF8 = 0;	//键盘给定
		GpioDataRegs.GPFDAT.bit.GPIOF9 = 1;	//模拟给定
		
	}
	else if(frequence_select == 1)
	{			
		temp3 = (unsigned int)((ADCINA1_value / 2.5)*50);
		if(temp3 >= 50)temp3 = 50;
		
		GpioDataRegs.GPFDAT.bit.GPIOF8 = 1;	//键盘给定
		GpioDataRegs.GPFDAT.bit.GPIOF9 = 0;	//模拟给定
	}
										
	switch(motor_state) 
	{	
		//1.电机停止时改变电机运行状态,可以直接改变电机状态
		case motor_stop:			  
			switch(temp2)
			{
				case 1:	//电机正转
					motor_state = motor_forward;
					fr = temp3;
					
					//点亮目前电机状态指示灯,正转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 0;	//电机正转
	
					break;
				case 2:	//电机反转
					motor_state = motor_backward;
					fr = temp3;
					
					//点亮目前电机状态指示灯,反转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 1;	//电机正转
					
					break;
				default:break;
			}
			break;
		case motor_forward:	
			switch(temp2)
			{
				case 1:	//电机正转
					motor_state = motor_forward;
					fr = temp3;
					
					//点亮目前电机状态指示灯,正转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 0;	//电机正转
					
					break;
				case 2:	//电机反转
					motor_state = motor_forward;
					motor_flag = 0x02;
					
					//点亮目前电机状态指示灯,正转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 0;	//电机正转
					
					fr = 1;
					break;
				default:break;
			}
			break;
		case motor_backward:
			switch(temp2)
			{
				case 1:	//电机正转
					motor_state = motor_backward;
					motor_flag = 0x01;
					fr = 1;
					
					//点亮目前电机状态指示灯,反转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 1;	//电机正转
					
					break;
				case 2:	//电机反转
					motor_state = motor_backward;
					fr = temp3;
										
					//点亮目前电机状态指示灯,反转
					GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
					GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;	//电机反转
					GpioDataRegs.GPFDAT.bit.GPIOF0 = 1;	//电机正转
					
					break;
				default:break;
			}
			break;	
		default:break;
	}				
	//电机正转
	if(motor_flag == 0x01 && f == 1)
	{
		motor_state = motor_forward;
		fr = temp3;
		motor_flag = 0x00;
		
		//点亮目前电机状态指示灯,正转
		GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
		GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;	//电机反转
		GpioDataRegs.GPFDAT.bit.GPIOF0 = 0;	//电机正转
					
	} 
		
	//电机反转
	if(motor_flag == 0x02 && f == 1)
	{
		motor_state = motor_backward;
		fr = temp3;
		motor_flag = 0x00;
		
		//点亮目前电机状态指示灯,反转
		GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;	//电机停止
		GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;	//电机反转
		GpioDataRegs.GPFDAT.bit.GPIOF0 = 1;	//电机正转
					
	}
							
}

/******************************************************************************
**函数名称:Data_display()
**功能描述:异步控制方式,载波比N随着输出频率的增大而减少,并且使载波比N是3的倍数,
			保证三相输出的对称性
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
******************************************************************************/
void Data_display()
{
	write_RAM;				
	Delay(100);
	
	if(f <= 1)
	{
		motor_frequence_display = 0;
	}
	else
	{
		motor_frequence_display = f;	//将实时频率写入双口RAM中
	}
	
	motor_state_display = motor_state;
	
	BUS_voltage = ( unsigned int )( ( ADCINA0_value / 2.5 ) * 160 );
	
	current_A = 0;		//A相电流
	current_B = 0;		//B相电流
	BUS_current = 0;	//母线电流

	
}
	
	
/******************************************************************************
**函数名称:carrier_wave_ratio()
**功能描述:异步控制方式,载波比N随着输出频率的增大而减少,并且使载波比N是3的倍数,
			保证三相输出的对称性
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
******************************************************************************/
void carrier_wave_ratio(void)
{	
	//异步控制方式,载波频率不变
//	N = fc_max / f;
//	N = ( N / 3 ) * 3;	
//	fc = f * N;
//	Tpwm = 37500000 / fc;

	N = fc / f;
	Tpwm = 37500000 / fc;
    EvaRegs.T1PR = Tpwm / 2;
    EvaRegs.T1CON.bit.TENABLE = 1;			//启动EVA定时器1
}


/*********************************************************************************
**函数名称:parameter_select()
**功能描述:设定电机的运行参数,只有在电机停机时,包括调制方式、频率给定方式、
			加减速时间的设定
**输入参数:
**输出参数:
**全局变量:
**调用模块:
**说明:
**注意:
*********************************************************************************/
void parameter_select(void)
{	
	unsigned char temp;
	if((motor_state != motor_stop) || (motor_flag != 0x00))return;
	
	read_RAM;				//设置数据方向从双口RAM到DSP2812
	Delay(100);
	
	//选择调制方式
	temp = (unsigned char)(modulation & 0x00ff);	
	if(modulation_select != temp)
	{	
		modulation_select = temp;
		
		EvaRegs.T1CON.bit.TENABLE = 0;			//停止EVA定时器1	
 		EALLOW;
 		if(modulation_select == 0){PieVectTable.T1UFINT = &spwm;}
 		if(modulation_select == 1){PieVectTable.T1UFINT = &svpwm;}
 		EDIS;
 		EvaRegs.T1CON.bit.TENABLE = 1;			//启动EVA定时器1
 	}
 	
 	//选择频率给定方式
 	temp = (unsigned char)(f_select & 0x00ff);
 	frequence_select = temp; 
 	
 	//选择转矩提升曲线
 	temp = (unsigned char)(torque_lifting & 0x00ff);
 	if(temp == 1)m_sel = m1;
 	else if(temp == 2)m_sel = m2;
 		else m_sel = m3;
 		
 	//加减速时间设置
 	temp = (unsigned char)(speedup_time & 0x00ff);
 	speedup_times = temp;
 	temp = (unsigned char)(speeddown_time & 0x00ff);
 	speeddown_times = temp;
 	
}


interrupt void AD_convert(void)
{
	ADCINA0_value=( (float)AdcRegs.RESULT0 ) * 3.0 / 65520.0;
	ADCINA1_value=( (float)AdcRegs.RESULT1 ) * 3.0 / 65520.0;
	ADCINB0_value=( (float)AdcRegs.RESULT2 ) * 3.0 / 65520.0;
	ADCINB4_value=( (float)AdcRegs.RESULT3 ) * 3.0 / 65520.0;
		
	AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1;	//清除SEQ1的中断标志INT_SEQ1
	AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;			//排序器1复位
	
	PieCtrl.PIEACK.all |= PIEACK_GROUP1;
}






⌨️ 快捷键说明

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