Stm32 ile 7 segment dimmer

Başlatan ~ENES~, 20 Haziran 2023, 01:39:37

~ENES~

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.

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

SB7

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.
-SB7

arci03

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.

serdararikan

Displayi spi dma ile sür. Kesme rutini içinde fazla kod kullanma. Timerı öne pulse modunda kılabilirsin

~ENES~

Şö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.