Gömülü Sistemler - STM32F407VG Gelişmiş Örnek Senaryo - UYGULAMA

Bilgisayar Mühendisliği Notları
By -
0

Senaryo:

Motor değeri %0 ile %100 arasında değişir.
Butona her basıldığında motor değeri %5 artar.
Motor değeri %100'e ulaştığında sıfırlanır.
Motor değeri aralığına göre LED'ler yanar:
%0 - %25: 1. LED, parlaklık 10.
%25 - %50: 2. LED, parlaklık 20.
%50 - %75: 3. LED, parlaklık 30.
%75 - %100: 4. LED, parlaklık 40.
A0 butonuna basıldıkça motor değeri %5 artar.

 

İlgili Kod ;

 

unsigned int period;
int i = 0;

void main()
{
    period = PWM_TIM4_Init(10000);

    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_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);

    while (1)
    {
        if (GPIOA_IDR.B0 == 1)
        {
            i += 5;  // Motor değerini %5 artır
            if (i > 100)
            {
                i = 0;  // %100'ü geçtiyse sıfırla
            }

            if (i > 0 && i <= 25)
            {
                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)
            {
                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)
            {
                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)
            {
                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(10);
        }
    }
}
 

Yorum Gönder

0Yorumlar

Yorum Gönder (0)