STM32F407VG Dahili Sıcaklık Sensörü.

Başlatan LukeSkywalker, 04 Mayıs 2014, 14:24:07

LukeSkywalker

04 Mayıs 2014, 14:24:07 Son düzenlenme: 04 Mayıs 2014, 14:29:05 LukeSkywalker
STM32f407 mikrodenetleyicisinin referans manueli incelenirse, sıcaklık sensöründen okunan değerin hesaplanabilmesi için bir formül verildiği görülür. Bu formülde katsayı değerleri yerine konulduğunda aşağıdaki hali alır;
Kod Seç

Voltage 
= (VolADC 3300) / 4095;
temp = ((Voltage 760) / 2.5) + 25;


Yukarıdaki bilgiler ışığında kodlarımızı yazalım.
Kod Seç
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();
}


Sıcaklık, celcius cinsinden tamsayı şeklinde gösterilmiştir.

MikroC'nin Tools sekmesi altındaki Hid Terminal programcığı ile işlemcinin sıcaklığına ait değerler izlenebilir.

X-Fi

04 Mayıs 2014, 14:50:52 #1 Son düzenlenme: 04 Mayıs 2014, 14:51:56 X-Fi
Sabit katsayılar ile yapılan hesaplamada sıcaklığın farklı çiplerde 10 dereceye kadar saptığını gördüm.

Hafızadaki fabrika kalibrasyon değerleri ile hesaplatırsanız +- 1 derece hassasiyet ile doğru sıcaklık ölçümünü sağlarsınız.

iyi çalışmalar.
http://www.coskunergan.com/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

LukeSkywalker

Fabrika kalibrasyon değerleri ile alakalı bilgi göremedim reference manualde. 
Zaten bu sensörün mutlak sıcaklık ölçümü için kullanılamayacağını, sadece sıcaklık değişimlerini ölçmek için kullanılabileceğini söylemiş.

X-Fi



Bu konuyu öylece geçiştirmeden önce bir düşünün, öğrenmek için 0< derece şeklinde bir sıcaklık yazdırırsınız iş biter, işe yaramaz sadece çalışır. Ama bu yeterlimi bence değil araştırınca görülüyor ki piyasada 2$ ın altında bulacağınız bütün sensörler için kalibrasyon yapmanız gerekecek. Böyle olunca basit diye düşündüğünüz sensör bazen tasarımı ve maliyeti etkileyebiliyor.

iyi çalışmalar.
http://www.coskunergan.com/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

LukeSkywalker

Kalibrasyonun öneminin farkında olmakla beraber
AlıntıBu konuyu öylece geçiştirmeden önce bir düşünün, öğrenmek için 0< derece şeklinde bir sıcaklık yazdırırsınız iş biter, işe yaramaz sadece çalışır.
cümlenizde ne ifade etmeye çalıştığınızı anlamadım. Bendeki dökümanda kalibrasyon bilgileri yok. İsterseniz zahmet edip bakabilirsiniz. Sanırım döküman revize edilmiş.
http://www.mediafire.com/view/9zbydfyzn46yu46/hard.pdf

X-Fi

Orada söylemek istediğim sıcaklığın negatif değerlere de inebileceğiydi sanırım bunuda önemsiz buldunuz.

Evet katalogda revizyon a gidilmiş.

iyi çalışmalar.
http://www.coskunergan.com/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

LukeSkywalker

Bu kodu paylaşma amacım, işlemci içerisindeki sensörün varligindan haberdar olmayanlari haberdar etmek, nasil okunabilecegini de basit bir kodla gostermekti. İklimlendirme sistemi tasarlama amaci gütseydik negatif işareti de gostermenin zor olmayacagi da zaten kodu okuyan kisiler tarafindan gorulebilir.
İlginiz icin tesekkurler. En azindan dokumanin revize edildigini gormus oldum.
Kalibrasyon ve negatif kismini da siz eklerseniz daha ogretici bir paylasim yapmis oluruz.
İyi calismalar.

yey

01 Şubat 2019, 12:49:43 #7 Son düzenlenme: 01 Şubat 2019, 15:41:10 gevv
aynı uygulamayı usb HID ve uart terminalinde yaptım usb HID de 42  gelen sıcaklık değeri uart terminalinde 21 geliyor. stm32f407 deki bu iki birim hakkında bilmem gereken bir detaymı var acaba, ya da önemsizmi bu uygulama, sadece haberleşme yaptırabildiğimize bakıp geçmekmi gerek?


Kod Seç
char ddd;
#define ledk gpiod_odr.b14
#define ledy gpiod_odr.b12

int okunan,Voltage,temp,ort;
long toplam;
char cnt;
char binler,yuzler,onlar,birler ;

void main() {
gpio_digital_output(&gpiod_odr,_gpio_pinmask_14);
gpio_digital_output(&gpiod_odr,_gpio_pinmask_12);

  
UART4_Init_Advanced(115200,_UART_8_BIT_DATA,_UART_NOPARITY,_UART_ONE_STOPBIT,&_GPIO_MODULE_UART4_PC10_11);
  
delay_ms(100);
  
UART4_Write_Text("start");
  

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;
  if (
temp>25)
      {
ledk=1;
      
ledy=0;}
  else
      {
ledk=0;
      
ledy=1;}
  
UART4_Write(onlar);
  
UART4_Write(birler);
  
UART4_Write_Text("°C""\r""\n");
  
delay_ms(1000);
}
}