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模式 }
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(); //预处理 } } }
/******************************************************************************* * 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); }