22 Batarya Hücresi Voltaj Ölçümü

Başlatan matador, 29 Haziran 2014, 15:18:42

matador

22 tane seri bağlı batarya hücresinin voltajlarını ayrı ayrı ölçmem gerekiyor. Her bir hücreye 12f1822 bağlı. Ana işlemci olarak da 18f46k22 var.  İlk düşüncem her bir 12f1822'ye numara verip, ana işlemci uart ile bilgi almak istediği numarayı gönderecek ve bilgiyi alacaktı fakat haberleşme esnasında pinlerde bir kısa devre olmasını önleme için 12f'lerin txlerini bir transistör ile sürmeyi denedim fakat iletişim gerçekleşmiyor. Nedenini anlayamadım bu yüzden de buraya yazdım.

Ana işlemci:
#include <hucrer.h>
#include <4x20.c>
  #include <float.h>
  #include <limits.h>
  #include <math.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  
  unsigned int deg,h1,h2,c;
  float voltaj;
  char volt[10],veri[10],v2[10],adres[10];
  
#int_RDA
void  RDA_isr(void) 
{
   disable_interrupts(GLOBAL);
   gets(veri);
   deg=atoi(veri);
   if(deg==1)
   {
      output_high(PIN_C0);
      gets(volt);
      h1=atoi(volt);
   }
   else if(deg==2)
   {
      gets(v2);
      h2=atoi(v2);
   }
   else
   {
      deg=0;
      enable_interrupts(GLOBAL);
      return;
   }
}



void main()
{
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   setup_timer_5(T5_DISABLED | T5_DIV_BY_1);
   setup_timer_6(T6_DISABLED,0,1);


   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   lcd_init();
   delay_ms(2500);
   lcd_clear();

   while(TRUE)
   {
      enable_interrupts(GLOBAL);
      printf("1");
      printf("\n\r");
      delay_ms(150);
      printf("2");
      printf("\n\r");
      delay_ms(150);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%03u",h1);  
      lcd_gotoxy(6,1);
      printf(lcd_putc,"%03u",h2);  
   }
}


voltaj ölçen işlemci:
#include <2.h>
  #include <float.h>
  #include <limits.h>
  #include <math.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  
  
  unsigned int ham,gelen;
  float sabit=0.01960784,voltaj;
  char volt[5],veri[5];
  
#int_RDA
void  RDA_isr(void) 
{
   disable_interrupts(GLOBAL);
   gets(veri);
   gelen=atoi(veri);
   if(gelen==1)
   {
      output_high(PIN_A4);
      set_adc_channel(2);
      delay_ms(5);
      ham=read_adc();
      output_low(PIN_A4);
      sprintf(volt,"%u",ham);
      output_high(PIN_A5);
      printf("1");
      printf("\n\r");
      printf("%s",volt);
      printf("\n\r");
      gelen=0;
   }
   else
   {
      output_low(PIN_A5);
      gelen=0;
      enable_interrupts(GLOBAL);
      return;
   }
}



void main()
{
   setup_adc_ports(sAN2);
   setup_adc(ADC_CLOCK_DIV_2);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF,0);

   while(TRUE)
   {
      enable_interrupts(GLOBAL);
      output_low(PIN_A5);
      output_low(PIN_A4);
   }
}


Devre:

Kabil ATICI

#1
Transistör akımnın ters yönde olması gerekir. İşlemci için UART (RS232) dalga şemalarını incele. Bilgisayar bağlantısı üzerinde düşünme. Hatırladığım kadarı ile normalde UART bacağı lojik 1 seviyesinde kalır,  haberleşme esnasında lojik 0'a çekilerek haberleşme sağlanır.

Bu arada bu küçük işlemcilerin GND'leri ortak mı? GND ortak değilse araya optokuplör kullanman gerekir.
ambar7

hasankara

pushpull gerekir, bu şekilde 12f ten low gideceği sürede kanal hala high kalabilir alıcı denetleyicinin haberleşme kanalından çektiği akım çok düşükse eğer bu senaryo gerçekleşebilir. ambar7 bu konuda haklı dirençle ortak emitörü pulldown yapıp deneyebilirsin. yada her transistöre collector emitör arasına ters diyot taksan buda çözüm olabilir. birde transistörlerin tepki sürelerini de göz önünde bulundurmak gerekir. sağlıklı iletişim için. transistör yerine haberleşme kanalını yazılımsal olarak kapatabilirsin aslında. yani 12f ler ihtiyaç olmadığı sürece tx işlemi yapmayacak her 12f kendisine göre tx ucunu boşa bırakacak. bunu yapabilirsen tüm tx pinlerini birbirine bağlayabilirsin.

matador

TX pinlerini nasıl kapatabilirim ki. Yazılımdan pasif yapmak mümkün mü? Yani TX pini ne 0 olacak ne de 1 bu mümkün mü?

Kabil ATICI

Boşta, sinyal göndermiyorken, tx pini lojik 1'dir. Şimdi diyotları

                                   VCC
                                   |
                                  | | pull-up direnci..
                                  | |
                                   |
işlemci1 tx------|<|-------+------- ortak işlemci RX
                                   |
işlemci2 tx------|<|-------+
                                   |
işlemci2 tx------|<|-------+
bu şekilde sadece aktif olan işlemci ortak işlemciyi etkilemiş olur.
ambar7

matador

Yarın devre üzerinde deneyeceğim teşekkürler.

z

Bataryalar seri bagli ise, her bir bataryanin de kendi islemcisi varsa sende bunlarin hepsiyle konusmak istiyorsan fazla kafa yorma optocoupler kullanmak sart gorunuyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

hasankara

#7
bak bu arada z çok güzel bir noktaya değinmiş ben yorum yaparken tüm denetleyicilerin ortak gnd miş gibi yorumladım. isis şemasında çizdiğinde zaten gnd beslemeleri arka planda kendisi simülasyon yaparken de birleştirir gnd noktalarını. bir denetleyicinin + beslemesi diğer denetleyicinin - beslemesine geliyorsa burada translating transceiver işlemi gerekir. optokuplörlerle seviye farkı gözetmeksizin sinyal aktarımı sağlayabilirsin ama bu işlemi çift yönlü yapman gerekir yani sadece 12f lerden veri çekmek için değil onlara veri gönderdiğin kanalıda bu şekilde ayarlaman gerekir. ve yine push pull durumu gerekebilir, bunun için haberleşme kanalını direk 10k- 100k arası bir dirençle pull down yapmayı deneyebilirsin. özetle her denetleyici optoküplörlerle haberleşme kanalına bağlantılanır. her optokuplörün transistör kolektörlerine aynı gerilim seviyesinden yani tek noktadan besleme yapılır.

mesaj birleştirme:: 30 Haziran 2014, 01:40:32



farkettim ki yazıyla bayağı karışık oluyor isistede çizeyim dedim. sen kendi devrende 12f lerin tx uçlarını ayrı bir pinle kontrol etmek istemişsin bende bu şekilde kontrol etmek istersin diye optoküplörülerin çalışmasınıda kontrol edebileceğin pinleri boşta bıraktım. bu pinleri denetleyiciden high yaptığın zaman haberleşme kanalına 12f tarafından müdahale edebilirsin.

sadogan

Bu batarya hücreleri kaç volt 12f1822  nasıl besleniyor?

matador

li-po max. 4.5 volt. İşlemcilerin beslemesi 7805'ten gelen 5V. Gndler ortak olacak.

muhittin_kaplan

Konunun tamamini okumadim. Eger yeni baslaniyorsa tek bir mcu ve ve adc kanaliyla anahtarlayarak yapardim.

sadogan

Şöyle bir problemin var:
22 adet lipo pili seri bağladığınızda enaltaki pile göre en üstteki pil arasında 4.2v*22=92.4volt gerilim olacak.
Gnd te göre besleme gerilimi 5 volt olan 12f1822 pic lere nasıl gireceksiniz.
işlemcinin adc girişi, gnd ye göre 5 volttan büyük olamaz.
Gerilim bölücülerle girmeye kalkarsanız da bağımsız ölçemeyeceksiniz.
Aslında uygulama şemanızı paylaşmanızda yarar var.



Cemre.

#12
Hocam şöyle birşey çalışır mıydı? Tek bir pic ile sırayla opto'ları aktif etsek ve istediğimiz değeri tek ADC girişinden okusak?
Bilgi eksikliğinden kaynaklanan büyük bir hata yapmıyorumdur umarım :/




Denedim de çok fazla gerilim düşümü oluyor nedense, neyse ben daha fazla saçmalamadan çekileyim aradan :(


(0.16V hangi kanaldan ölçersek ölçelim düşüyor, yani transistörün Uce'si bu düşüm, sonuca bunu ekleyerek bu şekilde yapılabileceğini düşünüyorum hala, ama hocalarımız doğrusunu önereceklerdir.)

F493

Selam,

  Bu işlemi CANBUS ile yaparsanız daha iyi olur gibi geldi bana.

Esen kalın.

matador

CANBUS haberleşmeyi düşündüm bende ama mantığını anlayamadım. Örnek kodları da anlayamadım.