MAX6675 Okuma Sorunu

Başlatan Mucit23, 08 Ekim 2018, 00:16:57

Mucit23

Selamlar

STM32F103 çipim ile Şu MAX6675 çipini okumaya çalışıyorum. Akşamdan beri bir türlü doğru düzgün okuyamadım.
Datasheette Data Telegramı verilmiş. Bu referansa göre birşeyler yapmaya çalışıyorum.



Bu yapıya göre okumak için şöyle bir kod parçası yazdım
uint16_t MAX6675_ReadReg(void)
{
  int i=0;
	uint16_t temp=0;

	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
  HAL_Delay(1);
		
	for(i=0;i<16;i++)
	{
		 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
     HAL_Delay(1);
     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
     HAL_Delay(1);
		
		 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)) temp |= (uint8_t)1<<i;	
	}
	
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
	
	temp=temp>>3;
	
	return temp;
}

Bu kodu çalıştırıp CS, SCK ve DO pinlerini Logic analyser ile izliyorum. STM32'den sabit değer okuyorum sürekli. Logic analyser ile data hattını izlediğimde Termocupl'ı ısıtmama rağmen gelen dataların değişmediğini görüyorum.

Sonradan çip bozukmu değilmi diye kontrol etmek için Arduinoya bağladım. Onda çalıştı. Aradaki iletişimi lojik analyser ile incelediğimde veriyi 16 bit olarak okumak yerine 8 bit 8 bit olarak iki parça halinde okumuş. Ve 2 Byte arası CS pini anlık olarak lojik 1 olup tekrar lojik 0 oluyor. Anlayamadım dolayısıyla. O şekilde denedim yine çalıştıramadım.

Fikri olan varmı?
 

baran123

Ben direk SPI ile okudum verileri.

CS 0 yap.
2 Byte Oku
CS 1 yap.

Bir arduino örneği var oldukça basit.
double MAX6675::readCelsius(void) {

  uint16_t v;

  digitalWrite(cs, LOW);
  _delay_ms(1);

  v = spiread();
  v <<= 8;
  v |= spiread();

  digitalWrite(cs, HIGH);

  if (v & 0x4) {
    // uh oh, no thermocouple attached!
    return NAN; 
    //return -100;
  }

  v >>= 3;

  return v*0.25;
}

baran123

Hatta SPI Read kısmıda varmış.
Kaynak : https://github.com/adafruit/MAX6675-library/blob/master/max6675.cpp#L42
byte MAX6675::spiread(void) { 
  int i;
  byte d = 0;

  for (i=7; i>=0; i--)
  {
    digitalWrite(sclk, LOW);
    _delay_ms(1);
    if (digitalRead(miso)) {
      //set the bit to 0 no matter what
      d |= (1 << i);
    }

    digitalWrite(sclk, HIGH);
    _delay_ms(1);
  }

  return d;
}

RaMu

Datasheet te conversion time a bak, 170~220 ms.
220ms den daha sık aralıklarla okuma yapılırsa
entegre sıcaklık okuyup dönüştürme işlemini yapamıyor,
sonuç olarak en son hangi değeri bulmuşsa onu gönderiyor,
sıcaklık dönüştürme işleminede kaldığı yerden devam etmiyor
sil baştan yeniden dönüşüm yapmaya başlıyor.

Ne diyeceğimi bilemediğim bir saçmalık entegrenin bu tasarımı.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Mucit23

Arduinodaki Kodu kopyalamayı deneyeceğim.  Bu şekilde çalıştırırım umarım.

Bunun dışında Bu sensörün Çözünürlüğü Bana biraz düşük geliyor 0.25C Çözünülükte okuma yapılıyor. 0-200C için Termocupl kullanmak yerine Min 0.1C çözünürlükte ölçüm alabilmek için RTD veya PT100 gibi Termistörler kullanmak daha mantıklı.  Bu termistörler için MAX6675 gibi Hazır sıcaklık dönüşümü yapan bir çip varmıdır?

DS18B20 gibi sıcaklık sensörleri Endüstriyel ortamlarda kullanıma uygun değiller.
Bana bayonet tipi hassas ölçüm yapabileceğim bir sıcaklık sensörü lazım.

Mucit23

#5
Alıntı yapılan: RaMu - 08 Ekim 2018, 00:45:22Datasheet te conversion time a bak, 170~220 ms.
220ms den daha sık aralıklarla okuma yapılırsa
entegre sıcaklık okuyup dönüştürme işlemini yapamıyor,
sonuç olarak en son hangi değeri bulmuşsa onu gönderiyor,
sıcaklık dönüştürme işleminede kaldığı yerden devam etmiyor
sil baştan yeniden dönüşüm yapmaya başlıyor.

Ne diyeceğimi bilemediğim bir saçmalık entegrenin bu tasarımı.

Conversiyon TimeDan dolayı sorun yaşamışım. İki okuma arası süreyi 300ms yaptım düzeldi.

Fakat Hassas endüstriyel ısı ölçümü hakkında yine sorum güncel.

Ekleme: RTD için Yine Maxim'in MAX31865 diye bir Çipi varmış.

Murat Mert

Alıntı yapılan: Mucit23 - 08 Ekim 2018, 01:16:40Conversiyon TimeDan dolayı sorun yaşamışım. İki okuma arası süreyi 300ms yaptım düzeldi.

Fakat Hassas endüstriyel ısı ölçümü hakkında yine sorum güncel.

Ekleme: RTD için Yine Maxim'in MAX31865 diye bir Çipi varmış.

Ferhat pahalı, pahalı, pahalı çok pahalı. mcp3421, mcp3553 ile kendin yap.
mert07

Mucit23

Bakayım bi abi. Varmı bi örnek uygulama?