STM32F429 DISCOVERY etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
STM32F429 DISCOVERY etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

26 Temmuz 2015 Pazar

74HC595 Kullanımı






74 HC 595 entegresi piyasada çok sık kullanılan entegrelerden biridir.  Bu entegre seri olarak girilen verinin veya datanın paralele dönüştürmesini sağlar. [1]  Bu entegre, 8-bit seri giriş, paralel çıkış ve 8-bit D tipi flip-floba (latch) sahiptir. Bu entegre 8-bit seri olarak verdiğimiz dataları içinde depolar sonra  onları biz istediğimiz zaman parelele dönüştürür. Yani 75HC595 entegresinin DS pinine bir mikrodenetleyici tarafından 8-bit veri gönderilir ve sonra onlar Q1’den Q7 kadar o seri bit çıkışta gösterilir.  Tabi bunlar benim böyle anlattığım gibi direk olmuyor. Bazı kurallar var onlara göre yapmak gerekir. 




Özellikleri:

  •   İşlem yapması için gerekli çalışma gerilimi minimum 2V, maksimum 6V olamalıdır.

  •    Maksimum çekeceği akım bu entegrenin 80 uA’dir.

  •   Kaskad bağlama özelliğine sahiptir. 74HC595’in 9.pini yardımıyla bir başka 74HC595 ile kaskad bağlanabilir.

  •   Kaydırma frekansı 100Mhz.
 
 



 
Yukarıda 74HC595 hakkında pin açıklamaları verilmiştir. Gayet açık bir şekilde her bir pinin ne işe yaradığını belirtiyor tablo. Bizimyapmamız gereken şey, DS pinine seri olarak datalarımızı göndermek ama bunu yaparken her data için bir clock gerekiyor. Clock SH_CP pinine uygulanır. Her yükselen kenar clock’unda  seri olarak gönderdiğimiz datalar 74HC595 kabul eder. Sonra 8-bit data seri olarak gönderildikten sonra ST_CP lojik 1 durumuna çıkarılır çıkışlar gönderdiğimiz datalara göre aktif olur. Şunu unutmamız gerekir, datalar seri olarak gönderilmeye başladığında ST_CP lojik 0, dataların hepsi gönderildikten sonra lojik 1 yapılır.
 
Bu entegrenin kullanım amaçları şunlar; Kullandığınız mikrodenetliyice pin sıkıntısı sorunu varsa siz bu entegreyi kullanarak o sorunu çözebilirsiniz. Yani, mikrodenetleyicinizin minimum üç pini kullaranak  siz  74HC595 yardımıyla 8 pine çıkarabilirsiniz. Mikrodenetleyicilerde satır LCD ekran sürmek için çok fazla pine ihtiyaç vardır ama bu entegre yardımıyla  satır LCD ekran sürebilirsiniz. Led uygulamalarında kullanılabilir, örneğin dot matrixli uygulamalarda.
Ben bu çalışmamda mikrodenetliyici olarak st firmasının ürettiği STM32F429-DISCOVERY kullanacağım ve yapacağım çalışma mikrodenetleyicinin sadece üç pinini kullanarak 74HC595 ile  8 adet led süreceğim. Bunları yaparken  SPI(Serial Peripheral Interface)   donanımında yararlanacağım. Bu donanımdan stm32f429 altı tane SPI’a sahiptir.
Kısaca devre şeması aşağıdaki gibi oluyor.
 
 
 
 
 
Yazılım Keil uVision5 ile yazılmıştır. SPI modu kullanılarak yazılımıştır.
#include "stm32f4xx.h"
#include "defines.h"
#include "tm_stm32f4_delay.h"
#define KIRMIZI_LED_YAK  GPIO_SetBits(GPIOG,GPIO_Pin_14)
#define YESIL_LED_YAK  GPIO_SetBits(GPIOG,GPIO_Pin_13)
void gpio_config(void);
void spi_config(void);
void send_byte(uint8_t val);
uint8_t say=0;
int main() {    
                        SystemInit();
                   TM_DELAY_Init();
                        gpio_config();
                        spi_config();
                        while(1){         
                                                KIRMIZI_LED_YAK ;
                                                send_byte(say);
                                                YESIL_LED_YAK;
                                                say++;
                                                Delayms(100);
                                                if(say==256) say=0;
                        }
 
}
void gpio_config(void){
                        GPIO_InitTypeDef GPIO_InitStructure;         
                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
 
                        /*PG13 VE PG14 CIKIS YAPILDI*/
                         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
                          GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
                          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14;
                          GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
                          GPIO_Init(GPIOG,&GPIO_InitStructure);
 
                        /*PB0 CIKIS YAPILID*/
                          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
                          GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
                          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
                          GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
                          GPIO_Init(GPIOB,&GPIO_InitStructure);
                       
                          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
                          GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
                          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;
                          GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
                          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                          GPIO_Init(GPIOA,&GPIO_InitStructure);
                        /*PA5 VE PA7 SCK VE MOSI YAPILDI*/         
                          GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
                          GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);
}
 
 
void spi_config(void){
                          SPI_InitTypeDef SPI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);           SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
                           SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
                           SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
                           SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
                           SPI_InitStruct.SPI_Direction=SPI_Direction_1Line_Tx;
                          SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
                           SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
                           SPI_InitStruct.SPI_NSS=SPI_NSS_Sof;
                           SPI_Init(SPI1,&SPI_InitStruct);
                 SPI_Cmd(SPI1,ENABLE);
}
 
void send_byte(uint8_t val){
    GPIO_ResetBits(GPIOB, GPIO_Pin_0); // ST_CP low
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_SendData(SPI1, val);
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
    GPIO_SetBits(GPIOB, GPIO_Pin_0); // ST_CP high
}
 
 
Bu kod,  say değişkeni 100ms aralıkla 0’dan 255 kadar sayıp onları ledlerle ifade ediyor. Örnegin, eğer say 255 eşit olduğunda bütünledler yanar veya say 1 eşit olduğunda sadece QA’ya bağlı led yanar veya 2’ye eşit olduğunda  QB yanar.   
 
ÇALIŞMA VİDEOSU
 
 
 
HAKAN  AYDIN
 
Kaynaklar
[1].PIC PROGRAMLAMA TEKNIKLERI VE PIC16F877A, ALTAŞ YAYINCILIK
4. https://github.com/devthrash/STM32F4-examples/blob/master/SPI/main.c
 
 

24 Mayıs 2015 Pazar

STM32F429-DISCOVERY İLE HC-SR04 MESAFE SENSORU


          


 Bu çalışmamda daha önce radar projemde kullanmış olduğum mesafe sensörünü kullanarak stm32f429 kiti ile bağlantı kurup ve mesafeyi ölçümü yapacağım. Bu kiti üç ay önce almıştım fakat üniversitem o zaman başladığı için vakit bulamadığımdan kullanmaya başlayamamıştım. Bu çalışmamda basit bir mesafe ölçümü uygulaması yapılarak stm32f429 ile ARM'a giriş yaptım ve bu çalışmamada şimdilik kod yazımında hazır kütüphaneler kullanıldı. Kod'u yazarlen derleyici olarak Keil uVision5 programında  faydalanıldı.





      Yukarıdaki resim STM32F429 Discovery kitidir. Bu kit üzerinde kullan mikrodenetliyicimiz STM32F429ZIT6  ve üzerinde L32D20 ST NEMS 3- axis Gyroscope, Led(kırmızı, yeşil), Buton, USB OTG micro-B girişi, 2.4"" TFT LCD  vardır. STM32F429ZIT6  mikro denetleyicisi 2MB flash belleği, 256 KB RAM'i, 3 ADCs, 17TIMs,Uart, ethernet vardır. Bu denetliyici  ARM Cortex-M4 32-bit'tir. Dokunmatik ekranın özelliği TFT LCD (Thin-film-transistor liquid-crystal display) 240x320 dots.  Toplam 157 tane giriş ve çıkış pini vardır.



       Mesafe ölçümünde kullanacağım sensör HC-SR04'dür. Radar projemde genel olarak nasıl çalıştığını anlatmıştım. Şimdi kısaca tekrar yazacağım;


 40Khz frekansında bir ses sinyali verici sensörü ile ortama iletilir sonra bu gönderilen ses sinyali cisme çarparak geridöner ve

 
sensörü bu sinyali algılar. Mikro denetliyicimiz bu gönderilen ve gelen ses sinyalinin arasındaki zaman farkını hesaplayarak mesafe bulunur. Buda matematiksel olarak şöyle bulunur. Mikrodenetliyimiz HC-SR04 sensörü ile cisim arasındaki ses sinyalinin gidiş ve dönüş arasındaki zamanı ölçsün ve biz buna "t" diyelim. Ve daha sonra biz bu "t"'yi ses hızı ile çaparak 2'ye bölersek mesafeyi bulmuş oluruz. MESAFE=(t*Ses_Hızı)/2

Keil'de yazılan kodumuz ;


/* Include core modules */
#include "stm32f4xx.h"
#include
#include
/* Include my libraries here */
#include "defines.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_emwin.h"
#include "tm_stm32f4_hcsr04.h"
/* GUI modules */
#include "button.h"
#include "DIALOG.h"
char ac[4];
char k[4];
int distance;
int x0 = 120;
int y0 = 120;


int main(void) {
  uint8_t i;

 /* Initialize system */
 SystemInit();
 
 /* Initialize delay functions */
 TM_DELAY_Init();

 /* Initialize LEDs */
 TM_DISCO_LedInit();
 /* Initialize emWin */
 /*This function initialize LCD, SDRAM, STMPE811 touch and GUI  !!!*/
 if (TM_EMWIN_Init() != TM_EMWIN_Result_Ok) {
  /* Initialization error */
  while (1) {
     /* Toggle RED led */
     TM_DISCO_LedToggle(LED_RED); 
     /* Delay */
   Delayms(100);
  }
 }

 if (!TM_HCSR04_Init()) {
  /* Sensor is not ready to use */
  /* Maybe wiring is incorrect */
  while (1) {
      TM_DISCO_LedToggle(LED_GREEN);
      Delayms(100);
  }
 }

   GUI_SetBkColor(GUI_WHITE);
   GUI_Clear();
    
 while (1) {
      GUI_SetPenSize( 5 );
      GUI_SetTextMode(GUI_TM_TRANS);
      GUI_SetFont(&GUI_FontComic18B_ASCII);
      GUI_SetColor( GUI_BLUE );
  
     GUI_SetTextMode(GUI_TM_TRANS);
     GUI_SetFont(&GUI_FontComic18B_ASCII);
     GUI_DrawArc( x0,y0,110, 110,-30, 210 );
 
   for (i=0; i<= 22; i++) {
     
     float a = (-30+i*10)*3.1415926/180;
     int x = -100*cos(a)+x0;
     int y = -100*sin(a)+y0;
   
      if (i%2 == 0)
        GUI_SetPenSize( 5 );
      else
        GUI_SetPenSize( 4 );
   
      GUI_DrawPoint(x,y);
     
      if (i%2 == 0) {
          x = -80*cos(a)+x0;
          y = -80*sin(a)+y0;
          sprintf(ac, "%d", 10*i);
          GUI_SetTextAlign(GUI_TA_VCENTER);
          GUI_DispStringHCenterAt(ac,x,y);
      }     
    }   
   
       distance = TM_HCSR04_Read();
       GUI_ClearRect(0, 200, 320, 240);
       GUI_SetColor( GUI_RED );
       sprintf(k, "%d",distance);
   
       GUI_SetFont(&GUI_Font8x16);
       GUI_DispStringAt("The result is: ",5,210); // Disp text
       GUI_SetColor( GUI_BLACK );
       GUI_SetFont(&GUI_Font24_1);
       GUI_DispStringAt(k,130,210);
       GUI_SetColor( GUI_RED );
       GUI_DispStringAt("cm",170,210); // Disp text
 
       GUI_SetColor( GUI_BLUE );
       GUI_SetPenSize( 4 );
       GUI_DrawLine( x0,  y0, -65*cos((-30+distance)*3.1415926/180)+120 , -65*sin((-30+distance)*3.1415926/180)+120);  
       GUI_Delay(10);
      GUI_SetColor( GUI_WHITE );
      GUI_DrawLine( x0,  y0, -65*cos((-30+distance)*3.1415926/180)+120 , -65*sin((-30+distance)*3.1415926/180)+120);


   }
}

Çalışma Videosu