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)); }
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; } }
/* 摇杆数据采集 输入参数为美国手和日本手 */ 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; }
//获取模拟端口数据 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); }
//获取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; //最后添加结束符 }
//返回值:电量等级 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; }
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); } }
/* 摇杆数据采集 输入参数为美国手和日本手 */ 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 }
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; } }
//返回电池电压AD值 int GetBatteryAD() { return Get_Adc_Average(8,5); }
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; //开启下一次捕获 } //无功功率 }
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; //无功功率 }