Ejemplo n.º 1
0
/*******************************************************************************
**函	数:  	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;
} 
Ejemplo n.º 2
0
void main(){
	
	char period = 0xAA;
		
	Initialize_ADC();
	OpenPWM1(period);		//PWM on pin 17
	SetDCPWM1(Get_ADC());	//ADC on pin 2
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
	}
}
Ejemplo n.º 5
0
/*******************************************************************************
**函	数:  	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;
} 
Ejemplo n.º 6
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);
					}
Ejemplo n.º 7
0
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");          
        }
    }   
}