functions.c

来自「本人是刚刚毕业的学生」· C语言 代码 · 共 513 行 · 第 1/2 页

C
513 行
字号
	                   CHAR[1] = ' ';	
                       CHAR[2] = '0';			
                       CHAR[3] = 'm';			
                       CHAR[4] = 'S';				
                       CHAR[5] = ' ';
                       CHAR[6] = ' ';
                       CHAR[7] = ' ';	   				
	   			}
	   			break;
	           case 2:
	       case 3:
	  if ((a>=1)&&(a<10))
	            { num = (uint32)(a*1000);
	                CHAR[0] = (char)(num/1000 + 48);				
	                CHAR[1] = '.';	
                    CHAR[2] = (char)(num%1000/100 + 48);			
                    CHAR[3] = (char)(num%100/10 + 48);			
                    CHAR[4] = (char)(num%10/1 + 48);				
                    CHAR[5] = 'm';
                    CHAR[6] = 'V';
                    CHAR[7] = ' ';
	            }
	            else if ((a>=10)&&(a<100))
	            {   num = (uint32)(a*100);
	   	            CHAR[0] = (char)(num/1000 + 48);					
                    CHAR[1] = (char)(num%1000/100 + 48);			
                    CHAR[2] = '.';
                    CHAR[3] = (char)(num%100/10 + 48);			
                    CHAR[4] = (char)(num%10/1 + 48);				
                    CHAR[5] = 'm';
                    CHAR[6] = 'V';
                    CHAR[7] = ' ';
	            }
	            else if ((a>=100)&&(a<1000))
	            {num = (uint32)(a*10);
	   	            CHAR[0] = (char)(num/1000 + 48);				
                    CHAR[1] = (char)(num%1000/100 + 48);			
                    CHAR[2] = (char)(num%100/10 + 48);			
                    CHAR[3] = '.';	
                    CHAR[4] = (char)(num%10/1 + 48);				
                    CHAR[5] = 'm';
                    CHAR[6] = 'V';
                    CHAR[7] = ' ';
	            }
	            else if ((a>=1000)&&(a<10000))
	            { num = (uint32)(a*1);
	   	            CHAR[0] = ' ';
	   	            CHAR[1] = (char)(num/1000 + 48);				
	                CHAR[2] = '.';	
                    CHAR[3] = (char)(num%1000/100 + 48);			
                    CHAR[4] = (char)(num%100/10 + 48);			
                    CHAR[5] = (char)(num%10/1 + 48);				
              		CHAR[6] = 'V';
           			CHAR[7] = ' ';
	   			}
	   			else
	   			{   CHAR[0] = ' ';				
	                CHAR[1] = ' ';	
                    CHAR[2] = ' ';			
                    CHAR[3] = '0';			
                    CHAR[4] = 'V';				
                    CHAR[5] = ' ';
                    CHAR[6] = ' ';
                    CHAR[7] = ' ';	   				
	   			}
	   			break;
	   	}
	}
}
uint32 SignalType(uint16 *Array,uint32 LengthOfArray)
{   uint32 i; 
    uint32 TypeFlag = 0;
    uint32 SineUnknown = 0;
    uint32 Triangle = 0;
    uint32 Square = 0;
    uint32 FirstData;
    uint32 SecondData;
    MaxMinOfArray(Array,LengthOfArray);
     if (((Max - Min) <= 5) && ((Max || Min) <= 3))    /* 判断被测信号是否为直流信号 */
    {return (DC_Wave);                        /* 被测信号为直流信号         */
    }
    else
    {    for (i = 2; i < (uint32)(LengthOfArray * (AD_Clock / PointNumber / 11) / frequence); i++)
       {FirstData  = (*(Array + i - 1) - *(Array + i - 2)); 
           SecondData = (*(Array + i) - *(Array + i - 1)); 
        if ((FirstData > SecondData - 5) || (FirstData < SecondData + 5))             
{ TypeFlag++;          
if (((FirstData > 5) || (FirstData < -5)) &&                         ((SecondData > 5) || (SecondData < -5)))
              {Triangle++;             /* 被测信号斜率较大,为三角波信号   */
              }
              else
              {Square++;               /* 被测信号斜率接近于零,为方波信号 */
              }    
           }
           else
           {TypeFlag--; 
               if (FirstData > SecondData)
              {SineUnknown++;               /* 被测信号为未知信号 */
              }
              else
              {SineUnknown--;               /* 被测信号为正弦信号 */
              }
           }
        }
         if (TypeFlag > 0)
        { if (Triangle > Square)
           { return Triangular_Wave;
           }
           else
           { return Square_Wave;
           }
         }
        else
        {if ((SineUnknown >= 10) || (SineUnknown <= -10))
           {return Sine_Wave;
           }
           else
           {return Unknown_Wave;
           }
            }
    }
}
void ADInit(uint32 ADClock, uint32 PinNumber)
{switch (PinNumber)
    {case 27 :
        {PINSEL1 = PINSEL1 & (~(0x03 << 22)) | (0x01 << 22);   // P0.27连接到AD0.0
 ADCR = (1 << 0)|                                    //选择通道AD0.0
   ((Fpclk / ADClock - 1) << 8)|               //转换时钟最大为4.5MHz
    (0 << 16)|                                   //BURST=0,软件控制转换操作
    (0 << 17)|                                   //CLKS=0,使用11 clock转换
    (1 << 21)|                                   //PDN=1.正常工作方式
    (0 << 22)|                                   //TEST1:0=00,正常工作模式
    (0 << 24)|                                   //START=0,先不启动ADC转换
    (0 << 27);                                   //直接启动ADC转换时,此位无效
       break;
        }
        case 28 :
        {PINSEL1 = PINSEL1 & (~(0x03 << 24)) | (0x01 << 24);   // P0.28连接到AD0.1
	ADCR = (1 << 1)|                                    //选择通道AD0.1
         ((Fpclk / ADClock - 1) << 8)|               //转换时钟最大为4.5MHz
         (0 << 16)|                                   //BURST=0,软件控制转换操作
         (0 << 17)|                                   //CLKS=0,使用11 clock转换
         (1 << 21)|                                   //PDN=1.正常工作方式
         (0 << 22)|                                   //TEST1:0=00,正常工作模式
         (0 << 24)|                                 //START=0,先不启动ADC转换
         (0 << 27);                                //直接启动ADC转换时,此位无效
          break;
        }
        case 29 :
      {PINSEL1 = PINSEL1 & (~(0x03 << 22)) | (0x01 << 22);   // P0.29连接到AD0.0
	  ADCR = (1 << 2)|                                    //选择通道AD0.0
      ((Fpclk / ADClock - 1) << 8)|               //转换时钟最大为4.5MHz
      (0 << 16)|                                   //BURST=0,软件控制转换操作
      (0 << 17)|                                   //CLKS=0,使用11 clock转换
      (1 << 21)|                                   //PDN=1.正常工作方式
      (0 << 22)|                                   //TEST1:0=00,正常工作模式
      (0 << 24)|                                   //START=0,先不启动ADC转换
      (0 << 27);                                   //直接启动ADC转换时,此位无效
      break;
        }
        case 30 :
        {PINSEL1 = PINSEL1 & (~(0x03 << 28)) | (0x01 << 28);   // P0.30连接到AD0.3
	   ADCR = (1 << 3)|                                    //选择通道AD0.3
         ((Fpclk / ADClock - 1) << 8)|               //转换时钟最大为4.5MHz
         (0 << 16)|                                   //BURST=0,软件控制转换操作
         (0 << 17)|                                   //CLKS=0,使用11 clock转换
         (1 << 21)|                                   //PDN=1.正常工作方式
         (0 << 22)|                                   //TEST1:0=00,正常工作模式
         (0 << 24)|                                   //START=0,先不启动ADC转换
         (0 << 27);                                //直接启动ADC转换时,此位无效
         break;
        }
    }
}
uint32 AutoTimeBase(float FreqOfSignal)
{if (Auto_Flag == 1)
     {if (FreqOfSignal >= 25000)
        {return 50;                                   /* 时基设为10us  */
        }
        else if ((FreqOfSignal >= 12500) && (FreqOfSignal < 25000))
        { return 50;                                   /* 时基设为20us  */
        }
        else if ((FreqOfSignal >= 5000) && (FreqOfSignal < 12500))
        { return 50;                                   /* 时基设为50us  */
        }
        else if ((FreqOfSignal >= 2500) && (FreqOfSignal < 5000))
        { return 50;                                  /* 时基设为100us */
        }
        else if ((FreqOfSignal >= 1250) && (FreqOfSignal < 2500))
        { return 50;                                  /* 时基设为200us */
        }
        else
        { return 50;                                  /* 时基设为500us */
        }
     }
     else
     { return 50;
     }
}float ChangeRange(float ab)
{float PI = 3.14159;
     if (ab >= 0)
     { ab -= (int32)(ab / (2 * PI)) * (2 * PI); 
     }
     else
     { ab += (-(int32)(ab / (2 * PI)) + 1) * (2 * PI);
     }
      if ((ab > PI / 2) && (ab <= PI * 3 / 2))
     { ab = PI - ab;
     }
     else if ((ab > PI * 3 / 2) && (ab <= 2 * PI))
     { ab -= PI * 2;
     }
     else
     { ab = ab;
     }
      ab = ab - (ab * ab * ab / 6) + (ab * ab * ab * ab * ab / 120);     
     return ab;
}
void SineInsert(INT16U *ShuZu, uint32 length)
{    uint32 i = 0;
     uint32 j = 0;
     uint32 Start = 0;
     uint32 m = 0;
     uint32 M = 0;
     
     float k = 0;
     float temp = 0;
     float PI = 3.141592;
     
    { if (frequence < 50000)
        { k = 10 - ((uint32)frequence) / 500 * 0.1;
        }
        else if (frequence < 75000)
        { k = 8 - (uint32)(frequence - 50000) / 1000 * 0.32;
        }
        else if (frequence < 100000)
        { k = 4;
        }
        else
        { k = 0.1;
        }
     }
      for (j = 0; j < PointNumber; j++)
     {    a = 0;
         for (i = 0; i < length; i++)
         {temp = (PI * 1000000 / 50) * ((j + 160) / (10 * (float)frequence) - i * 50.0 / 1000000);
            if (temp == 0)
             { a += (int32)(*(ShuZu + i));
             }
             else
             {a += (int32)(*(ShuZu + i)) * ChangeRange(temp) / temp;
             }             
         }
         ADData0[j] = (INT16U)a;
         }
}

⌨️ 快捷键说明

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