Cortex M3 çipleri STM32F103

Başlatan z, 08 Ocak 2013, 03:19:54

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

camby

- Hocam, kalibrasyondan sonra , ölçüm sonucu 0xFFF mi geliyor , yoksa kalibrasyondan çıkan değeri siz mi ekliyorsunuz ?

- kalibrasyondan sonra FFF dışında diğer ölçümler doğru mu peki , gözlemleyebildiniz mi ? Örneğin VDD/2 uyguladığımızda 0x7FF okuyabiliyor musunuz ?

z

#212
Kalibrasyon işleminden sonra artık 0xFFF okunuyor. Ben bir şey ilave etmiyorum.
Vdda/2 girdiğimde 7FF okuyorum.

Adamlar bu işi nasıl yapmışlar anlamadım ipucu da vermemişler.

Benim aklıma gelen, bir kereye mahsus bölme işlemi ve her ölçüm için çarpma işlemi gerekiyor.

Ama 6. hissim böyle değil diyor.

Düşünün ADC niz besleme gerilimini eksik ölçüyor. Hatayı buluyorsunuz.

Sonra öyle bir işlem yapıyorsunuz ki soft bir şey yapmadan ADC niz doğru sonucu göstermeye başlıyor.

Nasıl yapmışlardır?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

Vref dac ile besleniyor olabilir

z

#214
Bu çok önemli bir özellik olurdu hocam. Böyle bir özelliği bizlerin de kullanımına açarlardı.

Açmazlarmıydı? Başka yolları da olması lazım.

En azından geyik yaparız.

http://www-mtl.mit.edu/researchgroups/hslee/1207kara.pdf

http://eetimes.com/ContentEETimes/Documents/Schweber/C0976/C0976edited.pdf

http://renaud.dura.free.fr/EE/adc_calibration/Background%20Digital%20Calibration%20Techniques%20for%20Pipeline%20Adc.pdf
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#215
aslında kalibrasyon olarak açık durumda, bir voltaj girip bu benim FFF değerim buna göre bana çıkış ver diyoruz



içerisinde SAR ADC mevcut yani bir adet DAC mevcut

digital olarak çarp böl ekle ADC yi yavaşlatacağından ve sisteme entegrasyonu zor olacağından en ucuzundan r-2r mantığıyla Vref bölünerek DAC a girilirse
iş ucuz, kısa, hızlı ve esnek olarak çözülmüş olur. işin içinde 12 hassasiyet bit olunca başka yöntemler daha uğraştırıcı gibi geliyor

z

Girişe Vss verdim çıkışım 0x000 oldu.
Girişe Vdd verdim çıkışım 0xFC0 oldu.

SAR da Kalibrasyon nasıl olacak açıklayabilirmisin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com


z

#218
Şimdi sorun;

Adamlar Ref voltajı Vdda dan üretmişler. Vdda değişirse Vref de oynar. Vrefi ellerinden geldiğince iyi yapmışlardır. Ben ADC hatasının Vrefden kaynaklandığını düşünmüyorum.

Sorun kapasitörlerle yapılmış DAC devresindeki kapasitörlerin değer faklılıklarından kaynaklanıyor.

http://course.ee.ust.hk/elec692w/lecture6_sar_adc.pdf
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

http://www.aspdac.com/aspdac2011/archive/pdf/8B-3.pdf

burada yapılan bir teknikten bahsediliyor,

2. bir dac devresi mutlaka işin içinde oluyor ama hatta yük olarak ekleniyor  :o

SpeedyX

#220
Merhaba,

ADC1 ile 2 kanal voltaj ölçüyorum, yalnız bir acayiplik var. Devreyi resetlediğimde bazen kalibrasyon kayıyor.

Örneğin iki kanaldan 2795 ve 2819 değerleri okuyorum, daha sonra devreyi resetliyorum (bazen 3 defa resetleyince değişiyor) ve okuduğum değerler 2814 ve 2826 oluyor. Değerler birbirine yakın fakat giriş voltajım çok stabil, büyük kondansatörlerle dolu ve düşük geçiren filtreler kullanıyorum. Bazen 3-5 defa resetlediğimde bile ADC den aynı değerleri okuyorum, bazen ise birden değişme oluyor. Değişme aralığı da sabit değil, bazen 5 bazen 45 değer fark ediyor.

Bunun init de yaptığı kalibrasyon ile ilgili olabileceğini düşünüyorum, fikri olan var mı?

EDIT:
Bir sebep daha aklıma geldi:
ADC den DMA ile okutup RAM e yazıyorum ve RAM değişkeninden gelişi güzel (ADC okumasıyla senkronize olmayan bir şekilde RAM den) okuyup hesap yapıyorum... Burada RAM den okuma yapılırken DMA de yazma yaparsa, yada yazmanın yarısında okuma yaparsam işler biraz karışabilir. Böyle birşey mümkün müdür? Mümkünse 2 kanal ADC okuması bittikten sonra DMA in kesme oluşturmasını nasıl sağlayabilirim?

Klein

DMA_ITConfig (DMA_Channel, DMA_IT_TC, ENABLE);

SpeedyX

Alıntı yapılan: Klein - 20 Nisan 2013, 23:21:43
DMA_ITConfig (DMA_Channel, DMA_IT_TC, ENABLE);

Hocam yani 2. sebepten dolayı reset sonrası voltaj ölçümünde değişme olduğunu mu düşünüyorsun?

Alıntı YapADC den DMA ile okutup RAM e yazıyorum ve RAM değişkeninden gelişi güzel (ADC okumasıyla senkronize olmayan bir şekilde RAM den) okuyup hesap yapıyorum... Burada RAM den okuma yapılırken DMA de yazma yaparsa, yada yazmanın yarısında okuma yaparsam işler biraz karışabilir. Böyle birşey mümkün müdür?

Klein

Yok. Sadece NAsıl interrupt üretebilirim sorusunun cevabıydı.
Rastgele zamanlarda okumanın böyle bir soruna neden olacağını sanmıyorum. Sen Ram'ı okumaya başladıktan sonra DMA değeri güncellemeye çalışabilir. Ancak  o değer zaten register'e(r0..rn registerlerinden bahsediyorum) alınmış olacaktır. Yaptığın işlem registerdeki değer ile olacağı için, DMA'nın bu esnada adc değerini güncellemesinin bir etkisi olmayacaktır.

Sorunun açışışta işlettilen kalibrasyon prosödüründen kaynaklanabileceğini düşünüyorum.

Açılıştan sonra tek okuma yapıp duruyor musun?  Süreklimi okuyorsun?
Sürekli okuyorsan; bir kez hatalı hatalı okumaya başladı mı , kapanana kadar mı hatalı okuyor? yoksa ilk veri mi hatalı geliyor?
Resetlemeyi nasıl apıyorsun. Power-off-on şeklinde resetlediğinde veya harware veya software reset yaptığında , hatanın şeklinde bir değişiklik oluyor mu?

SpeedyX

#224
Hocam ben de aynı şekilde kalibrasyon prosedüründen kaynaklı olduğunu düşünüyorum. Sırayla sorularını denedim, cevaplar şöyle;

Alıntı yapılan: Klein - 21 Nisan 2013, 16:15:33
1- Açılıştan sonra tek okuma yapıp duruyor musun?  Süreklimi okuyorsun?
2- Sürekli okuyorsan; bir kez hatalı hatalı okumaya başladı mı , kapanana kadar mı hatalı okuyor? yoksa ilk veri mi hatalı geliyor?
3- Resetlemeyi nasıl apıyorsun. Power-off-on şeklinde resetlediğinde veya harware veya software reset yaptığında , hatanın şeklinde bir değişiklik oluyor mu?

1- Açılışta 4 kanal ADC1 i DMA ile kuruyorum, continious mode olarak sürekli okuyor. Hiç bir zaman durmuyor.
2- Kapanana kadar hep hatalı okuyor, yani örneğin şimdi denedim 1106 okuyor sürekli olarak, dakikalarca değişiklik yok. Daha sonra birkaç defa resetledim ve 1145 oldu, sonra tekrar resetledim 1165 oldu, tekrar 1120 oldu gibi...
3- USB den komut gönderiyorum ve program NVIC_SystemReset(); çağırıp kendini resetliyor. El ile reset pininden resetlemeyi denedim şimdi ve enerjiyi kestim, tekrar taktım defalarca denedim, bence hiç bir fark yok. Aynı davranıyor. İlk açılışta ADC Init kodunu geçtikten sonra zaten ADC ile ilgili bir işlem yapılmıyor.

Bence kesin ADC kodlarında bir sıkıntı var. Kod olarak senin paylaştığın DMA lı ADC kodlarını kullanıyorum, yalnız 4 kanal.
  ADC_Cmd(ADC1, ENABLE);
  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1));
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));

Başka kodlarda dikkatimi çeken; sample lar arası 20 cycle bekleme süresi gibi bir değer veriliyor. Bendeki kodda bu yok.
Tüm kodu buraya yapıştırdım: http://pastebin.com/d521NaKi