Full mcu kontrollü smps güç kaynağı

devreci

Aktif Üye
Katılım
25 Mart 2020
Mesajlar
477
mcuspmps.png




smps power:
#include "stm8s.h"

/////////// by devreci 2-2014    https://www.youtube.com/@devreci
 
static const uint8_t dgt[]={ 0xee,0x24,0xd6,0xb6,0x3c,0xba,0xfa,0x26,0xfe,0xbe,0xf0,0xf8,0xd0,0xf4,0x1f,0xca,0x0,0x0 };
static const uint8_t dgtc[]={ 0xf2,0xb3,0xe3,0x73,0xd3,0xf1,0xf3  };
uint8_t syf[]={ 1,2,3,4,5,6};
 
uint8_t  Ayr_v,Ayr_a,Ayrhg,Ayrypy,tHerm,fsnon,vltyok,AyrDsgt;
uint16_t Vtis,Ampis,Ampdgr,Ynsn,syy,fanpwm,fanpwmis;
uint16_t Amp,Vlt,Vlto,Ampo,Pwm;
const uint16_t  _ssd=2760;
const uint8_t _sxv=5;
 
 void ito(uint16_t sy,uint8_t bs)
 {
  bs-=2;
  for(uint8_t j=0;j<3;j++) { syf[bs]=sy%10; sy/=10; bs++; }
  bs--; if((syf[bs]==0)&&(bs<3)&&(sy<1))  syf[bs]=16;
 }
 
 
 void flshwrt();
INTERRUPT_HANDLER(EXTI_PrtAIRQHandler,3)
{
   uint8_t ssd=GPIOA->IDR&14;
  if(ssd==14) { Ayrhg^=1;  Ynsn=15000; return; }
  if(ssd==4)  {  Ayrypy=30; AyrDsgt=1; if(!Ayrhg) {  Vtis+=Ayr_v; Ayr_v+=3; if(Vtis>1010) Vtis=1010; Vtis-=Vtis%3;  Vtis+=2;  } else  { Ampis+=Ayr_a; Ayr_a+=3; if(Ampis>990) Ampis=990; } return; }
  if(ssd==2)  {    Ayrypy=30;  AyrDsgt=1; if(!Ayrhg)  { Vtis-=Ayr_v; Ayr_v+=3; if(Vtis>1030) Vtis=0;  Vtis-=Vtis%3;  Vtis++; } else { Ampis-=Ayr_a; Ayr_a+=3; if(Ampis>1000) Ampis=0; } return; }
 
 
 }
 
 
INTERRUPT_HANDLER(EXTI_TimIRQHandler,23)
{
 
 __asm( "__buz: \r\n"
        "ldw y,Vlto; \r\n"
        "subw y,$53e2; \r\n"
        "sraw y; \r\n"
        "addw y,Pwm; \r\n"
        "ldw Pwm,y; \r\n"
        "ldw x,Ampdgr; \r\n"
        "subw x,$53e0; \r\n"
        "ldw Ampo,x; \r\n"
        "ldw x,Vtis; \r\n"
        "subw x,$53e2; \r\n"
        "cpw x,Ampo; \r\n"
        "jrsle __hgh; \r\n"
        "ldw x,Ampo; \r\n"
        "__hgh:  \r\n"
        "addw x,Pwm; \r\n"
        "tnzw x;\r\n "
        "jrpl __kj; \r\n"
        "clrw x;\r\n"
        "__kj: \r\n"
        "cpw x,_ssd \r\n"
        "jrule __sk \r\n"
        "ldw x,_ssd \r\n"
        "__sk:\r\n"
        "ldw Pwm,x \r\n"
        "ld a,4; \r\n"
        "sraw x; \r\n"
        "sraw x; \r\n"
        "sraw x; \r\n"
        "sraw x; \r\n"
        "ld a,xl; \r\n"
        "cp a,_sxv;\r\n"
        "jruge __sux; \r\n"
        "clr a; \r\n"
        "__sux: \r\n"
        "ld $5266,a;\r\n"
        "ld $5268,a;\r\n"
        "__sddf:\r\n"
        "mov Vlto,$53e2; \r\n"
        "mov Vlto+1,$53e3; \r\n"
 
        );
 
 
 
 TIM4->SR1=0;
 
 }
 
 
 
 
 
void trrm()  {  if(tHerm==123) {  syf[2]=16; if((syy&0x1fff)<0xa00) { syf[1]=14; syf[0]=15; } else { syf[1]=16; syf[0]=16;  }  syf[5]=16; syf[4]=16; syf[3]=16;  } }
 
void waitt() {  IWDG->KR=0xaa;  __asm( " ld a,#200;  \r\n__buz: \r\n nop; \r\n nop; \r\n  dec a; \r\n jrne __buz \r\n" );  IWDG->KR=0xaa;    }
 
void epromwrt(uint16_t out,uint16_t dgr) {  out++; *((uint8_t*) out)=dgr&0xff; waitt(); out--; dgr/=256; *((uint8_t*) out)=dgr; waitt();  }
 
 ///Amaper offset
void ampofst() { if(Ampis<110) { Ampdgr=110-Ampis;  Ampdgr/=11; } else {  Ampdgr=8; }  Ampdgr+=Ampis; if(Ampdgr>990) Ampdgr=990; }

 
void Basla()
{
 Ayr_v=3; Ayr_a=0; Ayrhg=0; Ayrypy=0; tHerm=0; fsnon=0;  AyrDsgt=0;
 Ynsn=0; syy=0; fanpwm=0; fanpwmis=0;    fanpwm=160;
 Vtis=*((uint16_t*)0x4004);  if(Vtis==1234) { Vtis=*((uint16_t*)0x4000); Ampis=*((uint16_t*)0x4002); } else {  Vtis=151; Ampis=101; }
 Amp=Ampis; Vlt=Vtis; ampofst(); Vlto=1;  Pwm=0; vltyok=0;
 
 IWDG->KR=0xAA;
 sim();
  CLK->CKDIVR=0;
  GPIOB->DDR=0;
 
  GPIOB->ODR=0XC0;
  GPIOB->DDR=0XC0;
  GPIOB->CR1=0xC0;
  GPIOB->CR2=0xC0;
 
  GPIOD->ODR=0Xff;
  GPIOD->DDR=0Xff;
  GPIOD->CR1=0xff;
  GPIOD->CR2=0xff;
 
  GPIOC->ODR=0Xf0;
  GPIOC->DDR=0Xf0;
  GPIOC->CR1=0xf0;
  GPIOC->CR2=0xf0;
 
  GPIOE->ODR=0Xf0;
  GPIOE->DDR=0Xf0;
  GPIOE->CR1=0xf0;
  GPIOE->CR2=0xf0;
 
  GPIOF->DDR=0X00;  GPIOF->CR2=0x00; GPIOF->CR1=0x10;
 
  TIM1->CR1=1;
 TIM1->CR2=0;
 TIM1->SR2=2;
 
  TIM1->CCMR1=0x70;
 TIM1->CCMR2=0x70;
 TIM1->CCMR3=0x70;
 TIM1->CCER1=0x13;
 TIM1->CCER2=0x03;
 TIM1->PSCRH=0; TIM1->PSCRL=0;
 TIM1->ARRH=1; TIM1->ARRL=90;
 
 TIM1->CCR1H=0; TIM1->CCR1L=0;
 TIM1->CCR2H=0; TIM1->CCR2L=0;
 TIM1->CCR3H=0; TIM1->CCR3L=0;
 
 TIM1->BKR =0x80;
 
  ADC1->CSR=3;
  ADC1->CR1=0X43;
  ADC1->CR2=0X0A;
  ADC1->CR3=0X80;
  ADC1->CR1|=1;
  ADC1->CR1|=1;
 
IWDG->KR=0xAA;
 
 
    GPIOA->DDR=0;
  GPIOA->CR1=0x0e;
  GPIOA->CR2=0x0e;
 
  EXTI->CR1=0x01;
  EXTI->CR2=0x2;
 
 
    TIM4->CR1=1;
 
    TIM4->IER=1;
      TIM4->SR1=0;
TIM4->PSCR=4;
  TIM4->ARR=60;
 
  IWDG->KR=0xcc;
  IWDG->KR=0x55;
  IWDG->PR=4;
  IWDG->RLR=0xff;
  IWDG->KR=0xaa;
 
  rim();
 
}
 
void flshwrt()
{
GPIOB->ODR=0X00;
GPIOD->ODR=0x00;
GPIOC->ODR=0X00;
GPIOE->ODR=0x00;
TIM4->CR1=0;    IWDG->KR=0xaa;
TIM1->CR1=9;
TIM1->CCR1H=0; TIM1->CCR1L=0;  TIM1->CCR2H=0; TIM1->CCR2L=0; TIM1->CCR3H=0; TIM1->CCR3L=0;
 
 
 if(AyrDsgt) {
 FLASH->DUKR=0xae;
 FLASH->DUKR=0x56;    IWDG->KR=0xaa;
 while(!(FLASH->IAPSR&8));
 waitt();
 epromwrt(0x4000,Vtis);  epromwrt(0x4002,Ampis);  epromwrt(0x4004,1234);
 FLASH->IAPSR=0;
 FLASH->DUKR=0;   AyrDsgt=0; }
 uint16_t shh=0;
 while(shh<60000){  IWDG->KR=0xaa;  if(GPIOF->IDR&0x10)  shh++; else  shh=0;  }
 TIM4->CR1=1;  TIM1->CR1=1;
 
}
 
uint8_t ddt=0;
 
int main( void )
{
 
 
 
 
    Basla();
 
 
 
 
  while(1)
  {
 
 
 
      IWDG->KR=0xaa;
 
 
      ddt++;  if(ddt>5) ddt=0;
   
      uint8_t aa=dgtc[ddt];
      if(Ynsn!=0) { Ynsn--;  if(Ynsn&0x800) {  if((Ynsn&0x3f)<45) {  if(Ayrhg)  { if(ddt>2) aa=0xff; } else {  if(ddt<3) aa=0xff;  } }  } }
      GPIOD->ODR=aa&1; GPIOC->ODR=aa&0xf0;
      GPIOE->ODR=(aa&2)<<4;
   
      GPIOD->ODR|=dgt[syf[ddt]];
      if((ddt==1)||(ddt==5)) GPIOB->ODR|=0xC0; else GPIOB->ODR&=~0x80;
 
  for(uint32_t i=0;i<14;i++);
  GPIOD->ODR=0x1; GPIOC->ODR=0xff; GPIOE->ODR=0x20;
  for(uint32_t i=0;i<10;i++);

  syy++;
  Amp*=15; Amp+=*((uint16_t*) &ADC1->DB0RH);  Amp/=16;
  if((syy&0xff)==0)  {
  Vlt*=3; Vlt+=*((uint16_t*) &ADC1->DB1RH);  Vlt>>=2;
 
  if(GPIOF->IDR&0x10) vltyok=0; else vltyok++;
  if(vltyok>2) flshwrt();
     
  if((syy&0x3ff)==0) {
  if(Ayr_v!=3) { Ayr_v-=3;  if(Ayr_v>100) Ayr_v=3;  if(Ayr_v>40) Ayr_v=40;  }
  if(Ayr_a!=3) { Ayr_a-=3; if(Ayr_a>104) Ayr_a=1; if(Ayr_a>50) Ayr_a=50;  } }
 
  if(Ayrypy)  Ayrypy--;
  if((syy&0x7ff)==0) {  if((Ayrhg)||(!Ayrypy))  ito(Vlt/3,2);  if((syy&0xfff)==0) {  if((!Ayrhg)||(!Ayrypy))  ito(Amp,5);  }  trrm(); }
 
  if((syy&0xfff)==0)  {
    uint16_t pu=Amp/6; 
    if(pu<*((uint16_t*) &ADC1->DB2RH)) pu=*((uint16_t*) &ADC1->DB2RH); if(pu<*((uint16_t*) &ADC1->DB3RH)) { pu=*((uint16_t*) &ADC1->DB3RH);  }
    if(pu>650)  { if(tHerm!=123) { TIM4->CR1=0;  TIM1->CCR1H=0; TIM1->CCR1L=0; TIM1->CCR2H=0; TIM1->CCR2L=0; fanpwm=570; TIM1->CR1=9; fsnon=1; } tHerm=123; }
    if(pu<450)  { if(tHerm==123)  { TIM4->CR1=1;  tHerm=0; TIM1->CR1=1; }  }
    pu-=250;  if(pu>1024) pu=0;
    if((pu>60)&&(!fsnon)) { fanpwm=150; fsnon=1; }  if(fanpwm<pu)  { fanpwm+=2;  }  if(fanpwm>pu)  { fanpwm-=2;  }
    if(fanpwm>1024) fanpwm=0;  if(fanpwm<40)  {  TIM1->CCR3H=0; TIM1->CCR3L=0;  fsnon=0; } else { TIM1->CCR3H=(fanpwm>>8); TIM1->CCR3L=(fanpwm&0xff); }
      }
 
  }
  if(Ayrypy) { if((syy&0x3f)==0) {    if(Ayrhg) ito(Ampis,5); else  ito(Vtis/3,2);  trrm();  ampofst(); } }
 

 
 
  }
 
  return 0;
}
mcu flash dosyası https://drive.google.com/file/d/1IeA1ojyDPsADiaAm0SjVInzf7HEXZ5H9/view


Çıkış testi






 
Son düzenleme:
Bu sefer ne deseniz haklısınız , kodu da inceleyin kod da aynı.

Şöyle başladı , ne kadar kolay mcu koyacan yapacan işte 1 günde yaparım dediğim günden bu yana 1 ay geçti :katil2:
 
Videoyu izleyince hintlilerin yaptıkları aklıma geldi.
 
Youtube'da "post-apocalyptic inventor" ya da "stone-age electronics" gibi bir isimle kanal açıp yaptığın işleri orada ingilizce olarak paylaşırsan tüm dünyada meşhur olursun. Dalga geçmek için söylemiyorum, gayet ciddiyim. İşin içine biraz da komedi katarsan o kanal patlar. Elektronikten gelmeyen para şebeklikten gelir. Bu işler böyle.

O el yapımı osilaskop, seven-segment display, paint terk devre şeması, clean code öğretisine tepki olarak yazılmış kod, uzay montaj pcb... aman ya rabbi hepsi kendi başına farklı bir psikopatlık...
 
Son düzenleme:
kafamda hep ya mcu kilitlenirse diye bir fikir var. çok iyi ve hızlı bir watchdog ve donanımsal koruma şart diye düşünüyorum. örneğin mosfetleri direkt sürmek yerine bir lojik kapıdan geçirerek aynı anda asla low ve hisg side açık kalmamasını sağlamak gibi.
 
Youtube'da "post-apocalyptic inventor" ya da "stone-age electronics" gibi bir isimle kanal açıp yaptığın işleri orada ingilizce olarak paylaşırsan tüm dünyada meşhur olursun. Dalga geçmek için söylemiyorum, gayet ciddiyim. İşin içine biraz da komedi katarsan o kanal patlar. Elektronikten gelmeyen para şebeklikten gelir. Bu işler böyle.

O el yapımı osilaskop, seven-segment display, paint terk devre şeması, clean code öğretisine tepki olarak yazılmış kod, uzay montaj pcb... aman ya rabbi hepsi kendi başına farklı bir psikopatlık...
burada yapılmışı var:
 
Geceleri gizli gizli kömürlükte fener ışığında mı yaptın? Videoyu izleyince aklıma ironman geldi. Statükoya yenilmeye mahkum isyankar :) . :ok1:

1708942337581.png
 
ironmande diyordu: tony stark bunu bir magarada yapabildi diye, alemsin devreci, helal olsun:)
 
Evin bodrumu, aslında büyük bir yer daha var ama soğuk oluduğu için oraya gitmiyorum aslında tam üretim yapılacak yer ama bişeyler üretip satma şansımız yok ki , olsa orayı türkiye uzay ajansına dönüştürürüm ,osiloskop pahalı bişey değil ama ona bile para harcamaya acıyorum , bi :bok1: elimize geçmiyecek nasıl olsa.

Birşeyler üretsek satsak ne olabilir bi fikriniz var mı ? üretim yapacak yer var , geçi fikriniz olsada söylemezsiniz değil mi :moruk1:
 
Bu sitede yapılan 3 opmaplı güç kaynakları var, bu konuda başlıklar var , şimdi oradaki devreleri düşünelim ,baskılı devreyi yapıyorsun , plakete baskı yapıyorsun ,plaketi eritiyorsun deliyorsun, malzemeler lehimleniyor , kutusu ayarlanıyor, kablolar döşeniyor vsvs bunların her birini videoya çeksen bundan daha kısa süreli bir video çıkmaz. Bence çaba, sabır olayını fazla abartıyorsunuz.

Sistem hakkında biraz bahsedeyim , çıkış gücü belli değerin altında ise DCM modda yani burst modda çalışıyor , güç yada pwm değeri belli değerden yüksek ise CCM pwm modunda çalışıyor, bu çok önemli bir bilgi eğer güç mosfet/igbt belli pwm değeri altında sürerseniz
gate bozuluyor ve patlıyor, ayrıca güç tasarrufu da sağlıyor , bu tüm güç devreleri için geçerli bunun için birsürü devre yapıyorlar ama elinizde mcu varsa bikaç kod ile tamam, mcu burada çok işe yarıyor.

Pid kontrolu var saniyede 20bin defa 60bin e kadar çıkarılabiliyor ekran titremeye başlıyor diğer şeylere zaman kalmadığı için, pid kontolunu bu nedenle asm de yazdım , stm8 de yapmak hata idi. Çıkışlar geyet güzel , fakat devre dizaynı ve malzemelerin yerleri önemli , kutuya takınca çıkışta artık kaç mV bilmiyorum hışırtı sesi peydah oldu kullanıma engel değil.

Gatenin sürülme tekniği çok güzel , galiba dünyada ilk
:D
, gate + / - yönde sürüldüğü için çok güvenli , genelde +/0V olur ve basit.
 
1708954853587.png


Güzel çalışma olmuş. Bence pcbyi hakediyor.

Yukarda -belli ki cahilliğimden- 3 tane çizim yada yapıyı anlayamadım. Bunlar nedir yada ne işe yarar açıklayabilir misin?
Sol üst köşedeki 1 yazan yerdeki malzeme nedir?
Ortadaki kısımda 2 yazan yerde mosfet neyi kontrol ediyor? Herhangi bir akım kontrolü olduğunu sanmıyorum. Öyle olsa 4147 gibi basit bir diyot kullanılmazdı.
Sağ taraftaki mosfet hattı üzerinden alınan tek yada 2-3 spirlik bir galvanik akım ölçümü gibi bir şey mi yapılıyor? Ayrıyeten mosfet hizasındaki 75 spirlik sarımda diyot -direnç - kondansatör (snubber) devresinin tam olarak görevi nedir?
 
Diğer taraftan çalışma ortamı olarak kullanabileceğin bir yer varsa bence orada çalışacak bir ortam oluşturmalısın. Skop ve ölçü aletleri konusunda sana katılmıyorum. Bunlar yıkken bu devreyi yapıp çalıştırabiliyorsan, ölçüm cihazlarına sahip olduktan sonra daha güzel ve fonkisyonel prjeler geliştirebilirsin.

Para kazandıracak uğraş olarak çevremizde son zamanlarda scooter, e-bike türü iki tekerlilerin sayısı ciddi şekilde arttı. Bir süre sonra bunların bataryalarında sıkıntı çıkmaya başlayacak. 18650 yada alternatifi bataryalar ile aran iyi olursa buradan ekmek yersin diye düşünüyorum. Sanırım anlatabilmişimdir.

Bu kadar kadar ümitsiz olma.
 
bir ara bende hazir chip kullanmak yerine stm32f103 ile yapilabilir deyince bir suru bahane one suruldu, bak yapan yapiyormus, proje olarak bende ses analizini dusunmustum ama is mcu dan pc ye kayinca gozumde buyudu, aslinda yapmak istedigim sesli komutla bazi islemleri yapmak icin egitilen bir makinaydi, kullanici bazi isteklerde bulunacak ve bu istekler karsiliginda en basitinden lambayi acacak, klimayi ayarlayacak, belki bir sonraki safhada yazilim kendine bir database olusturup bir kutuphaneye sahip olacakti, ama egitimi kullanici tarafindan sozlu olarak yapilacakti, belki pc bile buna yeterli olmayacak, ama ilk etapta iyi bir fft analizine ihtiyac var, bu is icinde google speech analiz komponentini kullanmak istemiyorum, algoritma bana ait olsun istiyorum.
 
@fide
Deneysel olacaksa devrenin kurulması kodlarıyla oynanması incelenmesi gerçekten çok öğretici olur tavsiye ederim ama güç kaynağı istyorsak devreyi küçülteceğim çok basit bir hale getireceğim kafayı taktım , o zaman pcbway de bile yaptırabiliriz ben de isterim.

İxn igbtnin cizdiğin yerdeki olay şu , buradan max sınır amper feedbaci alınıyor ama amperi buradan ölçmüyoruz .

Ferrit trafolar ısındıkça taşıyabileceği manyetik yük azalır çabuk doyuma gider , bu devre forward devresi eğer eşik aşılırsa ferrit doyuma gider ve igbt ye çok büyük bir yük biner , half-full bridge de bu var fakat akım zıt yönlü aktığı için belli değerde igbtlere aşırı yük biner ama tolere edilebilir. Forward ve flyback affı yoktur . Yani çıkışta ölçdüğümüz amper yeterli olmaz bu ek devreyi yapmazsak yüksek güç çekerken ferrt doyuma gidip igbtyi patlatır. Eğer trafonun verebileceği max 300w ise en fazla 150W sürüyor üzerine asla çıkılmıyorsa o eki ve sonrasındaki parçaları hiç takmaya gerek yok.


Diğer çizdiğin yerde ise Ao3400 olan yerde şöyle , diğer mosfet ferrite güç verir ve bu ana igbt nin gate kapasitörünü şarj eder ve ana ferrite güç verilir gate kapasitesi sarj edilmiş 12V ve ayrıca ferrit de manteyik şarjlı durumda bir süre kalır pwm off durumunda bu mosfet iletime geçiyor ve ferritteki biriken manyetizmayı zıt yöne çeviriyor bu sayede igbt gate eksi yöne çok hızlı düştüğü için güveli bir şekilde off durumuna geliyor, mesela puslpul iki transsitörle sürseydik 12V - 0v sürülecekti igbt gatei.
Ayrıca ferriteki manyetizma sürekli zıt yönlendirildiği zaten var olan bir enerji olduğu için çok az 12v güç harcıyor.
Oradaki 10v zener diyot voltaj hızla - yönde düşerken -10v'u geçmemesini sağlıyor çünkü mosfetler max 30V dayanabiliyor, burada eğer -10v varsa diğer mosfetin draininda 12+(-10) = +22v olacak.

Bunu da ben icad ettim bu da dünyada ilk :D.

Diğer sorduğun soru ise forward yapısı o diyot ferrite depolanmış manyetizmayı tekrar 300v şebekeye geri veriyor ve ferritin manyetik olarak "uygun zamanda" boşalmasını sağlıyor, ki bu pwm cevrim süresidir . Eğer konulmasaydı igbt off durumuna geçerken ferriten zıt yönlü büyük bir voltaj gelip igbtyi bozacaktı yada diğer pwm on cevrimine kadar ferrit tam boşalamayacaktı ve bir süre sonra doyuma geçip boboin gibi değil de kısa devre gibi davranacaktı
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
6,950
Mesajlar
118,720
Üyeler
2,822
Son üye
lalemasall

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top