18 Ekim 2016 Salı

8 - ADC_PWM_USART örneği

Merhaba arkadaşlar,

Sıradaki paylaşımda anlatım yapılmadan direkt kod paylaşımı olacaktır. çünkü daha önceki paylaşımları yapan arkadaşlar bu yeni örneği anlamada zorluk çekmeyecektir.

Yine de örneği özetleyecek olursak;

STM32F4 kartımızın A0 pininden ADC bilgisi okunuyor ve bu ADC bilgisi PWM'e göre oranlandıktan sonra (sebebi periyod değerimiz) pwm çıkışı verilmektedir. ancak bunu yaparken de aynı zamanda görebilmemiz açısından PC' ye bu bilgiler USART aracılığıyla gönderilmektedir.

aşağıda kodlar bulunmaktadır.:

#include "stm32f4xx.h" // stm32f4 kütüphanesi 
#include "stm32f4xx_gpio.h"         // GPIO kütüphanesi
#include "stm32f4xx_rcc.h"        // RCC clock kütüphanesi
#include "stm32f4xx_adc.h"                // ADC clock kütüphanesi

#include "stm32f4xx_usart.h"       // Keil::Device:StdPeriph Drivers:USART
#include "delay.h"
#include "stm32f4xx_tim.h"

#include <stdio.h>
#include <stdlib.h>

uint32_t i;
uint8_t dolu;
char gonder;
uint16_t PRSC_Value;
char str[50];
volatile char veri;
uint16_t ADC_deger=0;


void Periph_Config()
{
/* GPIOD ve GPIOA Periph clock hattlari aktif edilir */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

/* ADC1 Periph clock hatti aktif edilir */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}




void USART_Puts(USART_TypeDef* USARTx, volatile char *s)
{
while(*s)
{
while(!(USARTx ->SR & 0x00000040));
USART_SendData(USARTx,*s);
*s++;
}
}

uint16_t ADC_Oku()
{
  ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles); //ADC
  KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA
  ADC_SoftwareStartConv(ADC1); //DONUSUME BASLA DEDIK
  while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //HER DÖNUSUM SONRASI
  BAYRAGI SIFIRLAYALIM
  return ADC_GetConversionValue(ADC1);
}

void GPIO_led_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure; // Port yönlendirmesi

    /* PD12, 13, 14 ve PD15 pinleri kullan1lacak */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Pinler cikis olarak belirlendi
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
    GPIO_Init(GPIOD, &GPIO_InitStructure);  
     //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
}




void USART_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO ALTERNATE FUNCTION olarak tanimlanan pinin konfigürasyonlari 
// pin ile baglant1 kuracagi modül belirlenir.  
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
// USART konfigürasyonlari:
USART_InitStructure.USART_BaudRate  = 115200;
USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_InitStructure.USART_Parity  = USART_Parity_No;
USART_InitStructure.USART_StopBits  = USART_StopBits_1;
USART_InitStructure.USART_WordLength= USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}



void ADC_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //Pinler analog giris olarak belirlendi
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
   GPIO_Init(GPIOA, &GPIO_InitStructure); 
   //Yukarida tanimlanan bilgileri GPIOA adresine ait oldugu belirtilir
}


void ADC1_Config()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler  = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_TwoSamplingDelay= DC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;
ADC_InitStructure.ADC_ScanConvMode =DISABLE;
ADC_InitStructure.ADC_Resolution =ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
}



void Timer_GPIO_Config()
{
GPIO_InitTypeDef  GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //Pinler pwm cikis olarak belirlendi
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Pin PushPull olarak ayarlandi
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //GPIO Bus hizi 100 MHz ayarlandi
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //Yukarida tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM5);
}


void Timer_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
PRSC_Value = (uint16_t)(SystemCoreClock/2 / 4000000)-1;
TIM_DeInit(TIM10);
   TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 255 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = PRSC_Value;
TIM_TimeBaseInit( TIM5,&TIM_TimeBaseStructure);
}



void PWM_Config()
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//4.kanal %100 pwm
//PD3
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM5, ENABLE);
TIM_Cmd(TIM5,ENABLE);
}




int main(void)
{
Periph_Config();
GPIO_led_Config();
USART_Config();
ADC_GPIO_Config();
ADC1_Config();
Timer_GPIO_Config();
Timer_Config();
PWM_Config();
while(1)
{
// oncelikle ADC'den okuma yapiliyor
uint16_t Data =0;
Data = ADC_Oku(); 
//periyot 255 verildigi icin ve ADC 12 bit oldugundan dolayi
//gelen bilgiyi 0-255 arasi oranliyoruz
Data = (Data*255)/4096;
//oranlanan ilgi gonderiliyor
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
// burada da bilgi pwm olarak timer'a yaziliyor
TIM5->CCR4 = Data;
// yine oranlanan bilgimizin % 'lik degeri gonderiliyor
Data= Data * 100/255;
USART_SendData(USART1, Data);
i = 600000;
while(i)
i--;
}
}


Aşağıda kodun resimleri bulunmaktadır:






Sorularınız olursa aşağıya yorum yazabilirsiniz.

İyi Çalışmalar
                                                                                                                    


1 yorum:

  1. """""sadece bizim çektiğimiz sıkıntıların bizden sonra gelenlerin çekmemesi için yapılmaya çalışılan bir site.""""""
    ÇOK GÜZEL DÜŞMÜŞ BU TABİR UĞRAŞINIZ İÇİN ALLAH RAZI OLSUN

    YanıtlaSil