STM32F4 Discovery - Vizeler

Başlatan bunalmis, 24 Aralık 2011, 15:13:13

GreeN

#165
Arkadaşlar ADC de  injected ve regular kanallar arasındaki fark nedir anlayamadım? Yani  nerede hangisi kullanılır.

Edit:İnjected kanallar clock pulsleri dışardan alanlarmı?
Terörü Lanetliyoruz.

fryrmnd

yok hocam regular grup da dışardan trigger oluyor gözüküyo. neden böyle bir ayrım var ben de bilimiyorum

GreeN

Evet söylediğin doğru. Sanırım injected olarak ayarlanmış bir adc de kullanılan kanallardan bir adc sonucu bitmeden diğer bir kanaldan istediğimiz bir anda 2. okumayı yapabiliyoruz.  Karışık oldu ama .... mesela injected olarak ayarlanmış ADC1 'e ait 2 kanal düşünelim , 1. kanaldan adc çevrimini başlattım , adc sonucunun ADC injected data register'e yazılabilmesi için geçen süre sampling + convertion olacak  (3 clk + 12 clk). 1. kanalda sampling süresi geçtikten sonra ADC1 in diğer bir kanalından 2. adc çevrimine başlayabiliyoruz. Regularda bu yok . Bu konuyu aslında Simultaneous(eş zamanlı) çalışma ile karıştırdım.  Ama eş zamanlı çalışmada ADC1 ve ADC2 kanalları kullanılıyor. dsPIC'lerde sequential çalışma gibi değilmiş. Regularde ise sanırım herşey sıra ile oluyor.

Regular kanallarla injected kanllar birlikte de kullanılabiliyor galiba.. Baya karıştı . Vesselam...
Terörü Lanetliyoruz.

fryrmnd

anladım hocam. çevrim süresi bitmeden farklı kanaldan da çevrime başlayabiliyoruz. bu regular da yok. teşekkür ederim bilgilendirmeniz için. sadece microchip ile uğraşmış biri olarak bu st nin datasheet ler bana biraz daha karışık geldi. çok fazla tecrübemin olamaması da etken tabii.

pisayisi

injected grup stm32 modellerine göre değişmekle beraber 4 kanala kadar yazılım ya da donanımsal olarak tetiklenebilen ve bu tetikleme işlemi ile regular kanaldaki adc dönüşümlerini durduran bir adc yapısıdır. injected adc dönüşümü bitince regular kanallardaki dönüşümler devam edecektir. regular gruptan farklı olarak ta injected dönüşümde farklı birer sonuç ve ofset register ları mevcut.

Genelde injected adc işlemi motor kontrolu gibi  pwm işareti ile eşgüdümlü adc işlemi yapmak için kullanılıyor.
Murat

fryrmnd

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00258017.pdf

adc modlarının ne işe yaradığı, ne tarz uygumalarda kullanılabileceği hakkında bir uygulma notu.

gambit1244

#171
Alıntı yapılan: bunalmis - 26 Aralık 2011, 22:32:57
Bu baslik altinda bir arkadasin LIS302DL MEMS motion sensor ile ilgili sorusu vardi. Ornek kodlardaki MEMS uygulamasini tekrar denedigimde bazen tutarsiz davrandigini gordum.

Asagidaki programda, karti elinizle tutup egdikce ledler egilen yonde isildiyor.

#include "STM32F4xx.h"
 
unsigned short PWM[8];  // PWM registerler
unsigned short SRG[8];  // Shadow Registerler
unsigned short CNTR;    // PWM Counter
signed char who,x,y,z,xo,yo,zo;   


/*****************************************************************************************************
         CPU PLL ile 168Mhz de kosturulur
         AHB frekansy 168 Mhz
         APB1 frekansy 42 Mhz
         APB2 frekansy 84 Mhz
*****************************************************************************************************/
void SystemInit()
{
unsigned int i;
     for (i=0;i<0x00100000;i++);     // OSC oturtma ve kurtarma rutini
     RCC->CFGR |= 0x00009400;        // AHB ve APB hizlarini max degerlere set edelim
     RCC->CR |= 0x00010000;          // HSE Xtal osc calismaya baslasin        
     while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
     RCC->PLLCFGR = 0x07402A04;      // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
     RCC->CR |= 0x01000000;          // PLL calismaya baslasin  (Rehber Sayfa 95)
     while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
     FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
     RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
     while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
     RCC->AHB1ENR |= 0x0000001F;     // GPIO A,B,C,D,E clock'u aktif edelim 
     GPIOD->MODER  = 0x55550000;     // GPIOD nin 15, 14, 13, 12, 11, 10, 9, 8 pinleri cikis tanimlandi (LEDler icin)
     GPIOD->OSPEEDR= 0xFFFFFFFF;     // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 

//  GPIOA da A7, A6, A5 pinleri, LIS302DL cipiyle haberlesmek icin SPI moduna alinacak   
 
     GPIOA->AFR[0]=0x55500000;       // SPI1 secelim (Rehber Sayfa 141), Hard Sayfa 49
     GPIOA->MODER|=0x0000A800;       // A7,A6,A5 Alternatif fonksiyon
     RCC->APB2ENR|=0x00001000;       // SPI1 clk enable   //   GPIOE3 pinini output tanimlayalim (LIS302DL SPI/I2C secimi)   
     GPIOE->MODER  = 0x00000040;     // GPIOE nin 3 nolu pini cikis tanimlandi
     GPIOE->OSPEEDR= 0xFFFFFFFF;     // GPIOE nin tum cikislari en yuksek hizda kullanacagiz
     GPIOE->BSRRL=0x0008;            // GPIOE3=1; LIS302DL CS=1   
     SPI1->CR1=0x00000B7F;           // SPI1 16 bit, master , fulldublex vs
     SPI1->CR2=0X0000;

     RCC->APB1ENR|=0x00000020;       // Timer7 CLK'u aktif edelim (84 Mhz)
     TIM7->CR1=0x0080;               // Otomatik Reload
     TIM7->PSC =839;                 // Prescaler degerimiz 839, Count frekansimiz = fCK_PSC / (Yuklenen Deger + 1) 84E6 / (840) = 100 KHz
     TIM7->ARR =1;                   // Counter, Decimal 1 olunca basa donsun. Her 20 mikrosaniye de bir timer int olusacak.
     TIM7->DIER=0x0001;              // Update Int enable
     NVIC->ISER[1] = 0X00800000;     // NVIC de Timer 7 interrupta izin verelim
     TIM7->CR1|=0x0001;              // Counter Enable
     
} 

void TIM7_IRQHandler()
{
unsigned short d,i,j;
 
    TIM7->SR=0;                       // Timer Int Flagini silelim 
    d=GPIOD->ODR | 0xFF00;
    CNTR++;
    if(CNTR>=255)
      {
        CNTR=0;
        for(i=0;i<8;i++) 
         { 
           if(PWM[i]>255) PWM[i]=255;
           SRG[i]=PWM[i]; 
         }  
      }
    j=0x8000;
    for(i=0;i<8;i++)
      {
       if (CNTR>=SRG[i]) d&=~j;
       j=j>>1;
      } 
    GPIOD->ODR=d;
} 

void Write(char Adr,unsigned char Data)
{
      GPIOE->BSRRH=0x0008;            // LIS302DL CS=0
      SPI1->DR=((Adr&0x3F)<<|Data;
      while(!(SPI1->SR&2));
      GPIOE->BSRRL=0x0008;            // LIS302DL CS=1
}   
 
char Read(char Adr)
{
char Dat; 
      GPIOE->BSRRH=0x0008;            // LIS302DL CS=0
      SPI1->DR=((Adr&0x3F)|0x80)<<8;
      while(!(SPI1->SR&1));
      Dat=SPI1->DR;
      GPIOE->BSRRL=0x0008;            // LIS302DL CS=1
      return(Dat);
}   

int main()
{
int i;
      if(Read(0x0F)==0x3B)   // Who are you ?
       {
          Write(0x20,0x47);  // Data Rate=100Hz, Full Scale=2g, Activate, x,y,z enable
          while(1)
            {
               who=Read(0x27); // Statusu ogrenelim. Kim hazir kim deðil?
               if (who&1) 
                {
                  x=(Read(0x29)+xo);
                  xo=x>>1;
                  if (x>=0) PWM[0]=x;
                  else PWM[2]=-x;
                }  
               if (who&2) 
                {
                  y=Read(0x2B)+yo;
                  yo=y>>1;
                  if (y>=0) PWM[1]=y;
                  else PWM[3]=-y;
                }  
               if (who&4) 
                {
                  z=Read(0x2D);
                }  
            }
       }
       
      TIM7->DIER=0x0000;              // Update Int disable
      while(1)
       {
         for(i=0;i<0x1000000;i++);
         GPIOD->ODR^=0x0000F000;
       }  
       
}




hocam iyi geceler.
bir konuda yardımınıza ihtiyacım var
logic anayzerimi spi moduna ayarladım
önce yüksek değerli bitler
sonrada düşük değerlikli bitler first olarak sample aldım
program çalışmaya başlar başlamaz
bu data geliyor
configuration ayarları gibi sanırım
fakat buradaki değerler ile yukarıdaki programın değerleri arasında
if(Read(0x0F)==0x3B)   // Who are you ?
daki 0x0F dışında hiçbir değer tutmuyor bende hangisini bizim gönderdiğimizi hangisinin sensörden gelen açı bilgisi olduğunu ayırt edemiyorum
eğer birazcık ipucu verirseniz bu şeyi çozmek istiyorum
datalara dikkat ettinizmi bilmiyorum yada sizdede logic analyzer vardır mutlaka
bu datalar doğru gelmişmi mosi ile miso datalarında sanki bi gariplik var yada ben çözemedim mesela resimde bakarsanız
0x22 ile 0xFF
0x13 ile 0x17
0x03 ile 0x8B
alt alta geliyor bunlar neye göre gidip geliyor 3 gündür bakıyorum datasheetlerede fakat bir ucundan yakalayamadım işi
derdimi anlatabilmişimdir umarım biraz uzun oldu :(
şimdiden cok teşekkür ederim herkese iyi geceler...
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

muhittin_kaplan

Gambit Neden Dataları Görmek İstiyorsun ?
SPI ile gönderilen
0x27
0x28
0x29
adreslerden X,Y,Z bilgileri alınıyor.
0x20 adresinde Config ayarlanıyor.
bunları için Sensörün Datasına Bak..

gambit1244

Alıntı yapılan: muhittin_kaplan - 05 Şubat 2012, 10:39:22
Gambit Neden Dataları Görmek İstiyorsun ?
SPI ile gönderilen
0x27
0x28
0x29
adreslerden X,Y,Z bilgileri alınıyor.
0x20 adresinde Config ayarlanıyor.
bunları için Sensörün Datasına Bak..



hocam dedikleriniz doğru fakat neden ben bunları logic analyzer ile göremiyorum onu anlamış değilim ayarlarınımı yanlış yapıyorum bilemedim...
gönderip aldığımı gormeden başlarsam cok zorlanırım ileride.
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

#174
Bu kodda bir zamanlar hata vardi. Daha sonra nedeni anlasildi ve duzeltildi.

Asagidaki program parcasi uzerinde calisin.

https://www.picproje.org/index.php/topic,35896.msg269160.html#msg269160
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

#175
Alıntı yapılan: bunalmis - 05 Şubat 2012, 16:15:53
Bu kodda bir zamanlar hata vardi. Daha sonra nedeni anlasildi ve duzeltildi.

Asagidaki program parcasi uzerinde calisin.

https://www.picproje.org/index.php/topic,35896.msg269160.html#msg269160

hocam cok teşekkür ederim..
son düzeltilmiş örneği ve datasheetleri iyice kurcaladıktan sonra biraz yol katettim diyebilriim
spi iletişim mantığına göre gönderilen 8 bitlik datanın
ilk 2 biti read write ve multiple okuma ayarlarını barındırdığı için bunları gözardı ediyormuşuz
yani logic analyzerden
1000 0111 yani 87 datası geliyorsa bunu
xx00 0111 yani 07 olarak okumamız gerekiyormuş



fakat ufak bir sorum daha var mazur görün.

signed char Read(char Adr)
{
      return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
}

şu minik programcıkta
b=Read(0x29) dedik mesela
şimdi read yaparken

return(SPI_CMD(((Adr&0x3F)|0x80)<<8 ));
satırında adr yerine 0x29 yazarsak

29= 0010 1001
3F= 0011 1111
& =  0010 1001  = 29
80= 1000 0000
|   = 1010 1001 = A9 buluyoruz

0xA9 u <<8 yaparsakta sağdan 8 sıfır ile besleyerek 0x00 bulmazmıyız
yani read adr yerine ne yazarsak yazalım sonuç 0x00 olarak dönmüyormu yoksa ben biyerdemi saçmalıyorum anlayamadım :(

aynı şekilde
return(SPI_CMD(((Adr&0x3F)<<8 )|Data));

buradaki write programcığındada adres değeri ne olursa olsun en sonunda silinip yerine data yazılmıyormu ozaman adres değerini yazmanın ne anlamı var anlayamadım
saygılar.
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

Bizim kullaniminizda SPI registerleri 16 bit.
CM4 nun SPI registerlerine bir goz atin.

Bir de haberlestigimiz cipin komut setine bakin. Bit treninde adres nereye yerlesiyor veri nereye yerlesiyor bakin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Hocam Bu arada Başka Örnek Program verecekmisiniz  :-[
ADC gibi yada Kartın üzerindeki DAC gibi

muhittin_kaplan

CMIS da bir anlamda iyi olurdu. Nasıl Kullanılır, nelerden oluşur, Kimdir nedir, Ayımıdır Kurtmudur, Çalımıdır Murt mudur

z

Su siralar yogun oldugum icin hizim kesildi kartla pek ilgilenemiyorum. Fakat bunca kart sahibinden de artik ornek programlar bekleme zamani geldi diye dusunuyorum. Kart uzerindeki Audio DAC icin ornek diyorsan bu cipi tanimak bir hayli ugrastirici. Bana cok da cazip gelmedigi icin registerlerine detayli inceleme ihtiyaci duymadim.

Eger sizin de bu cipe odaklanma durumunuz yoksa STM nin bu ciple uygulamalarinin bulundugu ornek programlarda kullanilmis hazir fonksiyonlari kullanabilirsiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com