示例#1
0
文件: adc.c 项目: tarasii/BMP085
//void processTempData(ADC_Typedef* ADC_RES)
void ADC_ProcessData(void)
{
  uint32_t index, dataSum;

  /* sort received data in */
//  insertionSort(ADC_ConvertedValueBuff + 8, 8);
//  ADC_RES.Chanel04AVG = interquartileMean(ADC_ConvertedValueBuff + 8, 8);
	
  insertionSort(ADC_ConvertedValueBuff + 8, 16);
  ADC_RES.Chanel13AVG = interquartileMean(ADC_ConvertedValueBuff + 8, 16);

	//Core temperature math average
  dataSum = 0;
  /* Sum up all mesured data for reference temperature average calculation */ 
  for (index = 0; index < 4; index++){
    dataSum += ADC_ConvertedValueBuff[index];
  }
  /* Devide sum up result by 4 for the temperature average calculation*/
  ADC_RES.tempAVG = dataSum / 4 ;
	
  dataSum = 0;
  /* Sum up all mesured data for reference temperature average calculation */ 
  for (index = 4; index < 8; index++){
    dataSum += ADC_ConvertedValueBuff[index];
  }
  /* Devide sum up result by 4 for the temperature average calculation*/
  ADC_RES.refAVG = dataSum / 4 ;


  /* Calculate temperature in °C from Interquartile mean */
  ADC_RES.temperature_C = CalcTemperature(ADC_RES.tempAVG); 
	
  /* Calculate voltage in V from average */
  ADC_RES.voltage_V = (VREF/ADC_RES.refAVG) * ADC_CONV;

  /* Calculate preasure in mmHg */
  //preasure_V = (preasure_ref * preasureAVG) / preasure_conv;
	
  //altTemp_V = (altTempAVG * voltage_V * 100)/ ADC_CONV;
	
}
示例#2
0
文件: adc.c 项目: tarasii/BMP085
uint16_t adc_coretemp_simple(void)
{
	ADC_InitTypeDef ADC_InitStructure;
	
	uint16_t AD_value;
	uint16_t TemperatureC;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);		//enable ADC1 clock
	
	//ADC1 configuration
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;						//convert single channel only
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 		//convert one time
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; //select no external triggering
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 	//right 12-bit data alignment in ADC data register
	ADC_InitStructure.ADC_NbrOfConversion = 1; 							//single channel conversion	
	ADC_Init(ADC1, &ADC_InitStructure); 							//load structure values to control and status registers
	
	ADC_TempSensorVrefintCmd(ENABLE); 								//wake up temperature sensor
	
	//ADC1 channel16 configuration
	ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_384Cycles);
	
	ADC_Cmd(ADC1, ENABLE); 														//Enable ADC1
	
	calibdata = *FACTORY_CALIB_DATA;
	
  ADC_SoftwareStartConv(ADC1);
	
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)){} 	//wait for conversion complete
	
	AD_value = ADC_GetConversionValue(ADC1);					//read ADC value
	ADC_ClearFlag(ADC1, ADC_FLAG_EOC);								//clear EOC flag

	TemperatureC = CalcTemperature(AD_value); 
	return TemperatureC;
}
示例#3
0
eError DHT::readData()
{
  uint8_t i = 0, j = 0, b = 0, data_valid = 0;
  uint32_t bit_value[DHT_DATA_BIT_COUNT] = {0};

  eError err = ERROR_NONE;
  //time_t currentTime = time(NULL);

  DigitalInOut DHT_io(_pin);

  // IO must be in hi state to start
  if (ERROR_NONE != stall(DHT_io, 0, 250))
  {
    return BUS_BUSY;
  }

  // start the transfer
  DHT_io.output();
  DHT_io = 0;
  // only 500uS for DHT22 but 18ms for DHT11
  (_DHTtype == 22) ? wait_ms(18) : wait(1);
  DHT_io = 1;
  wait_us(30);
  DHT_io.input();
  // wait till the sensor grabs the bus
  if (ERROR_NONE != stall(DHT_io, 1, 40))
  {
    return ERROR_NOT_PRESENT;
  }
  // sensor should signal low 80us and then hi 80us
  if (ERROR_NONE != stall(DHT_io, 0, 100))
  {
    return ERROR_SYNC_TIMEOUT;
  }
  if (ERROR_NONE != stall(DHT_io, 1, 100))
  {
    return ERROR_NO_PATIENCE;
  }
  // capture the data
  for (i = 0; i < 5; i++)
  {
    for (j = 0; j < 8; j++)
    {
      if (ERROR_NONE != stall(DHT_io, 0, 75))
      {
        return ERROR_DATA_TIMEOUT;
      }
      // logic 0 is 28us max, 1 is 70us
      wait_us(40);
      bit_value[i * 8 + j] = DHT_io;
      if (ERROR_NONE != stall(DHT_io, 1, 50))
      {
        return ERROR_DATA_TIMEOUT;
      }
    }
  }
  // store the data
  for (i = 0; i < 5; i++)
  {
    b = 0;
    for (j = 0; j < 8; j++)
    {
      if (bit_value[i * 8 + j] == 1)
      {
        b |= (1 << (7 - j));
      }
    }
    DHT_data[i] = b;
  }

  // uncomment to see the checksum error if it exists
  //printf(" 0x%02x + 0x%02x + 0x%02x + 0x%02x = 0x%02x \n", DHT_data[0], DHT_data[1], DHT_data[2], DHT_data[3], DHT_data[4]);
  data_valid = DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3];
  if (DHT_data[4] == data_valid)
  {
    //_lastReadTime = currentTime;
    _lastTemperature = CalcTemperature();
    _lastHumidity = CalcHumidity();

  }
  else
  {
    err = ERROR_CHECKSUM;
  }

  return err;

}
示例#4
0
文件: DHT.cpp 项目: avsbot/Nucleo
int DHT::readData() 
{

	
   int err = ERROR_NONE;
   Timer tmr;

     DigitalInOut data_pin(_pin);
		// We make sure we are the only ones
		// reading data right now.
	   _mutex.lock();
	
    // BUFFER TO RECEIVE
    uint8_t cnt = 7;
    uint8_t idx = 0;
    
    tmr.stop();
    tmr.reset();
 
    // EMPTY BUFFER
    for(int i=0; i< 5; i++) DHT_data[i] = 0;
 
    // REQUEST SAMPLE
    data_pin.output();
    data_pin.write(0);
    wait_ms(18);
    data_pin.write(1);
    wait_us(40);
    data_pin.input();
 
    // ACKNOWLEDGE or TIMEOUT
    unsigned int loopCnt = 10000;
    
    while(!data_pin.read())if(!loopCnt--)
		{
			_mutex.unlock();
			return ERROR_DATA_TIMEOUT;
		}
 
    loopCnt = 10000;
    
    while(data_pin.read())if(!loopCnt--)
		{
			_mutex.unlock();
			return ERROR_DATA_TIMEOUT;
		}
 
    // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
    for(int i=0; i<40; i++){
        
        loopCnt = 10000;
        
        while(!data_pin.read())if(loopCnt-- == 0)
				{
					_mutex.unlock();
					return ERROR_DATA_TIMEOUT;
				}
 
        //unsigned long t = micros();
        tmr.start();
 
        loopCnt = 10000;
        
        while(data_pin.read())if(!loopCnt--)
				{
					_mutex.unlock();
					return ERROR_DATA_TIMEOUT;
				}
 
        if(tmr.read_us() > 40) DHT_data[idx] |= (1 << cnt);
        
        tmr.stop();
        tmr.reset();
        
        if(cnt == 0){   // next byte?
        
            cnt = 7;    // restart at MSB
            idx++;      // next byte!
            
        }else cnt--;
        
    }
 
    // WRITE TO RIGHT VARS
    uint8_t sum = (DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF;  
 
    if(DHT_data[4] != sum)
		{ 
			_mutex.unlock();
			return ERROR_CHECKSUM;
		}
        
    _lastTemperature= CalcTemperature();
    _lastHumidity= CalcHumidity();
    
		_mutex.unlock();
    return err;
}
示例#5
0
void SimulatedAnnealingOptimizer::SimAnnealDoOpt()
{
    opMessage = "SimAnneal - optimizing ...";

    while (true)
    {
        SimAnnealCalcHiLo();
        CalcTemperature();
        optIterCount++;

        // we have a best fit by this point
        okForOutput = true;

        if (ToleranceCheck(simplexFits[hiIndex], simplexFits[loIndex],
                            simplexParEst[hiIndex], simplexParEst[loIndex]))
            return;


        double ystar =  SimAnnealReflect();
        double ystarFlu = ystar - ThermalFluct();
        // between current lo and next hi?
        if ((ystarFlu > ylo) && (ystarFlu < ynhi))
        {
            yhi = ystarFlu;

            // replace Ph with P*
            simplexParEst[hiIndex] = simplexParStar;
            simplexFits[hiIndex] = ystar;
            opMessage = "SimAnneal - reflection in range ...";

            continue;
        }

        // better than old best ?
        if (ystarFlu <= ylo)
        {
            double ystarstar =  SimAnnealExpand();
            double ystarstarFlu = ystarstar - ThermalFluct();
            if (ystarstarFlu < ylo)
            {
                simplexParEst[hiIndex] = simplexParStarStar;
                simplexFits[hiIndex] = ystarstar;
                yhi = ystarstarFlu;
                opMessage = "SimAnneal - expansion passed ...";
            }
            else
            {
                simplexParEst[hiIndex] = simplexParStar;
                simplexFits[hiIndex] = ystar;
                yhi = ystarFlu;
                opMessage = "SimAnneal - reflection passed ...";
            }
            continue;
        }

        // original reflection was a failure
        if (ystarFlu < yhi)
        {
            // better than old worst
            simplexParEst[hiIndex] = simplexParStar;
            simplexFits[hiIndex] = ystar;
            yhi = ystarFlu;
        }

        // and contract
        double ystarstar =  SimAnnealContract();
        double ystarstarFlu = ystarstar - ThermalFluct();
        if (ystarstarFlu < yhi)
        {
            // contraction was an improvement
            simplexParEst[hiIndex] = simplexParStarStar;
            simplexFits[hiIndex] = ystarstar;
            yhi = ystarstarFlu;
            opMessage = "SimAnneal - contraction passed ...";
        }
        else
        {
            opMessage = "SimAnneal - reset all ...";
            SimAnnealReset();
        }

    }
}