Son Yazılar

STM32 ile PWM Sinyali Oluşturma



STM32CubeIDE ortamında yazılan ve Proteus simülasyonu ile test edilen bir PWM (Pulse Width Modulation) kontrol projesi gerçekleştirildi. Projede STM32F103C6 mikrodenetleyicisi kullanıldı ve iki kanal PWM sinyali oluşturuldu. 


Projeye başlamadan önce STM32CubeIDE kullanılarak yeni bir proje oluşturuldu. Kullanılan mikrodenetleyici modeli STM32F103C6 olarak seçildi.

STM32CubeIDE'de yapılan diğer ayarlar şu şekilde:


  • RCC (Reset and Clock Control): Saat kaynağı olarak HSE (High-Speed External) Crystal/Ceramic seramik osilatörü tercih edildi. Bu ayar mikrodenetleyicinin zamanlama ve hassasiyet gerektiren uygulamalar için daha kararlı çalışmasını sağlar.
  • PWM oluşturmak için TIM1 zamanlayıcısı kullanıldı. Bu zamanlayıcının iki kanalı (Channel 1 ve Channel 2) PWM çıktısı olarak ayarlandı. PA8 ve PA9 pinleri: Timer 1'in Channel 1 ve Channel 2 PWM çıktıları için ayarlandı ve bu pinler aktif hale geldi.
  • Prescaler: 71 olarak ayarlandı. Bu değer, mikrodenetleyicinin temel saat frekansını (örneğin, 72 MHz) bölerek zamanlayıcı için daha düşük bir frekans oluşturur. 72 MHz / (71+1) = 1 MHz saat frekansı elde edilir. Counter Period: 999 olarak belirlendi. Bu, PWM sinyalinin bir periyodunun 1000 adımda tamamlanacağı anlamına gelir. 1 MHz zamanlayıcı frekansı ile 1000 adım bir periyodu 1 ms yapar (frekans = 1 kHz).
Kodlama Aşaması: 

PWM sinyallerini başlatmak için aşağıdaki kodlar kullanıldı:

/* PWM Kanallarını Aktif Etme */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);

Kanal 1 PWM sinyali için sabit bir değer (çıkış genliği) atandı:

int pwm = 500; // PWM Duty Cycle (0-1000 aralığında)
TIM1->CCR1 = pwm; // Kanal 1 çıkışı %50

Bu kod, Kanal 1 için PWM sinyalini %50 Duty Cycle ile sabitler (0-1000 arasında 500 değeri %50'ye denk gelir).

Kanal 2 PWM sinyali, bir döngü yardımıyla 0'dan 500'e kadar artırıldı ve her adımda 1 ms gecikme eklendi:

int pwm2;
while (1) {
    for (pwm2 = 0; pwm2 <= 500; pwm2++) {
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, pwm2); // Kanal 2 PWM Duty Cycle'ı ayarlanıyor
        HAL_Delay(1); // 1 ms gecikme
    }
}

Kanal 2'nin Duty Cycle'ını (%0'dan %50'ye kadar) kademeli olarak artırır. Her adım arasında 1 ms bekleme yaparak geçişlerin daha akıcı olmasını sağlar.

Simülasyon


Kodlar, Proteus simülasyon ortamında test edildi. Proteus'ta STM32F103C6 mikrodenetleyicisi ve ilgili PWM pinlerine bağlı LED'ler kullanılarak sinyallerin doğruluğu kontrol edildi.

Hiç yorum yok