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

📄 text22.c

📁 上海交通大学科技创新实验5代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    case 52: prop_float=211;break; /* '2' */
    case 53: prop_float=218;break; /* '3' */
    case 54: prop_float=226;break; /* '4' */
    case 55: prop_float=232;break; /* '5'and's' */
    case 56: prop_float=240;break; /* '6' */
    case 57: prop_float=247;break; /* '7' */
    case 58: prop_float=254;break; /* '8' */
    case 59: prop_float=262;break; /* '9' */
    case 60: prop_float=269;break; /* '0' */
    case 61: prop_float=276;break; /* '1'and'i' */
    case 62: prop_float=283;break; /* '2' */
    case 63: prop_float=291;break; /* '3' */
    case 64: prop_float=298;break; /* '4' */
    case 65: prop_float=305;break; /* '5'and's' */
    case 66: prop_float=313;break; /* '6' */
    case 67: prop_float=320;break; /* '7' */
    case 68: prop_float=328;break; /* '8' */
    case 69: prop_float=335;break; /* '9' */
	case 70: prop_float=343;break; /* '0' */
    case 71: prop_float=351;break; /* '1'and'i' */
    case 72: prop_float=358;break; /* '2' */
    case 73: prop_float=366;break; /* '3' */
    case 74: prop_float=374;break; /* '4' */
    case 75: prop_float=382;break; /* '5'and's' */
    case 76: prop_float=391;break; /* '6' */
    case 77: prop_float=399;break; /* '7' */
    case 78: prop_float=407;break; /* '8' */
    case 79: prop_float=416;break; /* '9' */
	case 80: prop_float=425;break; /* '0' */
    case 81: prop_float=433;break; /* '1'and'i' */
    case 82: prop_float=442;break; /* '2' */
    case 83: prop_float=451;break; /* '3' */
    case 84: prop_float=461;break; /* '4' */
    case 85: prop_float=471;break; /* '5'and's' */
    case 86: prop_float=481;break; /* '6' */
    case 87: prop_float=492;break; /* '7' */
    case 88: prop_float=502;break; /* '8' */
    case 89: prop_float=514;break; /* '9' */
	case 90: prop_float=525;break; /* '0' */
    case 91: prop_float=537;break; /* '1'and'i' */
    case 92: prop_float=550;break; /* '2' */
    case 93: prop_float=564;break; /* '3' */
    case 94: prop_float=579;break; /* '4' */
    case 95: prop_float=595;break; /* '5'and's' */
    case 96: prop_float=612;break; /* '6' */
    case 97: prop_float=633;break; /* '7' */
    case 98: prop_float=655;break; /* '8' */
    case 99: prop_float=687;break; /* '9' */
	case 100: prop_float=735;break; /* '0' */
      
    default: prop_float=196;
  }



	prop_int=prop_float+0.5;
	EA=1;





}

/*自动拟合模块,调整coe[]的值*/
void Adjust()
{
	EA=0;
	coe_pv[0]=7.22286*adjust_Prop[1]-12.1976*adjust_Prop[2]+5.97479*adjust_Prop[3];
	coe_pv[1]=-0.166667*adjust_Prop[1]+0.352941*adjust_Prop[2]-0.186275*adjust_Prop[3];
	coe_pv[2]=0.0952381*adjust_Prop[1]-0.235294*adjust_Prop[2]+0.140056*adjust_Prop[3];

	adjust_count=1;
	adjust_Prop[1]=327;
	adjust_Prop[2]=429;
	adjust_Prop[3]=504;
	EA=1;
}

/*闭环控制模块*/
void CLC_func()
{
	 if(AD_flag)			/*处理AD转换的任务*/
	 {
		ADDR_0804 = 0 ;  	/* 启动一次AD转换*/
				
		if (AD_ptr >= AD_SMPL_NUM )	/*计算平均值*/
		{				
			AD_ptr = 0;
			AD_value = 0;
			for(i=0;i<AD_SMPL_NUM;i++)
			{
				AD_value += AD_data[i];
			}
			AD_value = AD_value/AD_SMPL_NUM;								
		}		
		AD_flag=0;
	}	
			
	if(DelayCounter>CLC_DELAY)		/*延时一定时间之后调整占空比*/
	{		  
		AD_require=ad_change(volt);
			
		DelayCounter=0;		/*重置延时计数器*/
		AD_ptr=0;
	     
		/*闭环占空比调整部分*/
		AD_temp= AD_value-AD_require;
		if( (AD_temp) >0)		/*AD_value大了,电压低了,Prop应增加*/
		{/*分段调整,根据差值的大小动态改变占空比,实现1秒之内的调整速度*/
			if((AD_temp)>35)	 
			{
				prop_int+=25;
				prop_float=prop_int;
			}
			else if((AD_temp)>10)
			{
				prop_int+=10;
				prop_float=prop_int;
			}	
			else
			{
				prop_int++;
				prop_float=prop_int;
			}				
			change_flag=1;
			if (setting_flag)
			{
				refresh_flag=1;
			}
		}
		else if(AD_temp<-0)
		{
			if(AD_temp<-35)
			{
				prop_int-=25;
				prop_float=prop_int;
			}
			else if(AD_temp<-10)
			{
				prop_int-=10;
				prop_float=prop_int;
			}	
			else
			{
				prop_int--;
				prop_float=prop_int;
			}	
			change_flag=1;
			if (setting_flag)
			{
				refresh_flag=1;
			}
		} 
	}			
}
/***************
    主程序
***************/
main()
{
	/* 单片机系统初始化 */
    P1=0XFF;
    P3=0XFF;
    /* 中断工作寄存器初始化 */	 
	PT0=0;
    IE=0X80;
    IP=0;
	PT1=1;
    IT0=0;
    IT1=0;
    /* 定时器工作寄存器初始化 */
	TMOD=0X11;
	TH1=(65536-11059200/12/2)/256; 
    TL1=(65536-11059200/12/2)%256;
    TH0=V_TH0;
    TL0=V_TL0;
     /* 串行通信口工作初始化 ,注:本例中虽未使用到串行通信口,但本段程序无妨保留 */
	SM0=0;		 /*SCOM MODE 1 (8BIT UART VARBR)*/
    SM1=1;
	SM2=0;
	REN=1;
	TI=1;
    /* 全局变量赋初值 */
    /*数码管扫描*/
	digi_scaner=1;	
    /*以下按键消抖变量清零*/
	key1_flag=0;	
	key2_flag=0;
	key3_flag=0;
	key4_flag=0;
	key1_count=0;
	key2_count=0;
	key3_count=0;
	key4_count=0;
	cur_sample1=0;
	pre_sample1=0;
	cur_sample2=0;
	pre_sample2=0;
	cur_sample3=0;
	pre_sample3=0;
	cur_sample4=0;
	pre_sample4=0;
    /*输出置零*/
	PWM_OUT=0;	
	/*状态标志初值*/
	refresh_flag=1;
	setting_flag=0;
	change_flag=1;
    /*任务变量赋初值,默认输出频率为400Hz,占空比32.4%,电压5.0V*/
	volt=50;
	prop_int=310;
	prop_float=prop_int;
	/*pv多项式系数赋初值*/
    coe_pv[0]=134.98438;
	coe_pv[1]=3.20414;
	coe_pv[2]=0.00664; 
	/*自动拟合*/
	adjust_count=1;
	adjust_Prop[1]=327; //v=5.4
	adjust_Prop[2]=429; //v=7.9
	adjust_Prop[3]=504; //v=9.6
    /*ADC变量赋初值*/
	AD_flag =1;
	AD_ptr=0;
	AD_value=1;	
	AD_require=241;		                  
    /*开/闭环控制变量赋初值*/
	CLC_flag=0;
	DelayCounter=0;
    /** 开定时器,定时器中断允许 **/
   	TR0=1;
   	TR1=1;
	ET0=1;
	ET1=1;
     /******************************************
                     主循环模块
      在T0、T1中断服务程序未被执行的空余时间里,
      处理机在以下程序中不断循环 
    *******************************************/
	while(1)
	{		 
     	/************************
	           按键服务子模块
	    **************************/
		if(key4_flag) 
		/*按键四:可以进入不同状态,setting_falg==0为OPEN/CLOSE,称非设置状态
		         1,2,3称设置状态,1为电压,2为占空比,3为自动拟合按键服务*/
		{		         
			if( (++setting_flag)>3 )
			{
				setting_flag=0;
			}

			refresh_flag=1;
			key4_flag=0;
		}
		if(key3_flag)  
		{			
			if(setting_flag==0) 
			/*按键三:0为开环、闭环控制切换*/
			{
				CLC_flag=!CLC_flag;	
			}
			else if(setting_flag==3)
			/*按键三:3为自动拟合流程控制*/
			{
				if( (++adjust_count)>ADJUST_NUM )
				{
					Adjust();
				}
			}

			key3_flag = 0;
			refresh_flag=1;
		}
		if(key1_flag)			
		{
			/*在设置状态下,1号按键的作用是增加*/
			if(setting_flag==1)
			{
				if(volt<100) 
				{
					volt+=1;
				}
				/*电压调整后计算占空比*/
				Calc_Prop(volt);
			}
			else if(setting_flag==2)
			{
				if(prop_int<1000) 
				{
					prop_int+=1;
				    prop_float=prop_int;
				}
			}
			else if(setting_flag==3)
			{
			 	if(adjust_Prop[adjust_count]<1000)
				{
				 	adjust_Prop[adjust_count]+=1;
				}
			}
			refresh_flag=1;
			change_flag=1;
			key1_flag=0;
		}	 
		if(key2_flag)
		{
			/*在设置状态下,2号按键的作用是减少*/
			if(setting_flag==1)
			{
				if(volt>50) 
				{
					volt-=1;
				}
				/*电压调整后计算占空比*/
				Calc_Prop(volt);			
			}	
			else if(setting_flag==2)
			{
				if(prop_int>0) 
				{
					prop_int-=1;
					prop_float=prop_int;
				}
			}
			else if(setting_flag==3)
			{
			 	if(adjust_Prop[adjust_count]>0)
				{
				 	adjust_Prop[adjust_count]-=1;
				}
			}
			refresh_flag=1;
			change_flag=1;
			key2_flag=0;
		}
		/**********************************************
			     CLC_flag=1启动闭环控制
		***********************************************/
		if(CLC_flag)			
		{
			CLC_func();
		}	 
		/*************************************
		 子模块:T1初值的计算,辅助<PWM信号发生>
		**************************************/
		if(change_flag)		
		{	
  		EA=0;	
		hilv_time = 65536-(TOTAL_TIME*prop_float/1000); //"/1000"是因为prop_float的单位是千分之一
		lolv_time = 65536-(TOTAL_TIME-(65536-hilv_time));
		hilv_th = hilv_time/256;
		hilv_tl = hilv_time%256;
		lolv_th = lolv_time/256;
		lolv_tl = lolv_time%256;
		change_flag=0;	
		EA=1;
		}
		/*******************************
		        数码管显示刷新子模块
		********************************/
		if(refresh_flag)		
		{
			EA=0;
			/*刷新:setting_flag==0为OPEN/CLOSE,1为电压,2为占空比,3为自动拟合按键服务*/
			if(!setting_flag)
			{					
				if(!CLC_flag) //OPEN
				{
					digi[0] = 0;
					digi[1] = 30;
					digi[2] = 14;
					digi[3] = 26;
				}
				if(CLC_flag)
				{
					digi[0] = 12;
					digi[1] = 1;
					digi[2] = 5;
					digi[3] = 13;
				}	
			}
			else if(setting_flag==1)
			{	
				digi[0] = 29;
				digi[1] = volt/100;  
				digi[2] = volt/10%10+16;
				digi[3] = volt%10;
			
			}
			else if(setting_flag==2)
			{  
				digi[0] = 30;
				digi[1] = prop_int/100%10;
				digi[2] = prop_int/10%10+16;
				digi[3] = prop_int%10;
			}	  
			else if(setting_flag==3)
			{  
				digi[0] = 30;
				digi[1] = adjust_Prop[adjust_count]/100%10;
				digi[2] = adjust_Prop[adjust_count]/10%10+16;
				digi[3] = adjust_Prop[adjust_count]%10;
			}
			refresh_flag=0;	
			EA=1;
		}		
	}
}

⌨️ 快捷键说明

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