Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: ~ENES~ - 20 Haziran 2023, 01:39:37

Başlık: Stm32 ile 7 segment dimmer
Gönderen: ~ENES~ - 20 Haziran 2023, 01:39:37
Arkadaşlar merhaba
Stm32f103 ile cubeide'de 3x7 segment display kullanarak AC dimmer yapmak istiyorum.
Displayi 74hc595 ile sürüyorum. Katod uclarına transistör bağlı. Temel olarak mantık belli... Timeri kuruyorum her kesme alt programına dallanınca değişkeni artırıp sırayla tarama yapıyorum. Buraya kadar herşey normal. Fakat işin içine Zero Cross girince kesme düzenli çalışmıyor dimleme yapamıyorum. Kodum şu şekilde;



void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == ZERO_Pin) // If The INT Source Is EXTI Line15 (A9 Pin)
    {





    TIM2->CR1=0;
    TIM2->CNT=0;
    flag=1;
    TIM2->CR1=1;



    }

}



void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{


if(htim ->Instance == TIM1)  // 100 uS KESME PERİYODU
{





SaniyeSay++;
if(SaniyeSay==1000)
{
SaniyeSay=0;
SaniyeSay1++;
if(SaniyeSay1>=1000) SaniyeSay1=0;

}

seg++;
if(seg>2) seg=0;

if(seg==0)
{
 
  HAL_GPIO_WritePin(SEG1_GPIO_Port,SEG1_Pin,0);
  HAL_GPIO_WritePin(SEG2_GPIO_Port,SEG2_Pin,0);
  HC595_WriteByte(sayi[yuzler]);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 1);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 0);
  HAL_GPIO_WritePin(SEG3_GPIO_Port,SEG3_Pin,1);



}
if(seg==1)
{
 
  HAL_GPIO_WritePin(SEG1_GPIO_Port,SEG1_Pin,0);
  HAL_GPIO_WritePin(SEG3_GPIO_Port,SEG3_Pin,0);
  HC595_WriteByte(sayi[onlar]);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 1);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 0);
  HAL_GPIO_WritePin(SEG2_GPIO_Port,SEG2_Pin,1);


}

if(seg==2)
{
 
  HAL_GPIO_WritePin(SEG2_GPIO_Port,SEG2_Pin,0);
  HAL_GPIO_WritePin(SEG3_GPIO_Port,SEG3_Pin,0);
  HC595_WriteByte(sayi[birler]);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 1);
  HAL_GPIO_WritePin(LATCH_GPIO_Port, LATCH_Pin, 0);
  HAL_GPIO_WritePin(SEG1_GPIO_Port,SEG1_Pin,1);


}


TIM1->CNT=0;






}

if(htim ->Instance == TIM2)  // 100 uS KESME PERİYODU
{



if(FanStatus)
{
if(flag)
{

say++;
if(say>=70)
  {
triac(1);
say=0;
flag=0;
TIM2->CNT=0;
TIM2->CR1=0;
triac(0);

}

}
}else
{
triac(0);

}




}

}


Buda 74hc595'i kontrol ettiğim kısım.

void HC595_WriteByte(uint8_t data)
{


    // Byte'ı göndermek için kaydırma işlemi
    for (uint8_t i = 0; i < 8; i++)
    {
   

        HAL_GPIO_WritePin(DATA_GPIO_Port, DATA_Pin, (data >> i) & 0x01); // Veriyi DATA_PIN'e yazma

        HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, 1);// Saat sinyalini düşürme

        HAL_GPIO_WritePin(CLOCK_GPIO_Port, CLOCK_Pin, 0);
    }





    bayrak=1;


}

Şunu keşfettim tarama yaparken 595'e değer girdiğim satırı silersem yani dallanma olmazsa sorun olmuyor. O zamanda display çalışmıyor haliyle. Sanki 595 i kontrol ettiğim kısımda çok fazla vakit kaybediyor ve zero sensingi atlıyor. Halbuki toplasan 10 satır işliyor o kadar da vakit kaybı yok.

Fikri olan arkadaşlar varsa şimdiden teşekkür ederim.
Başlık: Ynt: Stm32 ile 7 segment dimmer
Gönderen: fide - 20 Haziran 2023, 09:37:57
Displayi zero cross rutini içinde digit digit sürmek belki farklı bir yaklaşım olabilir. 100 tetik saniye için 4 digitte 25hz yapar ki 7 segment içi yeterli olur sanırım.
Başlık: Ynt: Stm32 ile 7 segment dimmer
Gönderen: SB7 - 20 Haziran 2023, 09:56:45
Daha önce benzer bir uygulama yapmaya çalışmıştım. Aynı sorun bende de vardı.Sorunu çözememiştim ama Shift registerleri SPI ile sürünce kısmen  iyileşme olmuştu. (SPI 1 Line TX Modu)

https://www.youtube.com/shorts/qGhrP-J4jBc

SPI ile sürünce de external interrupt 5-10 sn de bir yanlış okuma oluyordu. Videoda görülmese de lamba parlaklığı max veya min olup anlık titreşebiliyordu.
Başlık: Ynt: Stm32 ile 7 segment dimmer
Gönderen: arci03 - 20 Haziran 2023, 09:58:11
merhaba bende kendi çalışmamda bunu yaşadım display olarakda tm1638 modül sürmüştüm. shifout komutu kesmelerde gecikmeye sebep oluyordu. bu durumu ise düzeltmek için modüle veri göndermeden önce sıfır geçişin oluşmasını bekletiyorum ve kesme gerçekleştiğinde ekrana veri gönderiyorum bu şekilde yapınca kesmede gecikme yaşanmıyor.
Başlık: Ynt: Stm32 ile 7 segment dimmer
Gönderen: serdararikan - 20 Haziran 2023, 10:16:52
Displayi spi dma ile sür. Kesme rutini içinde fazla kod kullanma. Timerı öne pulse modunda kılabilirsin
Başlık: Ynt: Stm32 ile 7 segment dimmer
Gönderen: ~ENES~ - 20 Haziran 2023, 10:55:19
Şöyle bir durum oldu.

Kesme icindeki tarama yaptigim yerde 595 fonksiyonuna dallanmak yerine fonksiyonu direk yazdım. Bu sefer ana programda ne deger veriyorsam ekranda dimmer de sorunsuz calisiyor. Ama ana programdaki yazdigim kodu alıp bir fonksiyon olarak modul olarak eklersem calismiyor. Yani başka yere dallandiğinda sapıtiyor. Bu neden kaynakli olabilir ? .h.c dosyalarinda sorun yok degiskenler extern tanimlı. Ayni kod mainde calisirken modülde calismiyor.