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

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

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;
Voltage = (VolADC * 3300) / 4095;
temp = ((Voltage - 760) / 2.5) + 25;


Yukarıdaki bilgiler ışığında kodlarımızı yazalım.
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

#1
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.dev/    (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.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

LukeSkywalker

Kalibrasyonun öneminin farkında olmakla beraber
Alıntı YapBu 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.dev/    (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

#7
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?


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);
}
}