Ders 8: Stm32f4 PWM ile DC Motor Sürme

Bu derste daha önceden anlatılan konular ile ilgili basit bir uygulama gelistireceğiz.

Geliştireceğimiz uygulamanın genel amacı:

♣ PWM oluşturulup DC Motor sürülecek ve motorun yönünü algılamak için aynı PWM ile Led sürülecektir.

►Bu uygulama için bilmemiz gerekenler köşesine bakacak olursak;

  • PWM oluşturma
  • DC motor ve Sürücü Devreleri
  • Bağlantılar

1- PWM oluşturma hakkında bilgi edinmek için önceki derslerimize göz atabilirsiniz.

2- DC motor ve Sürücü Devreleri

Bu uygulamamızda piyasada çok rahat şekilde bulunabilecek 12V 800RPM redüktörlü DC motor kullanılmıstır.Herhangi bir motor da kullanabilirsiniz.

Uygulamada DC motoru sürebilmek için piyasada hazır olarak bulunan L298N motor sürücü devresi kullanılmıştır.Sadece L298N entegresi yada herhangi bir dc motor sürücü entegresi yada transistör kullanarak da bu uygulamayı gerçekleştirebilirsiniz.

1

L298 bir motor sürücü entegresidir. L298 2 ampere kadar motor sürebilirsiniz. L298 de 2adet H köprüsü bulunur. H köprüsü DCmotoru iki yönde de sürmeye yarar. 4 adet transistör ileanahtarlama yöntemi kullanılarak yapılır.

L298N motor sürücü kartı sayesinde kolayca 2 motoru 2 yönde sürebiliriz ancak uygulamamızda tek motor kullanacağız.

Kart üzerinde motor girişleri, besleme hattı,data ve enable hatları bulunmaktadır.

 

◘ BAĞLANTI HAKKINDA

Motor Pinleri     ▬           Motor Sürücü – 1.Motor Girisleri

Pil 9-12V             ▬           Motor Sürücü – VCC

Pil GND               ▬           Motor Sürücü –  GND

Stm32f4 GND    ▬           Motor Sürücü – GND

Stm32f4 5V        ▬           Motor Sürücü –  5V

Stm32f4PC6       ▬           Motor Sürücü – IN1

Stm32f4PC7       ▬           Motor Sürücü – IN2

Stm32f4PC8       ▬           1.Led

Stm32f4PC9       ▬           2.Led

 

PWM_DCMotor_Led adında proje oluşturup kodlarımızı yazıyoruz. [PWM,proje oluşturma işlemleri için önceki derslerimize bakabilirsiniz. ]

 

var quads_screen_width = document.body.clientWidth;
if ( quads_screen_width >= 1140 ) {
/* desktop monitors */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 1024  && quads_screen_width < 1140 ) {
/* tablet landscape */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width >= 768  && quads_screen_width < 1024 ) {
/* tablet portrait */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}if ( quads_screen_width < 768 ) {
/* phone */
document.write('');
(adsbygoogle = window.adsbygoogle || []).push({});
}
 
 
 
 
 
 
#include "stm32f4xx.h"                  // Device header
 
#define max_deger  8300
#define min_deger  0
 
int sayac;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
 
/* Systick Handler ile bekleme olusturma */  
volatile uint32_t Delay_ms;    
void SysTick_Handler(void) 
	{
	Delay_ms++;
	}
 
static void Delay(__IO uint32_t bekle)
	{                                              
  uint32_t curTicks = Delay_ms;
  while ((Delay_ms - curTicks) < bekle);
  }
 
void Bekleme(void)
	{
 
	if (SysTick_Config(SystemCoreClock / 1000)) //1ms bekleme
		{
			while (1){};
	  }
  }
///////////////////////////////////////////
 
	void PWM_Ayar(void)
	{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
 
	TIM_TimeBaseStructure.TIM_Period=8399; //1khz pwm
	TIM_TimeBaseStructure.TIM_Prescaler=10;//PrescalerValue; 10
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_ClockDivision=0;
 
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
 
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	// Kanal 1	
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse= 0;//CCR1_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	// Kanal 2		
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0; //CCR2_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);		
	// Kanal 3		
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0; //CCR3_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);		
	// Kanal 2		
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0; //CCR4_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);			
 
 
 
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	TIM_Cmd(TIM3,ENABLE);
	}
 
	void GPIO_Ayar(void)
	{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
              /* PC6 ---- IN1
		 PC7 ---- IN2
		 PC8 ---- Led1
	         PC9 ---- Led2 */
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; 
	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(GPIOC,&GPIO_InitStructure);
 
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM3);
	GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM3);		
 
	}
int main()
{
		Bekleme();
		GPIO_Ayar();
		PWM_Ayar();
 
	while(1)
	{
 
		for (sayac = min_deger ; sayac < max_deger; sayac +=5)
		{
			TIM3->CCR2	= 0;
			TIM3->CCR4	= 0;
			TIM3->CCR1	= sayac;
			TIM3->CCR3	= sayac;
			Delay(5);
		}
 
		for (sayac = max_deger ; sayac > min_deger; sayac -=5)
		{
			TIM3->CCR1	= 0;
			TIM3->CCR3	= 0;
			TIM3->CCR2	= sayac;
			TIM3->CCR4	= sayac;
			Delay(5);
		}		
	}		
}

 

 

 

Diğer dersimiz olan stm32f4 ile USART kullanımında devam etmek üzere…

Bir Cevap Yazın

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