Ynt: Baştan Sona STM32F0 Discovery Uygulamaları

Başlatan MrDarK, 08 Nisan 2015, 23:29:35

baran123

#15
Bundan sonra videoda eklerim :)
https://youtu.be/vL1IprqhMmE

mesaj birleştirme:: 21 Nisan 2015, 05:57:04

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

mesaj birleştirme:: 20 Nisan 2015, 15: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, 16: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

#27
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(i = 0x80; i > 0; i >>= 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_ADC1, ENABLE);//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(ADC1, ADC_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(ADC1, ENABLE);//adc aktif

    while(!ADC_GetFlagStatus(ADC1, ADC_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(GPIOC, 0x000F);
        break;

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

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

    case 3:
        HC164_Send(Display_Figures[Display_Buffer[0]]);
        GPIO_Write(GPIOC, 0x0007);
        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:: 25 Nisan 2015, 15:48:49

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.