Ders 6: Stm32f407 TIMER ile PWM

Bu yazımızda önceki dersimizde ele alınan TIMER’ı kullanarak PWM oluşturup sonrasında bu pwm ile led süreceğiz.

Öncelikle PWM hakkında kısa bilgiler verecek olursak;

PWM ingilizce karşılığı Pulse Width Modulation türkçe karşılığı ise Darbe Genlik Modülasyonu olarak tercüme edilebilir.Adından da anlasılacagı üzere olusturulan darbelerin genisligini ayarlamak icin kullanilir.

PWM sinyali anahtarlama ile elde edilir.PWM olustururken 2 kavrama dikkat etmemiz gerekir.

► DUTY CYCLE

Duty Cycle kavramını kavramak için görsel resimlere bakmamız kafamızda yeterli bilgiyi oluşturacaktır.

pwm

Şekilden de görüleceği üzere ON-OFF süreleri ayarlanarak sisteme verilen güç her bir duty cycle değerinde farklıdır.

► FREKANS

PWM oluştururken dikkat etmemiz gereken diğer bir husus da frekanstır.PWM frekansı,pwm in uygulanacağı elemana göre seçilmelidir.Sürülecek elemanın(led,motor..vs) datasheetlerinden gerekli çalışma frekanslarına göre belirlenir.Aynı duty cycle değerine sahip sinyaller farklı frekans değerlerine sahip olabilirler

pwm2

Şekildeki gibi %50 duty cycle ve farklı frekans değerine sahip sinyaller.

 

► PWM olusturmak için gerekli parametreleri bulalım,

♣ Öncelikle elde edeceğimiz pwm doluluğunu hedef frekansı ve timer çalısma frekansını seçmemiz gerekmektedir

PWM doluluğu %50 , hedef frekans 35 KHz ve timer çalışma hızı 280KHz e göre değerleri bulalım(Değerler keyfi verilmiştir)

Ön bölücü hesabı: PSC = (CoreClock/280000)-1  = 599

ARR(AutoReload Hesabı)= (280KHz / 35KHz)-1  = 7

Bu değerlere göre artık 35 kHz lik sinyal üretmiş olduk.Şimdi işaretin doluluk ayarı için        TIM -> CCRx saklayıcısına verecegimiz değeri belirlememiz gerekmektedir.ARR değeriri 7 buldugumuz için sayma islemi 0 dan 7 ye doğru olacaktır. CCRx değerine 4 der isek 7 nin tam ortası oldugu için %50 değerinde bir doluluk yakalamış olmaktayız.

◘ Bu değerlere göre;

TIM frekansı = 280kHz,               PSC = 599,             ARR= 7,             CCRx = 4 olarak bulunur.

Artık kod yazmaya hazırız.

PWM adında proje olusturup gerekli ayarlamaları yapıyoruz.(Bu konu hakkında önceki dersleri referans alabilirsiniz)

 

1

 

Logic analyzer ile B8 portu incelendiğinde %50 duty cycle değerinde 35kHz lik sinyal gözlenebilmektedir.

CCR1 değeri değiştirilerek (0-7 arasında) led parlaklık değişimi gözlemlenebilir.

Bu hesaplamalar referans alınarak kendi pwm değerlerinizi elde edebilirsiniz.

Diğer dersimiz olan PWM ile Servo motor sürme dersinde devam etmek üzere…

#include "stm32f4xx.h"
 
        GPIO_InitTypeDef  GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef	TIM_OCInitStructure;
        uint16_t PrescalerValue = 0;
 
void GPIO_Ayar(void) {
 
	// GPIOB ve TIM10 CLK Ayari
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,ENABLE);
 
	// B Portu Ayarlari
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
 
	// Pin Yönlendirme
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM10);
}
 
void TIM_Ayar(void) {
 
	PrescalerValue = (uint16_t)(SystemCoreClock / 280000) - 1; 
 
	//TIM10 Ayarlari
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIMER Tablosuna bakildiginde TIM10 icin tek secenek oldugundan bu tanimlamaya gerek kalmadigini görebiliriz
	TIM_TimeBaseStructure.TIM_Period = 7; //ARR Degeri
	TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
	TIM_TimeBaseInit(TIM10, &TIM_TimeBaseStructure);
 
	// PWM Ayarlari
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 4; // CCR1 Degeri
	TIM_OC1Init(TIM10, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM10, ENABLE); 
}
int main(void) {
	GPIO_Ayar();
	TIM_Ayar();
	TIM_Cmd(TIM10, ENABLE);
 
  while(1) 
		{}
}

 

UYARI : Datasheetleri incelemeyi unutmayalım…

 

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir