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.
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.
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.
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.
Displayi spi dma ile sür. Kesme rutini içinde fazla kod kullanma. Timerı öne pulse modunda kılabilirsin
Şö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.