Esempio n. 1
0
void start_configration(void)
{
	uint8_t sdadc_cali_flag=0;//SDADC配置成功与否标志,0-成功,1-INITRDY未置位,2-EOCAL未置位
	
	Init_flash();//初始化一些参数
		
	delay_init();//延时函数初始化,可以使用delay_ms(u16 nms),delay_us(u32 nus)
	NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	HT1621_Init();
	lcd_clr();
	lcd_full_test();
	Init_Keyboard_Interrupt();//内含TIM3-按键10ms检测中断、EXTI9_5-按键外部中断
	BUZZER_LED_Init();		//TIM4驱动
	uart_init(115200);//内含USART2与上位机通信串口中断9600
	delay_ms(500);
	sdadc_cali_flag=SDADC1_Config();//采样配置,内含DMA2-SDADC数据DMA中断
	TIM19_Config();//采样触发、采样频率配置
	TIM5_2_Compare_Capture_Init();//COMP比较器、定时器配置,用于基频捕获,内含TIM5比较器捕获中断
	DTA0660_Init();//内含Usart1-DTA0660通信串口中断,用于单片机与DTA通信
	TIM12_Config_1s();//1s定时器,内含TIM12-1s中断:秒表显示闪烁
	TIM14_Config_0_5s();//0.5s定时器,内含TIM14-0.5s中断:相序测量闪烁

	PowerControl_Init();
	
	DAC_Config();//新增DAC输出驱动钳头
	Dac1_Set_Vol(1800);
	
	TIM13_Config_1s_Standby();//内含1s中断,计数1800次为30min,进入Standby模式
	
	
}
Esempio n. 2
0
void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	uint8_t Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收寄存器满中断)
	{
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据 
		if(Res<=0x14 && Res >0)
		{
			Dac1_Set_Vol(R[Res - 0x01]); //设定DAC值;
		}
		else if(Res>0x20 && Res<=0x34)
		{
			Dac2_Set_Vol(R[Res - 0x21]); //设定DAC值;
		}
		else if (Res==0)
		{
			Dac1_Set_Vol(0); //关闭DAC1
		}
		else if (Res==0x20)
		{
			Dac2_Set_Vol(0); //关闭DAC2
		}
		
		/* 以下报文方法废弃,但保留下来 */
// 			switch (Res)
// 			{
// 				case 'M' :
// 					DacChannel = 1; //DAC1数据
// 					DacValue = 0;
// 					break;
// 				case 'N' :
// 					DacChannel = 2; //DAC2数据
// 					DacValue = 0;
// 					break;
// 				default: 	//处理数据组
// 					if(BitCounter < 4 ) //正在接收
// 					{
// 						DacStack[BitCounter] = Res;
// 						BitCounter++;	//下标自减
// 					}
// 					else
// 					{	//数据接收完成
// 						BitCounter = 0;
// 						DacValue = DacStack[0]<<12 + DacStack[1]<<8 + DacStack[2]<<4 + DacStack[3];
// 						switch (DacChannel) //判断通道几的数据
// 						{
// 							case 1 :
// 								Dac1_Set_Vol(DacValue); //设定DAC值
// 								break;
// 							case 2 :
// 								Dac2_Set_Vol(DacValue); //设定DAC值
// 								break;
// 							default:
// 								break;
// 						}
// 					}
// 					break;
// 			}
	}
	
	if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //发送中断(发送寄存器空中断)
	{
		if(loopCount < getDataLen()) //正在发送
		{
			send16B(SendData0, SendData1, loopCount);
			loopCount++;
		}
		else //发送完成
		{
			USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
			loopCount = 0;
			//DataStack0[StackCursor0] = getTIM2Period(); //低频测量方法
			DataStack0[StackCursor0] = getTIM2Frequency(); //高频测量方法
			SendData0 = pretreatment0(); //预处理
			//DataStack1[StackCursor1] = getTIM3Period();
			DataStack1[StackCursor1] = getTIM3Frequency(); //高频测量方法
			SendData1 = pretreatment1(); //预处理
		}
	}
	
} 
Esempio n. 3
0
/*******************************************************************************
* Function Name  : Command_service
* Description    : 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Communicate(void)
{
  int i,j,k;
	char    chardata[16];
	uint8_t Buf_temp[100];
  uint8_t Buf_temp_count;
  uint8_t tempQ=0;
  int8_t tempC=-1;
  int8_t tempT1=-1;
  int8_t tempT2=-1;
	uint16_t input_data=0;

  //char tempR[50],tempS[50],tempT[50],tempU[50],tempV[50],tempW[50];
  char Buf_temp2[50];
  char str[100+1]; // output string

   /***************************************************/
    //测试取数值函数功能
    //CMD_analyze_R(testchar);

  //获取 各种通讯端口的数据命令
  str[0]=0;
	 // 先取第一部分的命令码 放入Buf_temp,然后更新RxBuffer 
	 j=0;k=0;
	 for(i=0;i<=Rx2Counter;i++)
	 {
	   if((j==0)&&((Rx2Buffer[i]<0x20)||(Rx2Buffer[i]>0x7d)))
	   {k++;}
	   else
	   {
	     if((Rx2Buffer[i]==0x0a)||(Rx2Buffer[i]==0x0d)||(Rx2Buffer[i]==0))
	     {
	       Buf_temp[i-k]=0;
		   i++;
	       break;
	     }
	     else 
	     {
	       Buf_temp[i-k]=Rx2Buffer[i];
	     }
		 j=1;
	   }
	 }
	 Buf_temp_count=i-k;
	 j=0;k=0;
	 while(i<=Rx2Counter)
	 {
	     Rx2Buffer[j]=Rx2Buffer[i];
	     j++;i++;
	 }
	 Rx2Counter=Rx2Counter-Buf_temp_count;
	 i=0;j=0;
    while((((Rx2Buffer[0]<0x20)||(Rx2Buffer[0]>0x7d)))&&(Rx2Counter>0))
	{
	  for(i=0;i<Rx2Counter;i++)
	  {Rx2Buffer[i]=Rx2Buffer[i+1];}
	  Rx2Counter--;
	}

	 // 转小写
	 i=0;
	 j=Buf_temp_count;
	 while(j--)
	 {
	  Buf_temp[i]=tolower(Buf_temp[i]);
	  i++;
	 }
 

  // 将获取到的Buf_temp数据命令 进行命令解析
	// 指令按照 指令+冒号或者空格[+指令+冒号或者空格]+数据    方式进行解析。
  // 分析关键字成数字代码,第一命令tempC;第二命令tempT1;第三命令tempT2;参数tempR;询问标志tempQ;
	i=0;j=100;
	while(j--)
	{
	  if((Buf_temp[i]==':')||(Buf_temp[i]=='?')||(Buf_temp[i]==';')||(Buf_temp[i]==0x00))
	    break;
	  Buf_temp2[i]=Buf_temp[i];
	  i++;
	}
	Buf_temp2[i]='\0';
	tempC=findCMD(Buf_temp2);//获取到第一个指令。
 
	if(Buf_temp[i]==':')
	{
	  j=0;i++;k=100;
	  while(k--)
	  {
	    if((Buf_temp[i]==':')||(Buf_temp[i]=='?')||(Buf_temp[i]==';')||(Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
	    break;
	    Buf_temp2[j]=Buf_temp[i];
	    i++;j++;
	  }
	  Buf_temp2[j]='\0';
		if(Buf_temp2[0]<0x40)//如果是参数数值
		{
			//终结 空格后 取参数
       strcpy(tempR,Buf_temp2);
			 //CMD_analyze_R(Buf_temp2);
			 tempT1=-3;
		}
		else//若为指令,获取对应的指令
		{
			tempT1=findCMD2(Buf_temp2);
		}
	  
	  if(Buf_temp[i]==':') 
	  {
	    // 判读tempT2
			j=0;i++;k=100;
	    while(k--)
	    {
	      if((Buf_temp[i]==':')||(Buf_temp[i]=='?')||(Buf_temp[i]==';')||(Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
	        break;
	      Buf_temp2[j]=Buf_temp[i];
	      i++;j++;
	    }
	    Buf_temp2[j]='\0';
	    tempT2=findCMD2(Buf_temp2);
			if(Buf_temp[i]==':')
			{
				// 第3个冒号,错误
				//sys_info.Update_DSC_IP=FALSE;
			}
			else
			{
				if(Buf_temp[i]==0x20)
				{
					// 空格后 取参数
					j=0;i++;
					while(1)
						{
							if(Buf_temp[i]==0x00)
								break;
							tempR[j]=Buf_temp[i];
							i++;j++;
						}
					tempR[j]='\0';
				}
				else
				{
					if(Buf_temp[i]=='?')
				{tempQ=1;}
							tempR[0]='\0';
				}
			}
	  }
	  else
	  {
			if(((tempC==4)||(tempC==5))&&(tempT1==-3))//若out指令时数值在单位符号之前则提取单位判断档位
			 {
					 j=0;i++;k=100;
					while(k--)
					 {
						 if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
								break;
							tempS[j]=Buf_temp[i];                 //第1个参数数值
							i++;j++;
					 }
					 tempS[j]='\0';
				 tempT1=findCMD2(tempS);//获取tempT1 确定工作档位
			 }
	    else if(Buf_temp[i]==0x20)
      {
        //终结 空格后 取参数
        j=0;i++;k=100;
        while(k--)
         {
           if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
              break;
            tempR[j]=Buf_temp[i];                 //第1个参数数值
            i++;j++;
         }
         tempR[j]='\0';
         if(Buf_temp[i]==0x20)
         {
            //终结 空格后 取参数
            j=0;i++;k=100; 
             while(k--)
             {
               if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
                  break;
                tempS[j]=Buf_temp[i];              //第2个参数数值
                i++;j++;
             }
             tempS[j]='\0';
              if(Buf_temp[i]==0x20)
               {
                  //终结 空格后 取参数
                  j=0;i++;k=100; 
                   while(k--)
                   {
                     if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
                        break;
                      tempT[j]=Buf_temp[i];              //第3个参数数值
                      i++;j++;
                   }
                   tempT[j]='\0'; 
                    if(Buf_temp[i]==0x20)
                     {
                        //终结 空格后 取参数
                        j=0;i++;k=100; 
                         while(k--)
                         {
                           if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
                              break;
                            tempU[j]=Buf_temp[i];          //第4个参数数值
                            i++;j++;
                         }
                         tempU[j]='\0';
                          if(Buf_temp[i]==0x20)
                           {
                              //终结 空格后 取参数
                              j=0;i++;k=100; 
                               while(k--)
                               {
                                 if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
                                    break;
                                  tempV[j]=Buf_temp[i];      //第5个参数数值
                                  i++;j++;
                               }
                               tempV[j]='\0';
                                if(Buf_temp[i]==0x20)
                                 {
                                    //终结 空格后 取参数
                                    j=0;i++;k=100; 
                                     while(k--)
                                     {
                                       if((Buf_temp[i]==0x00)||(Buf_temp[i]==0x20))
                                          break;
                                        tempW[j]=Buf_temp[i]; //第6个参数数值
                                        i++;j++;
                                     }
                                    tempW[j]='\0';    
                                 }
                                  
                           }
                            
                     }
                     
               }
               
         }              
        tempT2=-1;
      }
      else
      {
        if(Buf_temp[i]=='?')
           {tempQ=1;}
          tempR[0]='\0';
      }
      tempT2=-1;
	  }
	}
	else
	{
	  if(Buf_temp[i]=='?')
	  {tempQ=1;}
	  tempT1=-1;
	  tempT2=-1;
	  tempR[0]='\0';
	}

   // 将分析完成的命令对应码进行命令执行
   // 判断第一段关键字的命令
  switch (tempC)
	{
		case 0: //-----------------------------------------------------查询 *IDN? 命令处理
		case 1:
		{
      //Uart_send_string("VA701 industrial process calibrator\r\n");
			//V&A,VAT810,8001,V1.01
			//V&A,VA701,8001,V1.0
      //strcat(str,"V&A,VA702,8001,V1.0");
			strcat(str,SaveData.Value.VAfact); 	strcat(str,",");
			strcat(str,SaveData.Value.VAmodel); strcat(str,",");
			strcat(str,SaveData.Value.VAsn); 		strcat(str,",");
			strcat(str,SaveData.Value.VAver);
			
			
      break;
		}
		
		case 8://read
		case 9://调试,读取电流1024个数据。
		{
			switch(tempT1)
			{
				case -1:
				{
					for(i=0;i<1024;i++)
					{				
						printf("%.4f\r\n",(float)(SDADC2_value[i]));
					}
					break;
				}
				case 63://SDADC1
				{
					for(i=0;i<1024;i++)
					{				
						printf("%.4f\r\n",(float)(SDADC1_value[i]));
					}
					break;
				}
					//SaveData.Value.cal_A_a1=0.000640519;
					//SaveData.Value.cal_A_t1=1484.56402;
					//SaveData.Value.cal_A_y0=64.17008;
				case 60://				"a1"//60
				{
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_a1);
					strcat(str,chardata);
					break;
				}
				case 61://					"t1"//61
				{
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_t1);
					strcat(str,chardata);
					break;
				}
				case 62://					"y0"//62
				{
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_y0);
					strcat(str,chardata);
					break;
				}
				default:	break;	
			}
			break;
		}
		
		case 12:
		case 13://cal
		{
			switch(tempT1)
			{
				case -1:
				{
					
					break;
				}	
				case 60://				"a1"//60
				{
					CMD_analyze_R(tempR);
					SaveData.Value.cal_A_a1=tp.numb_f[0];
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_a1);
					strcat(str,chardata);
					updata_flash();
					break;
				}
				case 61://					"t1"//61
				{
					CMD_analyze_R(tempR);
					SaveData.Value.cal_A_t1=tp.numb_f[0];
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_t1);
					strcat(str,chardata);
					updata_flash();
					break;
				}
				case 62://					"y0"//62
				{
					CMD_analyze_R(tempR);
					SaveData.Value.cal_A_y0=tp.numb_f[0];
					sprintf(chardata, " %.10f", SaveData.Value.cal_A_y0);
					strcat(str,chardata);
					updata_flash();
					break;
				}
				case 64://6 zero
				{
//					if(rangenum == 0)
//					{
//						SaveData.Value.cal_6VA_zero=voltage_effective*10;
//						sprintf(chardata, "set 6VA_zero %.4f", SaveData.Value.cal_6VA_zero);
//						strcat(str,chardata);
//						updata_flash();
//					}
						Sysflag.Calonce	=1;
					break;
				}
				case 65://6 gain
				{
//					if(rangenum == 0)
//					{
//						SaveData.Value.cal_6VA_gain=5.0/(voltage_effective*10-SaveData.Value.cal_6VA_zero);
//						sprintf(chardata, "set 6VA_gain %.4f", SaveData.Value.cal_6VA_gain);
//						strcat(str,chardata);
//						updata_flash();
//					}
						Sysflag.Calonce	=1;
					break;
				}	
				case 66://60 zero
				{
//					if(rangenum == 1)
//					{
//						SaveData.Value.cal_60VA_zero=voltage_effective*10;
//						sprintf(chardata, "set 60VA_zero %.4f", SaveData.Value.cal_60VA_zero);
//						strcat(str,chardata);
//						updata_flash();
//					}
						Sysflag.Calonce	=1;		
					break;
				}
				case 67://60 gain
				{
//					if(rangenum == 1)
//					{
//						SaveData.Value.cal_60VA_gain=5.0/(voltage_effective*10-SaveData.Value.cal_60VA_zero);
//						sprintf(chardata, "set 60VA_gain %.4f", SaveData.Value.cal_60VA_gain);
//						strcat(str,chardata);
//						updata_flash();
//					}
						Sysflag.Calonce	=1;
					break;
				}	
				case 68://600 zero
				{
					if(rangenum == 2)
					{
						SaveData.Value.cal_600VA_zero=voltage_effective*10;
						sprintf(chardata, "set 600VA_zero %.4f", SaveData.Value.cal_600VA_zero);
						strcat(str,chardata);
						updata_flash();
					}
							
					break;
				}
				case 69://600 gain
				{
					if(rangenum == 2)
					{
						SaveData.Value.cal_600VA_gain=5.0/(voltage_effective*10-SaveData.Value.cal_600VA_zero);
						sprintf(chardata, "set 600VA_gain %.4f", SaveData.Value.cal_600VA_gain);
						strcat(str,chardata);
						updata_flash();
					}
					break;
				}	
				case 70://6D zero
				{
					Sysflag.Calonce	=1;
					break;
				}
				case 71://6D gain
				{					
					Sysflag.Calonce	=1;
					break;
				}	
				case 72://60D zero
				{
					Sysflag.Calonce	=1;
					break;
				}
				case 73://60D gain
				{					
					Sysflag.Calonce	=1;
					break;
				}	
				case 74://600D zero
				{
					Sysflag.Calonce	=1;
					break;
				}
				case 75://600D gain
				{					
					Sysflag.Calonce	=1;
					break;
				}	
				
//			"cal_a_err",			//76 在对应电流A处校正偏差值 cal_A_errN    
//			"cal_a_zero",			//77  在对应电流处校正零点偏差值	
//			"cal_a_gain",			//78	在某个较大电流时校准线性段的增益
//			"cal1800a",				//79	设置在DC1800A处的电压值为大电流校准电压起始点
//			"cal_adjv",				//80
				case 76: //76 在对应电流A处校正偏差值 cal_A_errN   
				{
					
					break;
				}
				case 77: //77  在对应电流处校正零点偏差值	
				{									
					CMD_analyze_R(tempR); 
					input_data=tp.numb_f[0];
					if((input_data>0)&&(input_data<1200))
					{				
						//SaveData.Value.cal_A_zero+=((input_data-SysValue.curr_now)/SaveData.Value.cal_A_gain);	
						SaveData.Value.cal_A1_zero=SysValue.curr_now/SaveData.Value.cal_A1_gain+SaveData.Value.cal_A1_zero;
						//SaveData.Value.cal_A1_zero=((input_data-SysValue.curr_now)/SaveData.Value.cal_A1_gain);
						updata_flash();
						strcat(str,"cal curr zero");
					}
									
					break;
				}
				case 78: //78	在某个较大电流时校准线性段的增益
				{
					CMD_analyze_R(tempR);
					input_data=tp.numb_f[0];
					if((input_data>1200)&&(input_data<1900))
					{			
						//SaveData.Value.cal_A_zero+=(SysValue.curr_now-input_data)/SaveData.Value.cal_A_gain;	
						SaveData.Value.cal_A1_gain=input_data/(SysValue.curr_now/SaveData.Value.cal_A1_gain);
						updata_flash();
						strcat(str,"cal curr gain");
					}			
					break;
				}
				case 79: //79 设置在DC1800A处的电压值为大电流校准电压起始点
				{
					
					
					break;
				}
				case 80://是否启用调整
				{
					char *ttpp;
					CMD_analyze_R(tempR);
					SaveData.Value.cal_adjv=tp.numb_f[0];
					updata_flash();
					strcat(str,"cal adjv:");
					strcat(str,tempR);
					break;
				}
				
				case 81://"daout",								//81 设置DAC输出电压
				{
					char *ttpp;
					CMD_analyze_R(tempR);					
					
					Dac1_Set_Vol(tp.numb_f[0]);
					strcat(str,"daout:");
					strcat(str,tempR);
					break;
				}
				
				default:break;
			}
			break;	
		}
		
		case 18:
		case 19://factory fact  生产 型号序列号提供商 软体版本 的修改
		{	
			//		"fact",			"model",//52生产工厂 53型号  
			//		"sn",				"ver",//54序列号  55版本号  
			switch(tempT1)
			{
				case 50:
				{//初始化Flash中保存的参数,防止由于以外出错用户无法恢复。
					if(tempR[0]==0x31) //指令格式   fact:initialflash 1
					{
						Default_flash();
						strcat(str,"Write default value to flash, This Machine need calibration to use.\r\n");
					}			
					break;
				}
				case 52://fact
				{
					for(i=0;i<30;i++)
					{
						if((tempR[i]>96)&&(tempR[i]<123))//转为数值
						SaveData.Value.VAfact[i]=tempR[i]-32;
						else
						SaveData.Value.VAfact[i]=tempR[i];
					}
					updata_flash();
					strcat(str,"write fact ok!");
					break;
				}
				case 53://model
				{
					for(i=0;i<30;i++)
					{
						if((tempR[i]>96)&&(tempR[i]<123))
						SaveData.Value.VAmodel[i]=tempR[i]-32;
						else
						SaveData.Value.VAmodel[i]=tempR[i];
					}
					updata_flash();
					strcat(str,"write model ok!");
					break;
				}
				case 54://sn
				{
					for(i=0;i<30;i++)
					{
						if((tempR[i]>96)&&(tempR[i]<123))
						SaveData.Value.VAsn[i]=tempR[i]-32;
						else
						SaveData.Value.VAsn[i]=tempR[i];
					}
					updata_flash();
					strcat(str,"write sn ok!");
					break;
				}
				case 55://ver
				{
					for(i=0;i<30;i++)
					{
						if((tempR[i]>96)&&(tempR[i]<123))
						SaveData.Value.VAver[i]=tempR[i]-32;
						else
						SaveData.Value.VAver[i]=tempR[i];
					}
					updata_flash();
					strcat(str,"write ver ok!");
					break;			
				}
				
				default:break;
			}
			break;
		}
		case 24://24  大电流曲线校准  ex:  cala:1800  cala:2400
		{
			//			//大电流校准6个点
			//			float CalA_point[8]={1600,1800,2000,2200,2400,2600,2800,3000};
			//			//对应电流校准点下的电流测量值
			//			float CalA_data[8] ={0,0,0,0,0,0,0,0};
			//			//按照当前参数计算出来的各点校准结果
			//			float CalA_temp[8] ={0,0,0,0,0,0,0,0};
			CMD_analyze_R(tempR);//输入的参数必须为CalA_point 指定的点。
			i=(uint32_t)tp.numb_f[0];
			//			switch(i)
			//			{
			//				case 1800: CalA_data[(i-1600)/200]=0;
			//					
			//			}
			CalA_data[(i-1600)/200]=SysValue.curr_now;
			sprintf(chardata, "Set CalA_data[%d]= %.4f",((i-1600)/200),SysValue.curr_now);
			strcat(str,chardata);		
			break;
		}
				
		default:break;

	}
  strcat(str,"\r\n");
  printf(str);  
}