aetius Postat August 13, 2014 Autor Partajează Postat August 13, 2014 Nu dati cu batul...codul de mai sus l-am modificat din alt cod ,si tinind cont ca acum 5 luni nu stiam ce inseamna "Delay_ms(1000);" e cred (dupa mine ) ca totusi am evoluat , iar unde m-am poticnit am cerut ajutorul ,sunt constient ca mai am mult de citit si de invatat Multumesc Link spre comentariu
Liviu M Postat August 13, 2014 Partajează Postat August 13, 2014 Daca la postul meu te referi, eu nu de tine ziceam, ziceam de mine. Link spre comentariu
aetius Postat August 13, 2014 Autor Partajează Postat August 13, 2014 Nu m-am referit la postul tau ... si sa fiu sincer tu ai fost cel care "m-a facut" sa ma apuc sa citesc si sa invat. Link spre comentariu
Liviu M Postat August 13, 2014 Partajează Postat August 13, 2014 Aha, am inteles, iar e vina mea. Link spre comentariu
Vizitator pic32 Postat August 13, 2014 Partajează Postat August 13, 2014 Un cod care ocupa mai putina memorie. (nu-i verificat dar eu cam asa zic eu ca trebuie scris) Sa vedem ce parere mai au si altii. Daca tot vrei sa inveti, incearca sa traduci: #define max_adc 820sbit LCD_RS at RB1_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;char sir_low[] =" LOW ";char sir_charging[]="CHARGING";char sir_charged[] ="CHARGED ";char *sir_status;char str_percent[4];unsigned int adc_rd, diff;unsigned char percent;void main(){ INTCON = 1; TRISA = 0x03; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(2,8,"BATTERY"); ADC_Init(); while(1) { adc_rd = ADC_Get_Sample(0); if (diff != adc_rd) { diff = adc_rd; percent=adc_rd*100/max_adc; if(percent<20) sir_status=sir_low; else if(percent<90) sir_status=sir_charging; else sir_status=sir_charged; ByteToStr(percent,str_percent); Lcd_out(1,1,str_percent); Lcd_out(1,4,"%"); Lcd_out(1,7,sir_status); } Delay_ms(1000); }} Link spre comentariu
ventzel Postat August 13, 2014 Partajează Postat August 13, 2014 (editat) Structurat cam asa arata cum l-ai scris da nu merge corect in cazu asta. Nu face corect conversia din valoarea ADC in procente. Daca inmultesti o variabila pe 10bit cu 100 numaru rezultat sare de 65535, deci ai nevoie de variabila de tip long. Io i-am lasat programu cu if-uri imbricate ca nu am inteles dc are de la 90% la 100% diferenta jumate fata de restu intervalelor. #define max_adc 778sbit LCD_RS at RB1_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;char sir_low[] =" LOW ";char sir_charging[]="CHARGING";char sir_charged[] ="CHARGED ";char *sir_status;char str_percent[4];unsigned int adc_rd, diff;unsigned char percent;unsigned long tmp;void main(){ INTCON = 0; TRISA = 0x03; Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(2,8,"BATTERY"); ADC_Init(); while(1) { adc_rd = ADC_Get_Sample(0); if (diff != adc_rd) { diff = adc_rd; tmp=(unsigned long)adc_rd*100; tmp=tmp/max_adc; percent =(char)tmp; if(percent>=100) percent=100; if(percent<20) sir_status=sir_low; else if(percent<90) sir_status=sir_charging; else sir_status=sir_charged; ByteToStr(percent,str_percent); Lcd_out(1,1,str_percent); Lcd_chr_cp('%'); Lcd_out(1,7,sir_status); } Delay_ms(1000); }} Editat August 13, 2014 de ventzel Link spre comentariu
aetius Postat August 13, 2014 Autor Partajează Postat August 13, 2014 la 90% am pe baterie 13,6v la 100% am 13,8 v se poate modifica dar am lasat codul asa , la 13,8 cuplez un consumator pentru a nu incarca prea tare bateria. o sa "rumeg" si codurile puse de voi. Multumesc Link spre comentariu
ventzel Postat August 13, 2014 Partajează Postat August 13, 2014 Tensiunea de la bornele acumulatorului o iei prin divizor rezistiv? Daca da ar trebui sa modifici un pic limitele minim si maxim din program. Ce acumulator ai? Pb? Pentru asta ii cel mai greu de stabilit gradu de incarcare strict numa dupa tensiunea lui la borne. Din ce stiu trebe sa tii cont daca ii pe incarcare sau descarcare si incarcarea ar fi bine sa fie compensata cu temperatura si oprita la gassing voltage. http://www.scubaengineer.com/documents/lead_acid_battery_charging_graphs.pdf http://www.tekrispower.com/pdfs/xantrex/Batteries%20-%20Temperature%20Compensated%20Charging.pdf O metoda fara pretentii mari ar fi sa consideri la 0% cand tensiunea la borne ii sub 10V si 100% cand ii peste 13.8V. Link spre comentariu
aetius Postat August 14, 2014 Autor Partajează Postat August 14, 2014 10% am considerat atunci cand am bateria sub 10,4 V 100% am considerat intre 13,6V - 13,8V,cand am depasit 13,8v imi apare "CHARGED", un releu (momentan, vreau sa schimb cu mos-fet) imi cupleaza un consumator . da ,tensiunea o iau prin divizor rezistiv,si accumulator de la Sunlight. interesant al 2-lea link Link spre comentariu
Mihai Popa Postat August 14, 2014 Partajează Postat August 14, 2014 Salut, Poti inlocui liniile: Lcd_out(1,1," "); Lcd_out(2,1," "); din postul 1 sau 3 sau 5 cu: Lcd_Cmd(_LCD_CLEAR); Comanda aceasta sterge memoria RAM a LCD-ului. In felul acesta se afiseaza corect ceea ce transmite PIC-ul. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum