Stm32f40vg sıcaklık hesaplama

Başlatan Frknkntr, 07 Ocak 2014, 21:50:57

Frknkntr

Tekrardan teşekkür ederim tüm arkadaşalra değerli vaktinizi ayırdığınız için...

X-Fi

işlemci içerisinde fabrikada +25c ve +110c de kalibre edilmiş degerler mevcut COLD_VALUE  HOT_VALUE isminde bunların register adresleri işlemciye göre değişiyor.

Cortex M3 STM32F1 örneği
Soguk ->0x1FF8007A 
Sıcak -> 0x1FF8007E


STM32 M3 serisi için benim kalibrasyon değerlerim aşağıdadır. Bunları kullanmıyorum büyük ihtimalle M4 dede çalışır.

#define DEFAULT_HOT_VAL 0x362
#define DEFAULT_COLD_VAL 0x2A8


http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

LukeSkywalker

MikroC for ARM ile yazdım ve USB terminal üzerinden 500 ms'de bir okudum sıcaklığı. Ondalıklı kısmını göstermedim. Sadece 22 derece 23 derece gibi gösterdim.

int okunan,Voltage,temp,ort;
long toplam;
char cnt;
char readbuff[64];
char writebuff[64];
char binler,yuzler,onlar,birler ;

void main() {
HID_Enable(&readbuff,&writebuff);
ADC1_Init();
ADC_CCR.TSVREFE=1;
while(1)
        {
         for(cnt=0;cnt<100;cnt++)
                                 {
                                  okunan=ADC1_Read(16);
                                  toplam+=okunan;
                                  delay_ms(5);
                                 }
         ort=toplam/100;
         toplam=0;
         Voltage = ((long)ort * 3300) / 4095;
         temp = ((Voltage - 760) / 2.5) + 25;

         onlar=((temp/10)%10)+48;
         birler=(temp%10)+48;
         
         writebuff[0]=onlar;
         writebuff[1]=birler;
         writebuff[2]='°';
         writebuff[3]='C';
         writebuff[4]='\r';
         writebuff[5]='\n';
         HID_Write(&writebuff,64);
         }

}
void kesme() iv IVT_INT_OTG_FS ics ICS_AUTO {
USB_Interrupt_Proc();
}


Bu da ekran görüntüsü;



X-Fi

#18
Hocam hassasiyetler 1/10  a inemiyor malesef kendi kalibrasyonu +-5C hasas olabilir denmiş daha iyi hassasiyetler için çipe göre kalibrasyonu kendiniz yapmanız gerekiyormuş.

buda benim kütüpanem -25C ile +80C aralığını ölçüyor, uygulama pil ile çalıştığı için AVdd yi hesaplattım.


#define VREF 		1.224L
#define ADC_CONV 	4096
#define DEFAULT_HOT_VAL 0x362
#define DEFAULT_COLD_VAL 0x2A8

int32_t Isi_Olcum(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  uint32_t tempAVG,temp;
  int32_t  temperature_C;
  uint8_t  j;
  float    Batt;
	

  /* Enable the HSI oscillator */
  RCC_HSICmd(ENABLE);
	
	/* Check that HSI oscillator is ready */
  while( RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
	
	/* Enable ADC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	/* de-initialize ADC */
  ADC_DeInit(ADC1);

  /* ADC Configuration */
  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channel4 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_192Cycles);
  ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);

  ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
  
  /* Wait until ADC1 ON status */
  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
  {
  }
 
  ADC_TempSensorVrefintCmd(ENABLE);
  /* ADC1 regular channel 17 for TEMP sensor configuration  */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_192Cycles);
  
  /* initialize result */
  tempAVG = 0;
  for(j=4; j>0; j--)
  {
  /* start ADC convertion by software */
    ADC_SoftwareStartConv(ADC1);

    /* wait until end-of-covertion */
    while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
  /* read ADC convertion result */
    tempAVG += ADC_GetConversionValue(ADC1);
  }
	
	tempAVG=tempAVG>>2; // averaji alinip sensör degeri elde edildi 
  
	  /* ADC1 regular channel 17 for VREF configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_192Cycles);
  
  /* initialize result */
  temp = 0;
  for(j=4; j>0; j--)
  {
  /* start ADC convertion by software */
    ADC_SoftwareStartConv(ADC1);

    /* wait until end-of-covertion */
    while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
    /* read ADC convertion result */
    temp += ADC_GetConversionValue(ADC1);
  }
	/* averaji alinip voltaj degeri elde ediliyor */
  temp=temp>>2;  
  /* VDDA voltaj1 float olarak hesaplan1yor */
	Batt = (VREF/temp) * ADC_CONV; 
 
	/* VDDA voltaj1na göre sicaklik oranlan1yor */
	tempAVG  = ( Batt * tempAVG ) / 3;
	
  /* Calculate temperature in °C from Interquartile mean */
  temperature_C = ( (int32_t) tempAVG - (int32_t) DEFAULT_COLD_VAL ) ;	
  temperature_C = temperature_C * (int32_t)(110 - 25);                      
  temperature_C = temperature_C / (int32_t)(DEFAULT_HOT_VAL - DEFAULT_COLD_VAL); 
 	temperature_C = temperature_C + 25;
	
	/* disable initialize ADC for LP */
  ADC_TempSensorVrefintCmd(DISABLE);
	/* disable clock for LP */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);
  /* Disable the HSI oscillator for LP */
  RCC_HSICmd(DISABLE);
	
	return temperature_C ; 
}


http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

muhittin_kaplan

Xfi bu max ve min sıcaklık regi değerli bilgi teşekkür ederim. Luke microC ye Yavaş yavaş Göz Kırpıyorum, HID felan Kolay ca Yapılıyor zannımca.

LukeSkywalker

#20
Hid olayi basit ama mudahele edemiyoruz kütüphaneye.
Yakinda kitap ta çikiyor mikroc pro for arm ile ilgili.