示例#1
0
void temperature()   //电容器温度检测
{
 u16 adc_tmp1=0,adc_tmp2=0;
       adc_tmp1=Get_Adc_Average(ADC_Channel_5,10);
	  adc_tmp2=Get_Adc_Average(ADC_Channel_6,10);
	  tempshuzhi=(u8)(258-((adc_tmp1*255)/4096));

}
示例#2
0
void Avoid_Confict(void)
{
	infrared_data1 = Get_Adc_Average(0);  
	infrared_data2 = Get_Adc_Average(1);

	distance1 = -17.59*log(infrared_data1)+ 146.48;
	distance2 = -15.95*log(infrared_data2)+ 134.42;


	infrared_data3 = Get_Adc_Average(2);   //风扇机械臂红外数据

	fanheight = -15.95*log(infrared_data3)+ 134.42;                             //最佳离跑道高度15
		
	ave_distance = (distance1+distance2)/2.0 ;

	xielv = (distance1-distance2)/50.0;    //底盘机器人红外安装间距50mm

	if(ave_distance<25)
	{
		if(ave_distance<10)
		{
			Speed.vy = -20;

		}
		else if(ave_distance>15)
		{
				
			Speed.vy = 20;
		}
		else 
		{
			Speed.vy = 0;
		}
		
		if(xielv<0)
		{
			Speed.wz = -5;

		}
		else if(xielv>0)
		{
				
			Speed.wz = 5;
		}
		else 
		{
			Speed.wz = 0;
		}	
	}
	else
	{
		Speed.vy = 0;
		Speed.wz = 0;
		
	}	
}
示例#3
0
/*
摇杆数据采集
输入参数为美国手和日本手
*/
void GetAD(unsigned char RomoteMode)
{

  switch(RomoteMode)
  {
    /*以下为美国手的对应关系*/
 case America:
                
      Throttle=Throttle_Offest + 99- (100*Get_Adc_Average(3,15))/4096;//采集油门摇杆的位置,由于硬件原因,需要用100-采集值
      Throttle=(Throttle<=0)?0:Throttle;                 //越界判断
      Throttle=(Throttle>=99)?99:Throttle;               //越界判断

      Pitch=Pitch_Mid + Pitch_Offest + (100*Get_Adc_Average(1,15))/4096;//采集俯仰摇杆的位置,赋值给对应的俯仰变量
      Pitch=(Pitch<=0)?0:Pitch;                 //越界判断
      Pitch=(Pitch>=99)?99:Pitch;               //越界判断

      Roll=Roll_Mid + Roll_Offest + (100*Get_Adc_Average(0,15))/4096;//采集横滚摇杆位置,赋值给对应的横滚变量
      Roll=(Roll<=0)?0:Roll;                //越界判断
      Roll=(Roll>=99)?99:Roll;              //越界判断

      Yaw=Yaw_Mid + Yaw_Offest + (100*Get_Adc_Average(2,15))/4096;//采集横滚摇杆位置,赋值给对应的偏航角
      Yaw=(Yaw<=0)?0:Yaw;                //越界判断
      Yaw=(Yaw>=99)?99:Yaw;              //越界判断

//       Battery=(100*Get_Adc_Average(8,15))/2600;//采集遥控电池电压,赋值飞对应的电池变量
//       Battery=(Battery>=99)?99:Battery;               //越界判断
//    
          break;
    /*以下为日本手的对应关系*/
 case Japan:
      Throttle=Pitch_Mid + Throttle_Offest + (100*Get_Adc_Average(1,15))/4096;//采集油门摇杆的位置,由于硬件原因,需要用100-采集值
      Throttle=(Throttle<=0)?0:Throttle;                 //越界判断
      Throttle=(Throttle>=99)?99:Throttle;               //越界判断

      Pitch=Pitch_Mid + Pitch_Offest+ 99 -(100*Get_Adc_Average(3,15))/4096;//采集俯仰摇杆的位置,赋值给对应的俯仰变量
      Pitch=(Pitch<=0)?0:Pitch;                 //越界判断
      Pitch=(Pitch>=99)?99:Pitch;               //越界判断

      Roll=Roll_Mid + Roll_Offest + (100*Get_Adc_Average(0,15))/4096;//采集横滚摇杆位置,赋值给对应的横滚变量
      Roll=(Roll<=0)?0:Roll;                //越界判断
      Roll=(Roll>=99)?99:Roll;              //越界判断

      Yaw=Yaw_Mid + Yaw_Offest + (100*Get_Adc_Average(2,15))/4096;//采集横滚摇杆位置,赋值给对应的偏航角
      Yaw=(Yaw<=0)?0:Yaw;                //越界判断
      Yaw=(Yaw>=99)?99:Yaw;              //越界判断

//       Battery=(100*Get_Adc_Average(8,15))/2600;      //采集遥控电池电压,赋值飞对应的电池变量
//       Battery=(Battery>=99)?99:Battery;              //越界判断
//   
      break;
    
    
    
  }

  

}
 int main(void)
 { 
	u16 adcx;
	float temp;
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为9600
	LED_Init();		  		//初始化与LED连接的硬件接口
 	LCD_Init();
 	Adc_Init();		  		//ADC初始化	    
	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(60,50,200,16,16,"Mini STM32");	
	LCD_ShowString(60,70,200,16,16,"ADC TEST");	
	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(60,110,200,16,16,"2014/3/9");	
	//显示提示信息
	POINT_COLOR=BLUE;//设置字体为蓝色
	LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");	      
	LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");	    
	while(1)
	{
		adcx=Get_Adc_Average(ADC_Channel_1,10);
		LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
		temp=(float)adcx*(3.3/4096);
		adcx=temp;
		LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
		temp-=adcx;
		temp*=1000;
		LCD_ShowxNum(172,150,temp,3,16,0X80);
		LED0=!LED0;
		delay_ms(250);	
	}											    
}	
u16 get_angle(void)
{	
	u16 adcx;
	adcx=Get_Adc_Average(ADC_Channel_5,2);
	adcx=0.11613*adcx;
	return adcx;
}
示例#6
0
//获取模拟端口数据
void GetAngolags(u8 ch,int chNum)
{
	adcx=Get_Adc_Average(ch,10);
	PacketBuf[24+5*chNum]=ToHex(adcx/1000);
	PacketBuf[25+5*chNum]=ToHex(adcx%1000/100);
	PacketBuf[26+5*chNum]=ToHex(adcx%100/10);
	PacketBuf[27+5*chNum]=ToHex(adcx%10);
}
示例#7
0
//获取STM32内部温度传感器的温度
//temp:存放温度字符串的首地址.如"28.3";
//temp,最少得有5个字节的空间!
void get_temperature(u8 *temp)
{			  
	u16 t;
	float temperate;		   
	temperate=Get_Adc_Average(ADC_CH_TEMP,10);			 
	temperate=temperate*(3.3/4096);			    											    
	temperate=(1.43-temperate)/0.0043+25;	//计算出当前温度值
	t=temperate*10;//得到温度
	num2str(t/10,temp,2);							   
	temp[2]='.';temp[3]=t%10+'0';temp[4]=0;	//最后添加结束符
}
示例#8
0
//返回值:电量等级
u8 GetBatteryPower(void) 
{
	u16 batteryValue; //电量AD值
	
	batteryValue = Get_Adc_Average(ADC_Channel_9,5);
	
	if(batteryValue > 3722)	battery = 9;  //>8v
	else if((batteryValue > 3629) && (batteryValue <= 3722 ))	battery = 8;  //7.8v-8v
	else if((batteryValue > 3542) && (batteryValue <= 3629))	battery = 7;  //7.6v-7.8v
	else if((batteryValue > 3447) && (batteryValue <= 3542))	battery = 6;  //7.4v-7.6v
	else if((batteryValue > 3352) && (batteryValue <= 3447))	battery = 5;  //7.2v-7.4v
	else if((batteryValue > 3261) && (batteryValue <= 3352))	battery = 4;  //7.0v-7.2v
	else if((batteryValue > 3168) && (batteryValue <= 3261))	battery = 3;  //6.8v-7.0v
	else if((batteryValue > 3076) && (batteryValue <= 3168))	battery = 2;  //~6.6v-6.8v
	else 	battery = 1;
	
	return battery;
}
示例#9
0
文件: Control.c 项目: LIKAIMO/newLBR
void controlClibra(void)
{
	static u8 i;
	uint16_t sum[4]={0,0,0,0};
	static int8_t lednum=1;
  static int8_t clibrasumNum = 20;

	if((ClibraFlag == FAIL))//校准失败
	{

		for(i=0;i<clibrasumNum;i++)
		{
			#ifdef AMERICAN_RC_MODE
			sum[0] += 1000 + (1000 - (1000*Get_Adc_Average(3,15))/4096);
			sum[1] += 1000 + (1000*Get_Adc_Average(1,15))/4096;
			#else
			sum[0] += 1000 + (1000*Get_Adc_Average(1,15))/4096;
			sum[1] += 1000 + (1000 - (1000*Get_Adc_Average(3,15))/4096);
			#endif
			sum[2] += 1000 + (1000*Get_Adc_Average(0,15))/4096;
			sum[3] += 1000 + (1000*Get_Adc_Average(2,15))/4096;
			delay_ms(100);
			
			if(++lednum == led5 + 2)lednum = 2;
			LedSet(lednum - 1,0);
			LedSet(lednum ,1);
		}
		
		Throttle_Calibra = sum[0]/i;
		Pitch_Calibra    = sum[1]/i;
		Roll_Calibra     = sum[2]/i;
		Yaw_Calibra      = sum[3]/i;

		
// 		Throttle_Calibra = 1500;
// 		Pitch_Calibra    = 1500;
// 		Roll_Calibra     = 1500;
// 		Yaw_Calibra      = 1500;

		LoadRCdata();               //摇杆赋值
		if((Throttle>=1510)||(Throttle<1490)||(Pitch>=1510)||(Pitch<=1490)||(Roll>=1510)||(Roll<=1490)||(Yaw>=1510)||(Yaw<=1490))
						ClibraFlag       = FAIL;//校准失败
		else 		ClibraFlag       = OK;//校准成功标志
		
					
		
		SaveParamsToEEPROM();
		LedSet(led2,0);LedSet(led3,0);LedSet(led4,0);LedSet(led5,0);
	 }	
	
}
示例#10
0
文件: Control.c 项目: LIKAIMO/newLBR
/*
摇杆数据采集
输入参数为美国手和日本手
*/
void LoadRCdata(void)
{

    /*以下为美国手的对应关系*/
#ifdef AMERICAN_RC_MODE
      Throttle=1500 - (Throttle_Calibra-(1000 + (1000 - (1000*Get_Adc_Average(3,15))/4096)));//采集油门摇杆的位置,由于硬件原因,需要用100-采集值
      Throttle=(Throttle<=1000)?1000:Throttle;               //越界判断
      Throttle=(Throttle>=2000)?2000:Throttle;               //越界判断

      Pitch= 1500 - (Pitch_Calibra - (1000 + (1000*Get_Adc_Average(1,15))/4096));//采集俯仰摇杆的位置,赋值给对应的俯仰变量
      Pitch=(Pitch<=1000)?1000:Pitch;                 //越界判断
      Pitch=(Pitch>=2000)?2000:Pitch;               //越界判断

      Roll= 1500 - (Roll_Calibra - (1000 + (1000*Get_Adc_Average(0,15))/4096));//采集横滚摇杆位置,赋值给对应的横滚变量
      Roll=(Roll<=1000)?1000:Roll;                //越界判断
      Roll=(Roll>=2000)?2000:Roll;              //越界判断

      Yaw= 1500 - (Yaw_Calibra - (1000 + (1000*Get_Adc_Average(2,15))/4096));//采集横滚摇杆位置,赋值给对应的偏航角
      Yaw=(Yaw<=1000)?1000:Yaw;                //越界判断
      Yaw=(Yaw>=2000)?2000:Yaw;              //越界判断
#else
    /*以下为日本手的对应关系*/
      Throttle=1500 - (Throttle_Calibra - (1000 + (1000*Get_Adc_Average(1,15))/4096));//采集油门摇杆的位置,由于硬件原因,需要用100-采集值
      Throttle=(Throttle<=1000)?1000:Throttle;               //越界判断
      Throttle=(Throttle>=2000)?2000:Throttle;               //越界判断

      Pitch= 1500 - (Pitch_Calibra-(1000 + (1000 - (1000*Get_Adc_Average(3,15))/4096)));//采集俯仰摇杆的位置,赋值给对应的俯仰变量
      Pitch=(Pitch<=1000)?1000:Pitch;                 //越界判断
      Pitch=(Pitch>=2000)?2000:Pitch;               //越界判断

      Roll=  1500 - (Roll_Calibra - (1000 + (1000*Get_Adc_Average(0,15))/4096));//采集横滚摇杆位置,赋值给对应的横滚变量
      Roll=(Roll<=1000)?1000:Roll;                //越界判断
      Roll=(Roll>=2000)?2000:Roll;              //越界判断

      Yaw=  1500 - (Yaw_Calibra - (1000 + (1000*Get_Adc_Average(2,15))/4096));//采集横滚摇杆位置,赋值给对应的偏航角
      Yaw=(Yaw<=1000)?1000:Yaw;                //越界判断
      Yaw=(Yaw>=2000)?2000:Yaw;              //越界判断
#endif
  
}
示例#11
0
void joystickScan_View(void)
{
	uint16_t AdcValue;
	float Voltage;
	uint8_t key;
	static uint8_t ciri = 0, cirj = 0;
	
	key = (JoyStick_Scan(0));
	
	
	if(key)
	{
		ciri = 0;
		
		AdcValue = Get_Adc_Average(ADC1, ADC_Channel_0);	//读取摇杆的ADC值
		OLED_ShowxNum(32, 16, AdcValue, 3, 16, 0x03);		//显示ADC的值
		Voltage = (float)AdcValue * (3.3 / 4096);
		AdcValue = Voltage;
		OLED_ShowxNum(64, 16, AdcValue, 1, 16, 0x01);		//显示电压值
		Voltage -= AdcValue;
		Voltage *= 1000;
		OLED_ShowxNum(80, 16, Voltage, 3, 16, 0x81);
		
		switch(key)
		{
			case KEY_CENTER:
				OLED_ShowString(0, 32, "KEY_CENTER");
				break;
			case KEY_UP:
				OLED_ShowString(0, 32, "KEY_UP    ");
				break;
			case KEY_LEFT:
				OLED_ShowString(0, 32, "KEY_LEFT  ");
				break;
			case KEY_DOWN:
				OLED_ShowString(0, 32, "KEY_DOWN    ");
				break;
			case KEY_RIGHT:
				OLED_ShowString(0, 32, "KEY_RIGHT   ");
				break;
			case KEY_NONE:
				break;
				
			default:
				break;
		}
	}

	OLED_Refresh_Gram();
	delay_ms(10);
	ciri++;
	
	if(ciri > 25)
	{
		cirj++;
		
		if(!key && cirj > 4) 
		{
			cirj = 0;
			
			AdcValue = Get_Adc_Average(ADC1, ADC_Channel_0);	//读取摇杆的ADC值
			OLED_ShowxNum(32, 16, AdcValue, 3, 16, 0x03);		//显示ADC的值
			Voltage = (float)AdcValue * (3.3 / 4096);
			AdcValue = Voltage;
			OLED_ShowxNum(64, 16, AdcValue, 1, 16, 0x01);		//显示电压值
			Voltage -= AdcValue;
			Voltage *= 1000;
			OLED_ShowxNum(80, 16, Voltage, 3, 16, 0x81);
			OLED_ShowString(0, 32, "KEY_NONE     ");
		}
		
		ciri = 0;
	}
}
示例#12
0
//返回电池电压AD值
int GetBatteryAD()
{
 return Get_Adc_Average(8,5);
}
示例#13
0
void gonglvyinshu()
{
        u16 i;
		u32 tempa,tempb;
		u16 adc_vx,adc_vmax=0,adc_ix,adc_imax=0;
		u8 phase_zhi;
		 float temp;

		id_num=AT24CXX_ReadOneByte(0x0010);
	//	key_idset();

		 for(i=0;i<120;i++)
	  	 {
	  	 adc_vx=Get_Adc_Average(ADC_Channel_1,10);
		  // adc_vx=Get_Adc(ADC_Channel_1);
		   if(adc_vx>adc_vmax)
		   adc_vmax=adc_vx;
	  	 }
	   for(i=0;i<120;i++)
	  {
		 adc_ix=Get_Adc_Average(ADC_CH4,10);
		 if(adc_ix>adc_imax)
		 adc_imax=adc_ix;
	  }
	  temp=(float)adc_vmax*(3.3/4096);
	 dianya_zhi=(u16)(518*temp-679);
	  temp=(float)adc_imax*(3.3/4096);
	  dianliuzhi=(u32)(60*temp-80);
	  adc_vmax=0;
	  adc_imax=0;
	  	  	  if(dianliuzhi<7){dianliuzhi=0;gonglvshishu=100;}//滤除杂波,小于7时,说明已经无负载
            else{
	  if(TIM3CH1_CAPTURE_STA&0X80)//完成一次采集
		{
			tempa=TIM3CH1_CAPTURE_STA&0X3F;
			tempa*=65536;					//溢出时间总和
			tempa+=TIM3CH1_CAPTURE_VAL;		//得到TI1端信号周期时间


			tempb=TIM3CH1_CAPTURE_STA&0X3F;
			tempb*=65536;					//溢出时间总和
			tempb+=TIM3CH1_CAPTURE_PHA;		//得到TI2 TI1上升沿时间差值即相位差时间

	 		 if(tempb<=5000)			   //感性负载正接
			 {
			 	phase_zhi=tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
				L_C_flag=1;
			 }
			  if((10000<=tempb)&&(tempb<=15000))			 //感性负载反接
			 {
			 	phase_zhi=((tempb*360)/tempa)-180;
		   	 	gonglvshishu=si[phase_zhi];
				L_C_flag=1;
			 }
			 if((5000<tempb)&&(tempb<10000))	   //容性负载正接
			 {
				/*显示容性功率符号*/
			 	phase_zhi=180-tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
				L_C_flag=0;
			 }
			 if((15000<tempb)&&(tempb<20000))	   //容性负载反接
			 {
				/*显示容性功率符号*/
			 	phase_zhi=360-tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
				L_C_flag=0;
			 }
	  	}
			 wugongkvar=(uint16_t)((1.732*dianliuzhi*dianya_zhi*k*co[phase_zhi])/1000000);
			wugong_95= (uint16_t)((17.32*dianliuzhi*dianya_zhi*k*31)/1000000);//功率因素在0.95时的,无功功�
			wugong_computer=(uint16_t)((17.32*dianliuzhi*dianya_zhi*k*co[phase_zhi])/1000000);
                    wugongkvar=wugong_computer;
			TIM3CH1_CAPTURE_STA=0;			//开启下一次捕获
			
		
		}

//无功功率
}
示例#14
0
u16 power_computer()
{
        u16 i;
		u32 tempa=0,tempb=0;
		u16 adc_vx=0,adc_vmax=0,adc_ix=0,adc_imax=0;
		u8 phase_zhi=0;
		 float temp=0;

		id_num=AT24CXX_ReadOneByte(0x0010);
		key_idset();

		 for(i=0;i<120;i++)
	  	 {
	  	 adc_vx=Get_Adc_Average(ADC_Channel_1,10);
		  // adc_vx=Get_Adc(ADC_Channel_1);
		   if(adc_vx>adc_vmax)
		   adc_vmax=adc_vx;
	  	 }
	   for(i=0;i<120;i++)
	  {
		 adc_ix=Get_Adc_Average(ADC_CH4,10);
		 if(adc_ix>adc_imax)
		 adc_imax=adc_ix;
	  }
	  temp=(float)adc_vmax*(3.3/4096);
	 dianya_zhi=(u16)(518*temp-660);
	  temp=(float)adc_imax*(3.3/4096);
	  dianliuzhi=(u32)(60*temp-80);
	  adc_vmax=0;
	  adc_imax=0;
	  if(TIM3CH1_CAPTURE_STA&0X80)//完成一次采集
		{
			tempa=TIM3CH1_CAPTURE_STA&0X3F;
			tempa*=65536;					//溢出时间总和
			tempa+=TIM3CH1_CAPTURE_VAL;		//得到TI1端信号周期时间


			tempb=TIM3CH1_CAPTURE_STA&0X3F;
			tempb*=65536;					//溢出时间总和
			tempb+=TIM3CH1_CAPTURE_PHA;		//得到TI2 TI1上升沿时间差值即相位差时间

	 		 if(tempb<=5000)			   //感性负载正接
			 {
			 	phase_zhi=tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
			 }
			  if((10000<=tempb)&&(tempb<=15000))			 //感性负载反接
			 {
			 	phase_zhi=((tempb*360)/tempa)-180;
		   	 	gonglvshishu=si[phase_zhi];
			 }
			 if((5000<tempb)&&(tempb<10000))	   //容性负载正接
			 {
				/*显示容性功率符号*/
			 	phase_zhi=180-tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
			 }
			 if((15000<tempb)&&(tempb<20000))	   //容性负载反接
			 {
				/*显示容性功率符号*/
			 	phase_zhi=360-tempb*360/tempa;
		   	 	gonglvshishu=si[phase_zhi];
			 }
//			 wugongkvar=(uint16_t)(1.732*dianliuzhi*dianya_zhi*k*co[phase_zhi]);
			
			TIM3CH1_CAPTURE_STA=0;			//开启下一次捕获
			return gonglvshishu;
		}
	  return gonglvshishu;

//无功功率
}