STM32 mikrodenetleyicisi için MikroC ARM dilinde yazılmış bir PWM (Pulse Width Modulation) kontrollü LED gösterge sistemi

Bilgisayar Mühendisliği Notları
By -
0

TIM4 zamanlayıcısı ile 10 kHz PWM sinyali oluşturur.
4 farklı LED’i PWM ile kontrol eder (PD12, PD13, PD14, PD15 pinleri).
A0 butonuna basıldığında motor hızı (ve dolayısıyla PWM değeri) %5 artırılır.
Hız seviyesine göre LED'lerden sadece biri yanar:
%0 - %25 ➝ 1. LED
%25 - %50 ➝ 2. LED
%50 - %75 ➝ 3. LED
%75 - %100 ➝ 4. LED
Hız %100’ü geçerse sıfırlanır ve döngü tekrar başlar.
Yani bu, buton ile hız ayarlanan, hız seviyesini LED’lerle gösteren bir sistemdir.

 

KOD ;

 

 unsigned int period;
int i = 0;

void main()
{
    period = PWM_TIM4_Init(10000); // PWM frekansı 10 kHz olarak ayarlandı

    // Tüm LED'lerin başlangıç parlaklığını 0 yap
    PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL1);
    PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL2);
    PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL3);
    PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL4);

    // PWM kanallarını başlat
    PWM_TIM4_Start(_PWM_CHANNEL1, &_GPIO_MODULE_TIM4_CH1_PD12);
    PWM_TIM4_Start(_PWM_CHANNEL2, &_GPIO_MODULE_TIM4_CH2_PD13);
    PWM_TIM4_Start(_PWM_CHANNEL3, &_GPIO_MODULE_TIM4_CH3_PD14);
    PWM_TIM4_Start(_PWM_CHANNEL4, &_GPIO_MODULE_TIM4_CH4_PD15);

    GPIO_Digital_Input(&GPIOA_IDR, _GPIO_PINMASK_0); // A0 butonunu giriş olarak ayarla

    while (1)
    {
        if (GPIOA_IDR.B0 == 1) // Butona basıldığında
        {
            i += 5; // Motor değerini %5 artır
            if (i > 100)
            {
                i = 0; // Motor değeri %100'ü aşarsa sıfırla
            }

            if (i > 0 && i <= 25) // %0 - %25 aralığında 1. LED yanar, diğerleri söner
            {
                PWM_TIM4_Set_Duty((period / 100) * 10, _PWM_NON_INVERTED, _PWM_CHANNEL1);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL2);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL3);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL4);
            }
            else if (i > 25 && i <= 50) // %25 - %50 aralığında 2. LED yanar, diğerleri söner
            {
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL1);
                PWM_TIM4_Set_Duty((period / 100) * 20, _PWM_NON_INVERTED, _PWM_CHANNEL2);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL3);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL4);
            }
            else if (i > 50 && i <= 75) // %50 - %75 aralığında 3. LED yanar, diğerleri söner
            {
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL1);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL2);
                PWM_TIM4_Set_Duty((period / 100) * 30, _PWM_NON_INVERTED, _PWM_CHANNEL3);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL4);
            }
            else if (i > 75 && i <= 100) // %75 - %100 aralığında 4. LED yanar, diğerleri söner
            {
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL1);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL2);
                PWM_TIM4_Set_Duty(0, _PWM_NON_INVERTED, _PWM_CHANNEL3);
                PWM_TIM4_Set_Duty((period / 100) * 40, _PWM_NON_INVERTED, _PWM_CHANNEL4);
            }

            delay_ms(100); // Buton basma debounce süresi
        }
    }
}

Yorum Gönder

0Yorumlar

Yorum Gönder (0)