/******************************************************************************* **函 数: Get_ADC_Average() **功 能: 获取通道ch的转换值,取times次,然后平均 **参 数: times:获取次数 ADC_Result:转换结果平均值 **返 回: 0:成功 1:失败 **说 明: ********************************************************************************/ u8 Get_ADC_Average(u8 times,u16 *Average_Voltage) { u32 temp_val=0; u16 ADC_val = 0; u8 t; ADC1->CR2 |= 1<<0; //ADCON POWER ON for(t=0;t<times;t++) { if(!Get_ADC(&ADC_val)) { temp_val += ADC_val; delay_ms(1); } else { ADC1->CR2 &= ~(1<<0); //ADCON POWER OFF return 1; } } *Average_Voltage = temp_val/times; ADC1->CR2 &= ~(1<<0); //ADCON POWER OFF return 0; }
void main(){ char period = 0xAA; Initialize_ADC(); OpenPWM1(period); //PWM on pin 17 SetDCPWM1(Get_ADC()); //ADC on pin 2 }
int rx_byte (float min) { int j, val; int v; //skip the start bit val = 0; Get_ADC(1); wait_one_and_half_bit_time(); for (j=0; j<8; j++) { v = Get_ADC(1); val|=(v>min)?(0x01<<j):0x00; //if voltage is greater than "min" then the returned val gets a bit at the right position wait_bit_time(); } //wait for stop bits wait_one_and_half_bit_time(); return val; }
void ADC_Task(void *parg) { u16 value[3]; u16 arg; float v; u16 G; u16 n; (void)parg; for(;;) { value[0]=Get_ADC();//读到的AD值 value[1]=Get_ADC(); value[2]=Get_ADC(); arg=(value[0]+value[1]+value[2])/3; v=(arg*5000)/65535;//转换成电压 G=(u16)(v/VPG);//计算重量,单位克,分辨率1g if(G==0) { Motor_On(1);//开启强振电机 Motor_On(2);//开启弱振电机 } else { if(G>=VALUE1)//前置重量 { Motor_Off(1);//关闭强振电机 if(G==VALUE2*0.99)//即将达到设定值 { Motor_Off(2);//关闭弱振电机 n++; prog2.per=n/VALUE3; LCD_DrawProg(prog2); } } prog1.per=G/VALUE2; LCD_DrawProg(prog1); } OSTimeDlyHMSM(0,0,0,250); } }
/******************************************************************************* **函 数: Get_ADC_Average() **功 能: 获取通道ch的转换值,取times次,然后平均 **参 数: times:获取次数 ADC_Result:转换结果平均值 **返 回: 0:成功 1:失败 **说 明: ********************************************************************************/ u8 Get_ADC_Average(u8 times,u16 *Average_Voltage) { u32 temp_val=0; u16 ADC_val = 0; u8 t; for(t=0;t<times;t++) { if(!Get_ADC(&ADC_val)) { temp_val += ADC_val; delay_ms(1); } else return 1; } *Average_Voltage = temp_val/times; return 0; }
void main(void) { unsigned char n, m, delta; signed int th, change = 0, eis5temp; signed char korrektur; unsigned int exponent, eis5lux, rest; // start watchdog 2,6 sec WDL = 0xFF; EA = 0; WDCON = 0xE5; WFEED1 = 0xA5; WFEED2 = 0x5A; EA = 1; restart_hw(); // Hardware zuruecksetzen for (n = 0; n < 50; n++) { // Warten bis Bus stabil, nach Busspannungswiederkehr TR0 = 0; // Timer 0 anhalten TH0 = eeprom[ADDRTAB + 1];// Timer 0 setzen mit phys. Adr. damit Geräte unterschiedlich beginnen zu senden TL0 = eeprom[ADDRTAB + 2]; TF0 = 0; // Überlauf-Flag zurücksetzen TR0 = 1; // Timer 0 starten while (!TF0) ; } restart_app(); // Anwendungsspezifische Einstellungen zuruecksetzen // feed watchdog EA = 0; WFEED1 = 0xA5; WFEED2 = 0x5A; EA = 1; do { if (eeprom[0x0D] == 0xFF && fb_state == 0 && !connected) { // Nur wenn im run-mode und statemachine idle ET1 = 0; // statemachine stoppen switch (sequence) { case 1: if ((timer & 0x3F) == 0x30) { // nur alle 10 Sekunden wandeln interrupted = 0; start_tempconversion(); // Konvertierung starten if (!interrupted) sequence = 2; } ET1 = 1; // statemachine starten break; case 2: if ((timer & 0x07) == 0x07) { // nur ein mal pro Sekunde pollen interrupted = 0; if (ow_read_bit() && !interrupted) sequence = 3; // Konvertierung abgeschlossen } ET1 = 1; // statemachine starten break; case 3: interrupted = 0; #ifdef DEBUG th = ti; ti+=100; if (ti>2800) ti=2000; #else th = read_temp(); // Temperatur einlesen #endif ET1 = 1; // statemachine starten korrektur = (signed char) eeprom[TEMPCORR]; // Parameter Korrekturwert Temperatur for (n = 0; n < 10; n++) th += korrektur; if (!interrupted) { temp = th; if (temp != lasttemp) { eis5temp = (temp >> 3) & 0x07FF;// durch 8 teilen, da später Exponent 3 dazukommt eis5temp = eis5temp + (0x18 << 8); if (temp < 0) eis5temp += 0x8000; // Vorzeichen write_obj_value(1, eis5temp); schwelle(6); // Temperaturschwellen prüfen und ggf. reagieren schwelle(7); } sequence = 4; } break; case 4: // Helligkeitswert konvertieren interrupted = 0; Get_ADC(3); // ADC-Wert holen ET1 = 1; // statemachine starten if (!interrupted) { n = 0; if (HighByte >= 112) { lux = 65535; } else { /* while (HighByte >= logtable[n]) n++; if (n>1) { lux=8; lux=lux<<(n-1); // unterer Wert } else lux=0; */ lux = 2; while (HighByte >= logtable[n]) { n++; lux = lux * 2; } if (n <= 1) lux = 0; rest = HighByte - logtable[n - 1]; delta = logtable[n] - logtable[n - 1]; /* if (n<11) lux+=_divuint(rest<<(n+2),delta); else lux+=_divuint(rest<<(n-2),delta)<<4; */ if (n < 11) m = n + 2; else m = n - 2; rest = rest << m; rest = _divuint(rest, delta); if (n < 11) lux += rest; else lux += rest << 4; if (n < 7) lux += (_divuint(LowByte << (n + 2), delta) >> 8); } if (lux != lastlux) { exponent = 0x3800; // Exponent 7 eis5lux = lux >> 1; eis5lux += lux >> 2; eis5lux += lux >> 5; while (eis5lux > 0x07FF) { // Exponent erhöhen falls Mantisse zu groß eis5lux = eis5lux >> 1; exponent += 0x0800; } eis5lux += exponent; write_obj_value(0, eis5lux);// Lux Wert im userram speichern schwelle(4); // Helligkeitsschwellen 2 und 3 schwelle(5); }
void main (void) { int byte = 300; float v0 = 0; float v1 = 0; float v2 = 0; float v3 = 0; float valign = 0; double vright = 0; double vleft = 0; int temp = 0; P2_0 = 1; //front LED P2_1 = 0; //back LED printf("\x1b[2J"); // Clear screen using ANSI escape sequence. // Start the ADC in order to select the first channel. // Since we don't know how the input multiplexer was set up, // this initial conversion needs to be discarded. AD0BUSY=1; while (AD0BUSY); // Wait for conversion to complete while(1) { v0 = Get_ADC(1); v1 = Get_ADC(2); v2 = Get_ADC(3); v3 = Get_ADC(0); if(dist == 2){ vright = v1; vleft = v3; distance = 2.8; } if(dist == 1){ buffer = 0.2; vright = v0; vleft = v2; distance = 1.5; } if(dist == 3){ vright = v1; vleft = v3; distance = 2.0; buffer = 0.3; } if(dist == 4){ vright = v1; vleft = v3; distance = 1.2; buffer = 0.2; } if(dist == 5){ vright = v1; vleft = v3; distance = 0.5; buffer = 0.3; } valign = abs(vleft-vright); printf("Vright = %5.3f ", vright); printf("Vleft = %5.3f", vleft); printf("distance = %d\r", dist); /* if(vleft<0.15){ P2_2 = 0; P2_3 = 0; P2_4 = 0; P2_5 = 0; byte = rx_byte(0.2); printf("\n byte = %d\n", byte); }*/ if(valign < 0.2){ //straight if(vright+buffer>distance && vright - buffer < distance){//stay P2_2 = 0; P2_3 = 0; P2_4 = 0; P2_5 = 0; } else if (vright-buffer > distance){//back P2_2 = 1; P2_3 = 0; P2_4 = 0; P2_5 = 1; } else{//forward P2_2 = 0; P2_3 = 1; P2_4 = 1; P2_5 = 0; } } else{ printf("\n\rTURNING\n\r"); if(vright > vleft){ P2_2 = 0; P2_3 = 0; P2_4 = 1; P2_5 = 0; } else{ P2_2 = 0; P2_3 = 1; P2_4 = 0; P2_5 = 0; } } if(byte == 0 || byte == 1 || byte == 129 || byte == 128){ // move farther p0 if(dist != 5){ dist++; } byte = 300; } if(byte == 254 || byte == 255 || byte == 253 ){ //move closer p1 if(dist != 1){ dist--; } byte = 300; printf("move closer \n"); } if(byte == 14 || byte == 15 || byte == 7){ //rotate 180 p2 byte = 300; P2_2 = 0; P2_3 = 1; P2_4 = 0; P2_5 = 0; waitms(2500); P2_2 = 0; P2_3 = 0; P2_4 = 0; P2_5 = 0; if (dist != 5){ dist++; } printf("rotate 180 \n"); } if(byte == 238 || byte == 239 || byte == 119){ //front leds p3 P2_0 = !P2_0; byte = 300; printf("ledfront \n"); } if(byte == 56 || byte == 57 || byte == 25){ //back leds p4 P2_1 = !P2_1; byte = 300; printf("ledback \n"); } if(byte == 246 || byte == 243 || byte ==251){ //buzzer p5 byte = 300; printf("buzz on \n"); } if(byte == 124 || byte == 125 || byte == 61){ //p park p6 byte = 300; P2_2 = 0; P2_3 = 1; P2_4 = 0; P2_5 = 0; waitms(1000); P2_2 = 1; P2_3 = 0; P2_4 = 0; P2_5 = 1; waitms(1500); P2_2 = 0; P2_3 = 0; P2_4 = 1; P2_5 = 0; waitms(1000); P2_2 = 0; P2_3 = 1; P2_4 = 1; P2_5 = 0; waitms(500); P2_2 = 0; P2_3 = 0; P2_4 = 0; P2_5 = 0; waitms(2000); printf("park \n"); } } }