Bu projenin amacı nedir?
Bu bölümde, ARM mikrodenetleyicisi STM32F serisini kullanarak MS5637 sensörünü programlayıp veri okuyacağız. Bu projeyi rahat kurmak için iki hazır modül Gebra MS5637 Barometrik Basınç Sensörü Modülü ve GebraBit STM32F303 kullanıyoruz. Bu iki modül, Gebra ekibi tarafından çalışmayı kolaylaştırmak için sağlanan MS5637 sensörünün ve STM32F mikrodenetleyicisinin minimum gerekli elemanlarını içerir.
Bu eğitimde ne öğreneceğiz?
Bu eğitimde, MS5637 sensörünü kurmanın ve kullanmanın yanı sıra, tüm MS5637 sensör kayıtlarını, I2C protokolünü kullanarak bu sensörü kurmak için STM32 mikro denetleyicisinin çeşitli parçalarının nasıl ayarlanacağını, I2C protokolünün nasıl kullanılacağını öğreneceksiniz. Gebra MS5637 Barometrik Basınç Sensörü Modülü modülüne özel kitaplık ve sürücü dosyası. Ayrıca Keil derleyicisinde işlevlerin nasıl bildirileceğini ve son olarak sensör verilerinin nasıl alınacağını da öğreneceksiniz.
Bu projeye başlamak için neye ihtiyacımız var?
bu projeyi gerçekleştirmek için bazı donanım ve yazılımlara ihtiyacımız var. Bu donanım ve yazılımların başlıkları aşağıdaki tabloda sizlere sunulmuştur ve her birinin üzerine tıklayarak hazırlayabilir/indirebilir ve başlamaya hazırlanabilirsiniz.
GEREKLİ DONANIM | GEREKLİ YAZILIM |
---|---|
ST-LINK/V2 Programmer | Keil uVision Programmer – (Nasıl kurulur ?) |
STM32 Microcontroller – ( Gebra STM32f303 ) | STM32CubeMX Program – (Nasıl kurulur ?) |
Gebra MS5637 Barometrik Basınç Sensörü Modülü |
Öncelikle aşağıdaki görüntüde görüldüğü gibi GebraBit MS5637 modülünü GebraBit STM32F303 modülüne aşağıdaki şekilde bağlıyoruz bu projenin sonunda Keil “Watch1” penceresinde “Debug Session” modunda sıcaklık, basınç ve yaklaşık yükseklik değerlerini Gerçek Zamanlı olarak göreceğiz.
STM32CubeMX ayarları
Aşağıda GebraBit MS5637 modülünü geliştirmek için STM32F303 mikrodenetleyicisindeki “I2C”, “RCC”, “Debug” ve “Clock” bölümlerinin her birine ilişkin ayarları inceliyoruz.
RCC / Clock ayarları
Gebra STM32F303‘de harici kristalin (External Crystal) bulunması nedeniyle “RCC” kısmında “Crystal/Ceramic Resonator”i seçiyoruz:
Daha sonra Clock Configuration sayfasından PLLCLK modunu seçiyoruz ve diğer gereklı ayarları yapıyoruz (daha fazla bilgi için tıklayınız)
Debug & Programming ayarları
bu modülde Debug&Programming sırasında pin sayısını azaltmak için “SWCLK” ve “SWDIO” pinleri için “SYS” bloğunda “Debug” kısmından “Serial Wire” seçeneğini seçiyoruz.
I2C ayarları
Gebra STM32F303 ile Gebra MS5637 I2C aracılığıyla iletişim kurmak için Connectivity->I2C kısmından Standart Mod‘u seçin ve PB8 ve PB9 pinlerini SCL ve SDA olarak seçin
Not: Eğer başka bir mikroişlemci kullanıyorsanız veya i2c için başka pin kullanmak istiyorsanız istediğiniz pine tıklayıp i2c1_scl , i2c1_sda pinleri seçebilirsiniz
Project Manager ayarları
“Project Manager” ayarları aşağıdaki gibidir, burada “MDK-ARM” versiyon “5.32” kullandık. eğer siz kodlamak için başka bir İDE kullanıyorsanız Toolchain seçeneğinden kullandığınız İDE’yi seçmeniz gerekecek
Yukarıdaki tüm ayarları tamamladıktan sonra GENERATE CODE seçeneğine tıklıyoruz.
Projenin kütüphanesi (Library)
GebraMS, çeşitli sensör ve entegrelerin modüler tasarımına ek olarak, kullanıcıların yazılım kurma ve geliştirme işlemlerini kolaylaştırmak için C dilinde çeşitli yapılandırılmış ve donanımdan bağımsız kütüphaneler (Library) sağlamaya çalışır. Bu amaçla, kullanıcılar, istedikleri modülün kütüphanesini “.h” ve “.c” dosyasını (Başlık ve Kaynak) olarak indirebilirler.
GebraMS tarafından sağlanan projenin kütüphanesini projenize ekleyerek ( projeye dosya nasıl eklenir ) kodumuzu kolayca geliştirebiliriz. ilgili dosyaları projenin sonunda veya sağ tarafta ilgili sayfalar kısmında bulabilirsiniz
Kütüphanede tanımlanan tüm fonksiyonlar tüm detaylarıyla yorumlanmakta ve fonksiyonların argümanlarında alınan tüm parametreler ve dönüş değerleri kısaca açıklanmaktadır. Kütüphaneler donanımdan bağımsız olduğundan kullanıcı istediği compiler’e kolaylıkla kütüphaneyi ekleyebilir ve istediği mikroişlemci ve geliştirme kartı ile geliştirebilir.
GebraBit MS5637.h başlık dosyası
Bu dosyada sensörün veya entegrenin veri sayfası baz alınarak tüm adres kayıtları, her kaydın değerleri “Enum” şeklinde tanımlanır. Ayrıca MS5637 sensörünün kasası ve MS5637 sensör iç bloklarının her birine ilişkin konfigürasyonlar GebraBit_MS5637 adı ile bir “STRUCT” şeklinde tanımlanmıştır. Son olarak Debug Session ortamında her blokla ilgili tüm konfigürasyonlar gerçek zamanlı olarak görülebilmektedir.
USER REGISTER MAP
The registry map or sensor commands are defined in this section:
/************************************************
* USER REGISTER MAP *
***********************************************/
#define MS5637_RESET (0x1E)
#define MS5637_PRESSURE_SAMPLING_START (0x40)
#define MS5637_TEMPERATURE_SAMPLING_START (0x50)
#define MS5637_ADC_READ 2(0x00)
#define MS5637_PROM_READ (0xA0) ////0xA0 TO 0xAE
#define MS5637_ADD 0x76 /* I2C Address */
#define MS5637_WRITE_ADD 0xEC
#define MS5637_READ_ADD 0xED
#define MS5637_I2C &hi2c1
/*----------------------------------------------*
* USER REGISTER MAP End *
*----------------------------------------------*/
/************************************************
* Register Values Begin *
***********************************************/
#define MS5637_OSR_256_CONVERSION_TIME 1
#define MS5637_OSR_512_CONVERSION_TIME 2
#define MS5637_OSR_1024_CONVERSION_TIME 3
#define MS5637_OSR_2048_CONVERSION_TIME 5
#define MS5637_OSR_4096_CONVERSION_TIME 9
#define MS5637_OSR_8192_CONVERSION_TIME 17
#define ADC_DATA_BUFFER_SIZE 3
#define PROM_DATA_BUFFER_SIZE 14
#define SEA_LEVEL_PRESSURE 101325
/*----------------------------------------------*
* Register Values End *
*----------------------------------------------*/
MS5637_Output_Sample_Rate Enum
The values of this enum are used to select the OSR of the sensor:
typedef enum Output_Sample_Rate
{
OSR_256 = 0x00 ,
OSR_512 = 0x02 ,
OSR_1024 = 0x04 ,
OSR_2048 = 0x06 ,
OSR_4096 = 0x08 ,
OSR_8192 = 0x0A
} MS5637_Output_Sample_Rate;
MS5637 struct
All sensor properties, calibration coefficients and sensor data are defined in this “struct” and All the information and configuration implemented on the sensor are stored in this “structure” and you can see the changes in each part of the sensor in the “Debug Session” environment.
typedef struct MS5637
{
uint8_t Register_Cache;
MS5637_Output_Sample_Rate PRESSURE_SAMPLE_RATE;
MS5637_Output_Sample_Rate TEMPERATURE_SAMPLE_RATE;
uint8_t PROM_DATA[PROM_DATA_BUFFER_SIZE];
uint16_t C1;
uint16_t C2;
uint16_t C3;
uint16_t C4;
uint16_t C5;
uint16_t C6;
uint16_t CRC_SERIAL_CODE;
uint8_t ADC_DATA[ADC_DATA_BUFFER_SIZE];
uint32_t ADC_RAW_PRESSURE;
uint32_t ADC_RAW_TEMPERATURE;
int32_t DT;
int64_t T2;
int64_t OFF2;
int64_t SENS2;
int64_t OFF;
int64_t SENS;
float TEMPERATURE;
float PRESSURE;
double ALTITUDE;
}GebraBit_MS5637;
Declaration of functions
At the end of this file, all the functions for reading and writing in MS5637 registers, sensor configuration and receiving data from the sensor are declared:
/********************************************************
* Declare Read&Write MS5611 Register Values Functions *
********************************************************/
extern void GB_MS5637_Burst_Read(uint8_t regAddr, uint8_t *data, uint16_t byteQuantity);
extern void GB_MS5637_Write_Command( uint8_t cmd);
/********************************************************
* Declare MS5611 Configuration Functions *
********************************************************/
extern void GB_MS5637_Soft_Reset ( GebraBit_MS5637 * MS5637 ) ;
extern void GB_MS5637_Read_PROM ( GebraBit_MS5637 * MS5637 ) ;
extern void GB_MS5637_Read_Factory_Calibrated_Data ( GebraBit_MS5637 * MS5637 ) ;
extern void GB_MS5637_Pressure_Sample_Rate(GebraBit_MS5637 * MS5637 , MS5637_Output_Sample_Rate rate) ;
extern void GB_MS5637_Temperature_Sample_Rate(GebraBit_MS5637 * MS5637 , MS5637_Output_Sample_Rate rate) ;
extern void GB_MS5637_Start_Pressure_Sampling(GebraBit_MS5637 * MS5637) ;
extern void GB_MS5637_Start_Temperature_Sampling(GebraBit_MS5637 * MS5637) ;
extern void GB_MS5637_initialize( GebraBit_MS5637 * MS5637 ) ;
extern void GB_MS5637_Read_ADC ( GebraBit_MS5637 * MS5637 ) ;
extern void GB_MS5637_Read_ADC_Raw_Pressure(GebraBit_MS5637* MS5637) ;
extern void GB_MS5637_Read_ADC_Raw_Temperature(GebraBit_MS5637* MS5637) ;
extern void GB_MS5637_Calculate_Temperature(GebraBit_MS5637* MS5637) ;
extern void GB_MS5637_Calculate_Temperature_Compensated_Pressure(GebraBit_MS5637* MS5637) ;
extern void GB_MS5637_Altitude(GebraBit_MS5637 * MS5637);
GebraBit_ MS5637.c source file
C dilinde yazılmış olan bu dosyada, tüm fonksiyonlar en ince ayrıntısına kadar yorum satırına alınmış ve fonksiyonların argümanlarında alınan tüm parametreler ve bunların döndürdüğü değerler açıkça açıklanmıştır, bu nedenle sadece açıklamalarla yetiniyoruz ve kullanıcıları daha fazla bilgi için doğrudan bu dosyaya bakmaya davet ediyoruz.
Keil’deki örnek program
STM32CubeMX ile Keil projesini yapıp GebraBit tarafından sağlanan “GebraBit_MS5637.c” kütüphanesini ekledikten sonra örnek eğitimin “main .c” dosyasını inceleyip Keil derleyicisinin “Debugging” ortamında “watch” kısmında GebraBit_MS5637 modülünün çıktısını görüntüleyeceğiz.
“Main.c” dosyasının açıklaması
“main.c” dosyasının başlangıç kısmına dikkatlice bakarsanız, GebraBit MS5637 modülünün gerektirdiği yapılara, Enum’lara ve işlevlere erişmek için “GebraBit_MS5637.h” başlığının eklendiğini fark edeceksiniz. Bir sonraki kısımda, GebraBit_MS5637 yapı tipinin MS5637_Module adlı bir değişkeni (bu yapı GebraBit_MS5637 başlığındadır ve GebraBit_MS5637 kütüphane açıklama bölümünde açıklanmıştır) GebraBit MS5637 modülünün yapılandırması için tanımlanmıştır:
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
GebraBit_MS5637 MS5637_Module;
/* USER CODE END PTD */
In the next section of the written code, we initialize the GebraBit MS5637 module using the GB_MS5637_initialize (&MS5637_Module) function, and finally, in the while part of the program, the data is read from the sensor and the pressure, temperature, and height values are continuously received:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
GB_MS5637_Calculate_Temperature(&MS5637_Module);
GB_MS5637_Calculate_Temperature_Compensated_Pressure(&MS5637_Module);
GB_MS5637_Altitude(&MS5637_Module);
}
/* USER CODE END 3 */
}
STLINK V2
STM32CubeMX kullanarak Keil projesini oluşturup kütüphaneyi ekledikten sonra STLINKV2 adaptörünü kullanarak STLINK V2 programlayıcıyı Gebra STM32F303‘e bağlıyoruz.
STLINK V2 programlayıcısını Gebra STM32F303’e bağladığınızda, modüle güç vermeye gerek kalmaz çünkü besleme voltajını doğrudan STLINK V2 programlayıcısından alacak.
Sonra Build (F7) a tıklayıp Build Output penceresin olası hatalar için kontrol ediyoruz.
Son olarak “Debug” moduna girip “watch” penceresine “MS5637_Module” ekleyip programı çalıştırarak GebraBit MS5637 modülünün basınç, sıcaklık ve yükseklik değişikliklerini görebiliriz: