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

📄 main.c

📁 基于ARM的电压控制,且有两级调制,可以实现精确的电压输出
💻 C
📖 第 1 页 / 共 2 页
字号:
				y=DATA1[k];
			}
			else									//否则送修改参数
			{
				x=10;				//熄灭一行数码管
				if(k==R)							//如果当前显示位与键盘修改位相等,则根据闪烁标志送黑码。
				{
					if(SF==0)						
					y=10;
					else
					y=DATA0[k];
				}
				else
				y=DATA0[k];							//否则直接送显示数
			}
//__________________________________________________________________________________________________________
			w++;									//显示刷新计数器+1。
    		T0Flag=0;								//显示标志位清除。
			IOCLR = HC595_CS;			      			// 片选74HC595
			
//    		rcv_data = MSPI_SendData(digitable[x]);		// 发送显示数据  
//    		rcv_data = MSPI_SendData(digitable[y]);		// 发送显示数据

    		rcv_data = MSPI_SendData(digitable[y]);		// 发送显示数据  (修改的)
    		rcv_data = MSPI_SendData(digitable[x]);		// 发送显示数据
    		rcv_data = MSPI_SendData(selectable[k]);	// 发送显示位码
    		IOSET = HC595_CS;							//74HC595锁存数据
//__________________________________________________________________________________________________________

    		if((IO0PIN&KEY) != 0)				//键盘按键检测	!=0: 没按
			{
				if(TK==k)							//如果键盘记录位(TK) 与当前扫描位(K) 相等,执行键功能。
				{
					switch(TK)						//执行TK键盘号功能0~3。
					{
						case 0:						//0#功能为模式键M+1。
						{
							if(M==8)				// M=1 ,1个参数,只能修改一个参数 UO_def
							M=1;
							else
							M++;
							switch(M)				//取出1~4#参数送显示,以便人机对话修改参数。
							{
								case 1:
								{
									CONVBIT0(CS[0],0);
									CONVBIT0(M,4);
								}
								break;
								case 2:				//以下,在本程序中没用
								{
									CONVBIT0(CS[1],0);		
									CONVBIT0(M,4);
								}
								break;
								case 3:
								{
									CONVBIT0(CS[2],0);	////调基准电压Vref CS[2]
									CONVBIT0(M,4);
								}
								break;
								case 4:
								{
									CONVBIT0(CS[3],0);
									CONVBIT0(M,4);
								}
								break;
								case 5:
								{
									CONVBIT0(CS[4],0);
									CONVBIT0(M,4);
								}
								break;
								case 6:
								{
									CONVBIT0(CS[5],0);
									CONVBIT0(M,4);
								}
								break;
								case 7:
								{
									CONVBIT0(CS[6],0);
									CONVBIT0(M,4);
								}
								break;
								case 8:
								{
									CONVBIT0(CS[7],0);
									CONVBIT0(M,4);
								}
								break;
							}
						}
						break;
						
						case 1:						//1#功能为右移键标志位R+1。
						{
							if(R==3)
							R=0;
							else
							R++;
						}
						break;
						
						case 2:						//2#功能为加键,当前闪烁位+1。
						{
							if(DATA0[R]==9)
							DATA0[R]=0;
							else
							DATA0[R]++;
						}
						break;
						
						case 3:						//3#功能为回车确认键操作,将修改好的参数送回参数区。
						{
							while(!M==0)
							{
								//		R=0;				//R、M标志归零。
								//		M=0;
								switch(M)
								{
								//-------------------------------------------------------------
								case 1:				//M=1是修改 第1级 输出电压,要重算Duty
								{					
									CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000;   //把修改好的回送到CS[0]
																	//重新设置了 需要的 输出电压 Uo_def,要重新计算占空比
									Duty = (Uo_def * 10000 )/ Uin ;		//万份之几 的占空比( 扩大了10000倍的)
								}
								break;
								//-------------------------------------------------------------
								case 2:
								{}
								break; 
								//-------------------------------------------------------------
								case 3:	//vref
								{
									CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000;   //把修改好的回送到CS[0]
								}
								break;
								//-------------------------------------------------------------
								case 4:
								{}
								break;
								//-------------------------------------------------------------
								case 5:			//M=5是修改 第2级 输出电压,要重算Duty
								{
									CS[M-1]=DATA0[0]+DATA0[1]*10+DATA0[2]*100+DATA0[3]*1000;   //把修改好的回送到CS[4]
									if(CS[M-1]>6000)			//限制设置 第2级 最大输出电压为6V
									{	CS[M-1] = 6000;}
									
																	//重新设置了 需要的 输出电压 Uo_def,要重新计算占空比
									Duty2 = (Uo2_def * 10000 * 10) / ((3300 * 10) * 2) ;//万份之几 的占空比( 扩大了10000倍的)
								}
								break;
								//-------------------------------------------------------------
								case 6:
								{}
								break;
								//-------------------------------------------------------------
								case 7:
								{}
								break;
								//-------------------------------------------------------------
								case 8:
								{}
								break;								
								}
								
								R=0;				//R、M标志归零。
								M=0;
								
							}
						}
						break;
						
						case 4:						//4#功能为 换屏键
						{
							if(display==1)
							{
								display=2;
							}
							else
							{
								display=1;
							}
						}
						
					};
					TK=0x09;						//键记录位清除。
				}
			} 
				else if((IO0PIN&KEY) == 0)			//如果当前键盘位=0,则再读键盘、延时再读=0则记录键盘位TK=K。
				{ 
					delays();						//去抖
					if((IO0PIN&KEY) == 0) 
    				TK=k;
				}   
		if(k==7)									//如果键盘扫描计数器K=7,则清除K,否则K+1。
		k=0;
		else
		k++;		//下一个位码的标号 selectable[k]
        }
    }				// if1
   
   else    //else2
{

 if (Adj_Flag==4)		//到了调整的时间了  10ms 调整1次  (if11)
 {  Adj_Flag=0;	
 
 //===============进行 第1级 的参数调整计算====(START)============================================

  	ADC_Data = sum_data / adc_count;
 	sum_data = 0;
  	adc_count = 0;   	
//   	StartADC();		//启动AD
//   	Uo_test = ADC_Data * Vref / 1024 *5; 		//换算到的输出电压
   	Uo_test = (((ADC_Data * Vref) * 82) / 1024)/15;		// 1/10 的取样比  ,换算到的输出电压
   	if (Uo_test > Uo_def)
   	{	
   		dUo = Uo_test - Uo_def;
   		S_Flag = 0;					//误差为-,要减占空比
   	}
   	else
   	{	dUo = Uo_def - Uo_test ;
   		S_Flag = 1;					//误差为+
   	}
   	
 //  	dDuty = (dUo / Uin) * 10000;	//  不能这样写,因为前面除了以后是小于1的,系统取整后为0,要先做乘法
 		dDuty = ((dUo * 10000)/ Uin) ;	//万分之几的
//————————————————————————————————————————————————————————   	
   	if (S_Flag == 0)				//为0,减少D
   	{
//   		PWMMR3 = (((Uo_def / Uin)*10000 - dDuty) / 10000) * PWMMR0 ;
// 			PWMMR3 = (((((Uo_def*10000) / Uin) - dDuty) * PWMMR0) / 10000)  ;
//			Duty = Duty - dDuty ;
			if ((Duty - dDuty) < 0)			//限制下限
			{
				Duty = 0;
			}
			else
			{
				Duty = Duty - dDuty ;
			}
			
   			PWMMR3 = (Duty * PWMMR0) / 10000;

//   		PWMLER = 0x03;			// PWM1匹配锁存,写入新值,改变占空比

//   		PWMLER = 0x09;			// PWM3匹配锁存,写入新值,改变占空比

   	}
   	else							//为0,增加D
   	{
//   		PWMMR3 = (((Uo_def / Uin)*10000 + dDuty) / 10000) * PWMMR0 ;
//   		PWMLER = 0x03;			// PWM1匹配锁存,写入新值,改变占空比
//			Duty = (((((Uo_def*10000) / Uin) + dDuty) * PWMMR0) / 10000)  ;
			Duty = Duty + dDuty ;
			if (Duty > 10000)			//限制下限
			{
				Duty = 9999;
			}
   			PWMMR3 = (Duty * PWMMR0) / 10000; ;

 //  		PWMLER = 0x09;			// PWM3匹配锁存,写入新值,改变占空比

   	}
   	
 //===============进行 第1级 的参数调整计算==(END)==============================================
 
 //===============进行 第2级 的参数调整计算===(START)=============================================
 
  	ADC2_Data = sum2_data / adc2_count;
 	sum2_data = 0;
  	adc2_count = 0;   	
//   	StartADC();		//启动AD
//   	Uo_test = ADC_Data * Vref / 1024 *5; 		//换算到的输出电压
   	Uo2_test = (((ADC2_Data * Vref) * 16) / 1024)/5;		// 1/2 的取样比  ,换算到的输出电压
   	if (Uo2_test > Uo2_def)
   	{	
   		dUo2 = Uo2_test - Uo2_def;
   		S_Flag2 = 0;					//误差为-,要减占空比
   	}
   	else
   	{	dUo2 = Uo2_def - Uo2_test ;
   		S_Flag2 = 1;					//误差为+
   	}
   	
 //  	dDuty = (dUo / Uin) * 10000;	//  不能这样写,因为前面除了以后是小于1的,系统取整后为0,要先做乘法
 		dDuty2 = (dUo2 * 10000 * 10) /(((3300 * 10) * 16)/5) ;	//万分之几的
//————————————————————————————————————————————————————————   	
   	if (S_Flag2 == 0)				//为0,减少D
   	{
//   		PWMMR3 = (((Uo_def / Uin)*10000 - dDuty) / 10000) * PWMMR0 ;
// 			PWMMR3 = (((((Uo_def*10000) / Uin) - dDuty) * PWMMR0) / 10000)  ;
//			Duty = Duty - dDuty ;
			if ((Duty2 - dDuty2) < 10)			//限制下限
			{
				Duty2 = 10;
			}
			else
			{
				Duty2 = Duty2 - dDuty2 ;
			}
			
   			PWMMR1 = (Duty2 * PWMMR0) / 10000;

//   		PWMLER = 0x03;			// PWM1匹配锁存,写入新值,改变占空比

//   		PWMLER = 0x09;			// PWM3匹配锁存,写入新值,改变占空比

   	}
   	else							//为0,增加D
   	{
//   		PWMMR3 = (((Uo_def / Uin)*10000 + dDuty) / 10000) * PWMMR0 ;
//   		PWMLER = 0x03;			// PWM1匹配锁存,写入新值,改变占空比
//			Duty = (((((Uo_def*10000) / Uin) + dDuty) * PWMMR0) / 10000)  ;
			Duty2 = Duty2 + dDuty2 ;
			if (Duty2 > 9101)			//限制上限
			{
				Duty2 = 9100;			//最大输出6V  90.9%
			}
   			PWMMR1 = (Duty2 * PWMMR0) / 10000; ;

//   		PWMLER = 0x09;			// PWM3匹配锁存,写入新值,改变占空比

   	}
   	
 //===============进行 第2级 的参数调整计算==(END)==============================================

	PWMLER = 0x0B;			// PWM3, 1 匹配锁存,写入新值,改变占空比

  }//
  else 		//(else11)
  {
  	StartADC();		//启动AD 第1级 	
  	adc_count++;
	sum_data = sum_data + ADC_Data;
	
	StartADC2();		//启动AD 第2级  
	
  	adc2_count++;
	sum2_data = sum2_data + ADC2_Data;
		AD2SHOW =  ADC2_Data;		//ad  值送显

  }

}  //else2


}//jieshu
		
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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