본문 바로가기

[ST_MICRO]/STM32H7

[STM32H7 EVM] Arduino SPI 테스트 - MAX31865 PT100 RTD Sensor Test

STM32H7 EVM 보드에서 SPI는 SSM-EVM 모듈 인터페이스 커넥터에서 테스트 할 수 있다.

 

 

 

Arduino 에서 SPI핀맵은 아래와 같이 할당하였다.

// SPI Definitions
#define PIN_SPI_SS              PE2
#define PIN_SPI_MOSI            PB5
#define PIN_SPI_MISO            PB4
#define PIN_SPI_SCK             PB3

 

STM32H7의 SPI 클럭 최대 속도는 133Mhz 까지 가능하다고 한다.

 

 

Arduino에서 STM32H7 SPI 클럭 속도 테스트를 해 보자

void setup()
{
  Serial.begin(115200);
  Serial.println("STM32H7 SPI test..");
  
  pinMode(PIN_OUT, OUTPUT);
  digitalWrite(PIN_OUT, HIGH);

  delay(1000);
  
  SPI.begin();

  //SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); // speed was 3.5Mhz
  //SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); // speed was 28Mhz
  //SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0)); // speed was 54Mhz
  SPI.beginTransaction(SPISettings(37000000, MSBFIRST, SPI_MODE0)); // speed was 120Mhz
}



void loop() {
  //delay(1);
  digitalWrite(PIN_OUT, HIGH);
  SPI.transfer(0x55);
  digitalWrite(PIN_OUT, LOW); 
}

 

설정한 속도가 나오지 않는다

대략 3.5배 정도 크게 설정 되어 있는 것 같은 현상을 보인다...

 

우선 최대 속도로 테스트 해보면 120Mhz 까지는 측정된다.

 

 

SPI 출력하는 속도는 800ns 정도로 빠르게 출력하는것 같다.

 

클럭 설정 부분을 좀더 확인할 필요가 있을것 같다.

 


이제 기본 SPI 테스트가 완료 되었기 때문에 응용예로 MAX31865 RTD 온도 센서 PT100을 측정할수 있는 MAX31865 모듈을 이용하여 테스트 해보자

 

 

#include <Adafruit_MAX31865.h>

#define MAX31865_CS_PIN     9 //PE2

// Use software SPI: CS, DI, DO, CLK
//Adafruit_MAX31865 thermo = Adafruit_MAX31865(10, 11, 12, 13);
// use hardware SPI, just pass in the CS pin
Adafruit_MAX31865 thermo = Adafruit_MAX31865(MAX31865_CS_PIN);

// The value of the Rref resistor. Use 430.0 for PT100 and 4300.0 for PT1000
#define RREF      430.0
// The 'nominal' 0-degrees-C resistance of the sensor
// 100.0 for PT100, 1000.0 for PT1000
#define RNOMINAL  100.0

void setup() {
  Serial.begin(115200);
  Serial.println("Adafruit MAX31865 PT100 Sensor Test!");

  thermo.begin(MAX31865_3WIRE);  // set to 2WIRE or 4WIRE as necessary
}


void loop() {
  uint16_t rtd = thermo.readRTD();

  Serial.print("RTD value: "); Serial.println(rtd);
  float ratio = rtd;
  ratio /= 32768;
  Serial.print("Ratio = "); Serial.println(ratio,8);
  Serial.print("Resistance = "); Serial.println(RREF*ratio,8);
  Serial.print("Temperature = "); Serial.println(thermo.temperature(RNOMINAL, RREF));

  // Check and print any faults
  uint8_t fault = thermo.readFault();
  if (fault) {
    Serial.print("Fault 0x"); Serial.println(fault, HEX);
    if (fault & MAX31865_FAULT_HIGHTHRESH) {
      Serial.println("RTD High Threshold"); 
    }
    if (fault & MAX31865_FAULT_LOWTHRESH) {
      Serial.println("RTD Low Threshold"); 
    }
    if (fault & MAX31865_FAULT_REFINLOW) {
      Serial.println("REFIN- > 0.85 x Bias"); 
    }
    if (fault & MAX31865_FAULT_REFINHIGH) {
      Serial.println("REFIN- < 0.85 x Bias - FORCE- open"); 
    }
    if (fault & MAX31865_FAULT_RTDINLOW) {
      Serial.println("RTDIN- < 0.85 x Bias - FORCE- open"); 
    }
    if (fault & MAX31865_FAULT_OVUV) {
      Serial.println("Under/Over voltage"); 
    }
    thermo.clearFault();
  }
  Serial.println();
  delay(1000);
}

 

 

 

RTD value: 9184
Ratio = 0.28027344
Resistance = 112.10937500
Temperature = 31.13

 

반응형