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
}
}
}