STM32 internal temp sens ve Vref int Kullanımı

Başlatan mistek, 18 Haziran 2015, 12:07:32

mistek

STM32F0 içerisinde bulunan sıcaklık sensörü ve Vref'i kullanmak istiyorum ancak halen ne şekilde kullanacağımı anlayabilmiş değilim.

Nedir ne işe yarar dışarıdan verdiğimiz Vref yerine bu iç Vrefi mi kullanıyoruz.
Vrefint ADC değeri stabil 1700-1701 okuyorum. VDD ve VDDA 2.93V ölçüyorum voltmetre ile.
Vrefint Dahasheet değeri Typ 1.2V

Aslında şunu yapmak istiyorum. Benim VDD gerilimim sıcaklıkla çok fazla değişiyor ve ADC değerleri sapma gösteriyor. Vrefint arasında bi bağıntı kurmak istiyorum.

Mesela oranlama yaparak
VDDA = 4095(12bit) * 1.2V(Vrefint) / 1700(Vrefint adc değeri)
VDDA = 2.89V diyebilir miyim?

Kafam karıştı.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

STM32'lerde  internal VREF  diğer kontrolcülerden biraz farklı.
Aslında internal Vref dediği  AVDD voltajının karşılığı.   Yani AVDD değişince IntVref diye ADC'den okuduğumuz değer de değişir. bu değerden AVDD değeri hesaplanır ve işlem ona göre yapılır.
Her çip için  AVDD = 3.0V iken  bu değer ölçülüp, çip içerisinde option byte bölgesinde bir yere yazılır. Datashettte bahsedilen 1.2V  işte bu değeri ölçebilmek için kullanılan referans değeri. Doğrudan bu değeri kullanamıyorsunuz.
Önce  fabrika tarafından ölçülerek kaydedilmiş olna INTREFCAL değerini okuyacaksınız. bu değer AVDD = 3V iken alınmıştır.  bu değeri 3 ile çarpıp  sizin ADC'den okuduğunuz ( 1700 stabil dediğiniz) değere böleceksiniz.
AVDD = 3.0 * INTREFCAL / ADCVAL formülüne koyarak  AVDD değerini bulabilirsiniz.

mistek

Hocam 3voltta kalibrasyon yapıp çipe yazarken 3 e bölüp mü yazmışlar anlamadım ?
INTREFCAL değerini nasıl okuyacağımı Std_lib içerisinde bulamadım hangi bölümde yer alabilir ? Bununla ilgili app note vardır muhtemelen...
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

#3
AVDD'ye tam 3.0V verip  ADC'nin IntVref kanalından okudukları değeri çip içine kaydediyorlar.   Sizin de AVDD geriliminiz 3V iken  burada yazan değeri okumanız gerekiyor. Ancak fabrika kalibrasyonu bazı serilerde yok bildiğim kadarıyla. Hangi seride olmadığını bilmiyorum.  STM32L serisinde var.  Datasheette  fabrikada ölçülen değerin kaydedildiği adres mevcut. Eğer yoksa AVDD geriliminizi ve bu gerilimdeki intref değerini ölçün ve   
bu değerileri saklayın.   ADC'den gelen herhangi bir veriyi işleme sokmadan önce intref kanalındaki değeri alın ve

kalirasyon_voltajı * kalibrasyon_intref değeri /  şimdiki_intref_değeri formülü ile o an AVDD voltajınızın  Volt cinsinden değerini bulun.

sonra diğer kanallardaki voltajı  hesapladığınız  AVDD voltajına göre  4095/AVDD * ADC_Okunan formülü ile  hesaplayın. 

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00035957.pdf

INTREFCAL değerini ST_Lib ile okumak için bir fonksiyon yok bildiğim kadarıyla. Çipe göre adres değişiyor. Belki vardır ama ben araştırmadım. Datasheetten adresi bulup, buradan okumanız gerek.

mistek

Sağolun hocam biraz karışıkmış araştırayım. Dışarıdan verdiğim AVDD'yi bi şekilde izleyebilirsem ADC sapmalarını bi nebze düzelteceğim çokta işime yarayacak.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Klein

Çok karışık değil aslında. Dışarıdan verdiğin AVDD intref kanalından ölçtüğün değer. Sadece o değerin kaç Volta karşılık geldiğini bilmen gerekiyor.  Bunun için de ya fabrika tarafından daha önce ölçülmüş değeri bulup kullanacaksın. Ya da AVDD'ye verdiğin voltajı ölçüp bu voltaja karşılık intref kanalından okuduğun değerle işlem yapacaksın.
Örnek

AVDD 3,2 Volt.  buna karşılık  intref kanalından 1600 okuyorsun.   bunu kalibrasyon değeri olarak bir kenara kaydettin.

şimdi ADC'nin başka bir kanalını okumamız gerek.
Önce intref kanalını okudun. Okuduğun değer değer 1700.
Daha önce kaydettiğin kalibrasyon değerlerini yerine koyarak AVDD değerini bulalım.

AVDD = Cal_Volt * Calrefval / Refval  =  3,2 * 1600 / 1700  = 3,011V   

Artık  AVDD değerimizin ne olduğunu biliyoruz. şimdi diğer ADC kanalımızın voltajını görelim.

ADC kanalından okuduğumuz değer  2150 olsun.  yerine yerleştirelim.

ADC_Volt =  AVDD / 4095 * ADC_Val = 3,01 / 4095 * 2150 = 1,58V

mistek

#6
Hocam açıklayıcı örnek için teşekkürler şimdi konuyu tam olarak anladım. Kalibrasyon değerini okumayla ilgili birkaç örnek buldum inceliyorum.

mesaj birleştirme:: 18 Haziran 2015, 23:46:51

Calibration value name Description Memory address
VREFINT_CAL          Raw data acquired at a temperature of 30 °C (± 5 °C), VDDA = 3.3 V (± 10 mV)          0x1FFF F7BA - 0x1FFF F7BB

Datasheette bu tabloyu buldum. İlgili adres bölgesini stlink utility programı ile okudum.

02-06 Hex: 602 Dec: 1538 olarak aldım.
Tabloda 3.3v olarak verildiği için işlemimi

AVDD = 3.3V * 1538 / 1701 formülünden yaptım.
AVDD = 2,984V

Voltmetre(Fluke 177) ile ölçtüğüm değer 2.96V

Herhalde doğrudur.
İşlemci içerisinde hafızada herhangi bir adresi nasıl okuduğumla ilgili kodlarımı bulursam örnek kodları buraya koyacağım...

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

justice_for_all

#define Ts_Cal1                      (*((sf_uint16*)0x1FFFF7B8))
#define Ts_Cal2                      (*((sf_uint16*)0x1FFFF7C2))

float Avg_Slope = ((float)(Ts_Cal1 - Ts_Cal2)) / (110 - 30);
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay