Ynt: Baştan Sona STM32F0 Discovery Uygulamaları

Başlatan MrDarK, 09 Nisan 2015, 02:29:35

baran123

20 Nisan 2015, 18:56:28 #15 Son düzenlenme: 20 Nisan 2015, 18:57:49 Baran Ekrem
Bundan sonra videoda eklerim :)
https://youtu.be/vL1IprqhMmE

mesaj birleştirme:: [time]21 Nisan 2015, 05:57:04[/time]

Ben videoyu yüklerken siz "video isteriz" demişsiniz.Bu kadar olur :D

mesaj birleştirme:: 20 Nisan 2015, 18:57:49

Bu arada lipoyu direk patates gibi taktım sizler yapmayın arkadaşlar :D

MrDarK

Eline sağlık baran :) Güzel uygulama olmuş. Lipoyu şarj ederken dikkat et elinde patlamasın :P

Bu tarz donanımlı videolarda bağlantı şeklide vermek uygulamayı yapmak isteyenler için kolaylık olacaktır. Tabi donanım şemasını vermek zor olabilir orasına birşey diyemem :)
Picproje Eğitim Gönüllüleri ~ MrDarK

baran123

Displayin ortak pinleri PC0,PC1,PC2,PC3
Segment pinleri PA portuna takılı

Devre vermek biraz zor olur hocam ama yazılı olarak paylaşabilirim.

justice_for_all

ornek için teşekkürler.

    SynchPrediv 0x18F;
    
AsynchPrediv 0x63;


bu değerleri neye göre hesapladınız?açıklayabilirmisiniz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Hocam ;
Daha öncesinde bunun için bir konu açmıştık. Karamel sağ olsun biraz araştırmış.

https://www.picproje.org/index.php/topic,58837.msg454374.html
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

Tamam hocam 40 Khz RC osilator varmış. ben 8 Mhz heaplayarak yaptı sanmıstım.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

38-40 kHz arası ama çok iyi değil gibi geldi.Internaldan uzak durmak lazım :D saniye biraz hızlı ilerliyor gibi çünkü.

justice_for_all

RC osilator olacak okadar :) sanırım düzeltmesi var yalnışa hatırlamıyorsam sabit bir kayıklık varsa.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Evet düzeltmesi var.

Fonksiyonun adı RTC_SmoothCalibConfig

Sadece RC Osilatör için değil External kristal içinde geçerli bu kayma durumu, bu fonksiyon sayesinde sıcaklık kompanzasyonu ve ileri geri saniye farkını hesaplayabiliyoruz. Genelde yaptığımız uygulamalarda 24 saat baz alınarak saniye farkını bir internet sitesi üzerinden takip ediyoruz ileri geri durumuna göre bu fonksiyon üzerinden değerleri güncelliyoruz. Tabiki ısı kalibrasyonu da önemli.
Picproje Eğitim Gönüllüleri ~ MrDarK

vitruvius

Alıntı yapılan: Baran Ekrem - 20 Nisan 2015, 19:06:19
Displayin ortak pinleri PC0,PC1,PC2,PC3
Segment pinleri PA portuna takılı

Devre vermek biraz zor olur hocam ama yazılı olarak paylaşabilirim.

Fritzing kullanabilirsin.

http://fritzing.org/home/

baran123


Gökhan BEKEN

Projeleri github'a yükledim arkadaşlar: https://github.com/Picproje/Picproje_STM32F0_Discovery_Uygulamalari
(Memlekette olduğum için biraz gecikme oldu, kusura bakmayın.)
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

25 Nisan 2015, 18:41:39 #27 Son düzenlenme: 25 Nisan 2015, 20:16:11 Baran Ekrem
Gökhan hocam teşekkür ederim. :)

Küçük bir aradan sonra ADC yi gerçekleştirdi.Tek kanaldan ADC okuma işlemi yaparak 0-3.3V arasını 74h164 kullanarak
4x7 segment displayde gösterimini öğrendiğim kadarı ile açıklamaya çalışacağım :)
Aslında birden çok kanal okumayı yapacatık ama DMA ie yapılacağı için ayrı bir konuda onuda işleyeceğiz.
Önce 74HC164 den bahsedeyim.HC595 e çok benziyor fakat ST_CP unu olmadığından yolladığımız veri direk olarak
çıkışlara aktarılıyor.Ve 2 pinle 8 çıkış alabiliyoruz.

Koda geçmeden önce bir kaç hesaplama gerekiyor.Öncelikle biz 12bit çözünürlüklü adc kulandık.Bu 2 li sistemde 2
üzeri 12den = 4096 yapıyor.Yani 409 adımlık bir adc mevcut.0-3.3 arası ölçüm yapacağımız için 3,3/4096 =
0,0008056640625 eder buda 805,6 uV(mikroVolt) dur.Yani ADC den okuduğumuz değeri(0-4096) her adıma düşen gerilim ile
çarparsak gerilim ölçümünü yapmış oluyoruz.Ben Potansiyometre kullandım.

hc164.c

/*****************************************************************************

* File Name        : hc164.c

* Description      : 74HC164 Data yolar

********************************************************************************

* Additional Information : 74HC164 veri gönderme fonksiyonu

*******************************************************************************/
#include "stm32f0xx_conf.h"
#include "hc164.h"

/***********************************************************
* Function Name  : HC164_Send
* Description    : 74HC164 entegresine data yollar
* Input          : uint8_t
* Return         : void
***********************************************************/
void HC164_Send(uint32_t Data)
{
    static 
uint8_t i;

    for(
0x800>>= 1)
    {
        if (
i&Data)
            
GPIO_SetBits(GPIOA,HC164_DATA);
        else
            
GPIO_ResetBits(GPIOA,HC164_DATA);

        
GPIO_SetBits(GPIOA,HC164_CLOCK);
        
GPIO_ResetBits(GPIOA,HC164_CLOCK);
    }
}



hc164.h

/*****************************************************************************

* File Name        : hc164.h

* Description      : 74HC164 Pin ve fonksiyon tanımlamaları

********************************************************************************

* Additional Information : hc164 fonksiyon prototipleri ve pinlerini barındırır

*******************************************************************************/
#ifndef __HC164_H__
#define __HC164_H__

#define HC164_DATA   GPIO_Pin_0     // 74HC164 Data pin
#define HC164_CLOCK  GPIO_Pin_1     // 74HC164 Clock pin

void HC164_Send(uint32_t);          //74HC164 Data func.

#endif





main.h

/*****************************************************************************

* File Name        : main.h

* Description      : Header file for main.c

********************************************************************************

* Additional Information : Fonksiyon prototiperi ve extern değişkenleri tanımlanır

*******************************************************************************/
#ifndef __MAIN_H__
#define __MAIN_H__

//Displaylerin ortak ucu
#define Dispay_Digit1  GPIO_Pin_0   // Display Digit 1 pin
#define Dispay_Digit2  GPIO_Pin_1   // Display Digit 2 pin 
#define Dispay_Digit3  GPIO_Pin_2   // Display Digit 3 pin
#define Dispay_Digit4  GPIO_Pin_3   // Display Digit 4 pin

//Her yerden eriilebilmesi için değişknler extern tanımlı
extern uint32_t Digit_State;
extern uint32_t Display_Buffer[4];  //Display data
extern uint32_t Display_Figures[10];//Display Number models
extern uint16_t voltage;            //voltage
extern float g_ui16OkunanDeger;     //okuduğumuz değer

//Gobal fonksiyon
void Digit_Scan(uint32_t);          //Display scanner

#endif



main.c

/*****************************************************************************

* File Name        : main.c

* Description      : ADC_Uygulaması

********************************************************************************

* Additional Information : ADC ile gerilim okuma.

*******************************************************************************/
#include "stm32f0xx_conf.h"
#include "main.h"
#include "hc164.h"

uint32_t Digit_State=0;//dispay tarama için (display konum 1-2-3-4)
uint32_t Display_Buffer[4];//4 elemanı bir dizi dispayler için
uint32_t Display_Figures[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F};//ortak katot rakamlar

uint16_t voltage;
float g_ui16OkunanDeger;

static 
void Init_GPIO(void);
static 
void Init_ADC(void);  // sadece main içinde kullanıldığından static yaptık

/***********************************************************
* Function Name  : main
* Description    : Ana program burada döner
* Input          : void
* Return         : int
***********************************************************/
int main(void)
{
    
Init_GPIO();
    
Init_ADC();

    
SysTick_Config(SystemCoreClock 1000); //1 ms(display tarama için)

    
while(1)
    {
        
Display_Buffer[0] = (voltage %10);    //Okuduğumuz voltage hanelerine ayırıyoruz.
        
Display_Buffer[1] = (voltage /10)%10
        
Display_Buffer[2] = (voltage /100)%10;
        
Display_Buffer[3] = (voltage /1000);
    }
}

/***********************************************************
* Function Name  : Init_GPIO
* Description    : GPIO giriş çıkış işlemleri yapılır
* Input          : void
* Return         : void
***********************************************************/
static void Init_GPIO(void)
{
    
GPIO_InitTypeDef  GPIO_InitStructure;

    
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);

    
GPIO_InitStructure.GPIO_Pin   HC164_DATA HC164_CLOCK;//hc 164 data ve clock uçları
    
GPIO_InitStructure.GPIO_Mode  GPIO_Mode_OUT;
    
GPIO_InitStructure.GPIO_OType GPIO_OType_PP;
    
GPIO_InitStructure.GPIO_Speed GPIO_Speed_Level_1;
    
GPIO_InitStructure.GPIO_PuPd  GPIO_PuPd_NOPULL;

    
GPIO_Init(GPIOA,&GPIO_InitStructure);

    
GPIO_InitStructure.GPIO_Pin   Dispay_Digit1 Dispay_Digit2 Dispay_Digit3 Dispay_Digit4;//ortak dsplay 

uçları
    GPIO_InitStructure
.GPIO_Mode  GPIO_Mode_OUT;
    
GPIO_InitStructure.GPIO_OType GPIO_OType_PP;
    
GPIO_InitStructure.GPIO_Speed GPIO_Speed_Level_1;
    
GPIO_InitStructure.GPIO_PuPd  GPIO_PuPd_NOPULL;

    
GPIO_Init(GPIOC,&GPIO_InitStructure);
}

/***********************************************************
* Function Name  : Init_GPIO
* Description    : GPIO giriş çıkış işlemleri yapılır
* Input          : void
* Return         : void
***********************************************************/
static void Init_ADC(void)
{
    
GPIO_InitTypeDef  GPIO_InitStructure;
    
ADC_InitTypeDef   ADC_InitStructure;
    
NVIC_InitTypeDef NVIC_InitStructure;
    
//gerekli struct lar 

    
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1ENABLE);//adc 1 clock ver

    
GPIO_InitStructure.GPIO_Pin     GPIO_Pin_2//A 2 pini analog giriş(potans ortak ucu)
    
GPIO_InitStructure.GPIO_Mode    GPIO_Mode_AN;
    
GPIO_InitStructure.GPIO_PuPd    GPIO_PuPd_NOPULL;
    
GPIO_Init(GPIOA, &GPIO_InitStructure);

    
ADC_DeInit(ADC1);//defaut init

    
ADC_StructInit(&ADC_InitStructure);//struct hazırlama

    
ADC_InitStructure.ADC_Resolution ADC_Resolution_12b;//12 bit çözünürlük seçildi
    
ADC_InitStructure.ADC_ContinuousConvMode ENABLE;//sürekli okuma aktif
    
ADC_InitStructure.ADC_ExternalTrigConvEdge ADC_ExternalTrigConvEdge_None;
    
ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right;//alınan değer 32 bitlik bir değişkenin sağına veya 

soltarafına yaslama(sağ taraf seçili)
    
ADC_InitStructure.ADC_ScanDirection ADC_ScanDirection_Upward;//birden fazla adc için yukarı veya aşşağıya 

doğru sıra ile okuma yukarı seçili 
    ADC_Init
(ADC1, &ADC_InitStructure);

    
ADC_ChannelConfig(ADC1ADC_Channel_2 ADC_SampleTime_239_5Cycles);//a2 seçili olduğundan 2.kanal aktif ve hız 

olarak 239,5 cycles seçili

    ADC_Cmd
(ADC1ENABLE);//adc aktif

    
while(!ADC_GetFlagStatus(ADC1ADC_FLAG_ADRDY));//adc1 in ADC_FLAG_ADRDY bayrağı aktfi olana kadar bekle

    
ADC_StartOfConversion(ADC1);//1 kere okuma yapar

    
NVIC_InitStructure.NVIC_IRQChannel ADC1_COMP_IRQn;//kesme fonksiyonu
    
NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//aktif
    
NVIC_InitStructure.NVIC_IRQChannelPriority 0;
    
NVIC_Init(&NVIC_InitStructure);

    
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);//ADC_IT_EOC: end of conversion çevirmenin sonu
}

/***********************************************************
* Function Name  : Digit_Scan
* Description    : Display tarama işlemini yapar
* Input          : uint32_t
* Return         : void
***********************************************************/
void Digit_Scan(uint32_t State)
{
    switch(
State)//state systic içinde değiştiriliyor
    
{
    case 
0:
        
HC164_Send(Display_Figures[Display_Buffer[3]]);
        
GPIO_Write(GPIOC0x000F);
        break;

    case 
1:
        
HC164_Send(Display_Figures[Display_Buffer[2]] + 0x80);//2ci display noktasını aktif et(8.biti high yapar)
        
GPIO_Write(GPIOC0x000D);
        break;

    case 
2:
        
HC164_Send(Display_Figures[Display_Buffer[1]]);//buffer ları displaye yolla 
        
GPIO_Write(GPIOC0x000B);//displayleri sıra ile aktif et
        
break;

    case 
3:
        
HC164_Send(Display_Figures[Display_Buffer[0]]);
        
GPIO_Write(GPIOC0x0007);
        break;
    }
}


stm32f0xx_it.c

void SysTick_Handler
(void)
{
    
Digit_Scan(Digit_State);//state durumunu fonksiyona parametre olarak vererek tarama işlemi gerçekleştiriir.

    
if(Digit_State == 4//display state tarama için sıra ile 0-1-2-3 değerlerini alır 
        
Digit_State=0;
    else
        
Digit_State++;
}

//bu fonksiyon yoksa oluşturabiliriz.Default olarak bulunmuyor olabilir.
void ADC1_COMP_IRQHandler(void)
{
    if(
ADC_GetFlagStatus(ADC1,ADC_IT_EOC))//adc1 okuma yapılırsa
    
{
        
g_ui16OkunanDeger ADC_GetConversionValue(ADC1);//adc oku
        
g_ui16OkunanDeger *= (0.0008056640625);//okunan değeri adım başına düşen voltaj ile çarp
        
voltage = (g_ui16OkunanDeger*100);//voltajı 100 ile çarp ve voltage ye aktar (float değeri displaye basmak 

için 0 dan sonra 2 nokta almak için 100 ile çarpıldı)
        
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);//okuma işleminin sonu bayrağını temizle(yoksa buradan çıkmaz)
    
}
}


Bu kadar :) Bağlantılar kod içerisinde #define şeklinde yazıyor.Unutmadan adc ucuna 22pF kondansatör ie GND ye

çektim parazit için.Yine var ama ortalama ama vs teknikler ile düzgün değer alabiliriz.

İstenmeyen sesler için özür dilerim. :)
Video: http://youtu.be/bqOgEGl0sJM

mesaj birleştirme:: [time]25 Nisan 2015, 15:48:49[/time]

Not : ilk Digit'innoktası bozuk diye kaydırma yaptım.2.Digit 'in noktası ':' şeklinde saat displayi olduğundan.Birde 1.Digiti kapalı 0 yazmasın diye:)

Dip not :
//defaut init
şeklinde bir açıklama olmuş deinit demek , donanımı reset konumuna almak gibi birşey. Tam olarak türkçeye nasıl çevrilir bilmiyorum fakat init kurmaksa bu kaldırmak gibi birşey. Donanımları kurmadan önce boşta olduğuna emin olmak için önce kaldırıp sonra kurmayı öneriyor ST. O yüzden böyle fonksiyonlar var.- MrDarK

JOKERAS

Fıstık gibi olmuş.

Birde bunu matrix displayde sürersen bu sefer Antep fıstığı olur :)

baran123

Sağ olasın :) Dotmatrix var bir ara kayan yazı yaparım.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.