Sari la conținut
ELFORUM - Forumul electronistilor

pic12f675 Step up 5V to 12V dc-dc


Postări Recomandate

Buna ziua , astazi ma gandeam la un mic proiect,  ridicator de tensiune de la 5 la 12V ( DC-DC ) ~ 400ma .Pentru  aceasta as vrea sa folosesc pic12f675 pentru ca deastea am in casa.

Problema este ca nu stiu logica cu feedback-ul. Ceea ce am gasit pe neteste:  dscf2185.png.5a1645b0c4daca46a75348838d480a68.png  Intuiesc ca GP1 este folosit ca ADC dar cam atat. Din cate am vazut pe youtube si imi dau seama GP1 are trebui sa controleze PWM sau chiar frecventa lui GP4. Va rog din experienta dvs. daca ma puteti ajuta si pe mine. Ceea ce am gasit eu este https://allanfaulds.weebly.com/pic-psu-dc-dc-converter-project.html 

 

Deci cum as putea face un programel in MikroC pentru acest proiect ?

Cred ca ar veni cam asa  dar mai departe nu stiu ce sa pun in functia step_up( )  .....

void hardware(){
     ANSEL = 0;  
     ADC_Init();
     ADCON0 = 1; //  Select analogue input AN0
     CMCON = 7;  //  All comparators off
     TRISIO1_bit = 1; //  GP1 input
     TRISIO2_bit = 0; //  GP2 output
}
void step_up(){
	
    ???.........???    	
}
void main (){
	hardware();
	step_up() ; 
}

 

Link spre comentariu
  • Răspunsuri 17
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Salut allez001,

Treaba e putin mai complicata si nu o vei rezolva doar in cateva linii de cod. Am sa incerc sa arat intr-un fel de pseudocod cam ce trebuie facut si ce probleme apar. Personal nu cred ca un procesor de tipul lui 12F675 poate sa "tina" bucla unei surse in comutatie. O alegere mai potrivita ar putea fi 12F683, care are PWM hardware in interior. dar daca 675 ai in sertar, hai sa vedem cam ce ar fi d efacut.

1) Trebuie sa generezi pe GP1 un semnal dreptunghiular a carui frecventa sa fie cea necesara pentru valorile alese ale bobinei si condensatorului de la iesire. Sa presupunem ca e de 50KHz. Asta inseamna o perioada de 20us. Daca operezi procesorul la 4MHz, asta iti da posibilitatea sa executi 20 de instructiuni intr-un ciclu al sursei. Nu e prea mult.

 

2)Trebuie sa pastrezi perioadele 1/0 la iesire destul de precis. Perioadele individuale in 0 si 1 vor stabili factorul de umplere, adica valoarea PWMului. Daca procesorul lucreaza la 4MHz, rezolutia nu e prea buna.
Bucla principala, numai ptr PWM, ar arata cam asa:

while(1){
GP1=1;
intarziere(valoare1);
GP1=0;
intarziere(valoare2);
}

Si cu asta ai generat comanda tranzistorului. Acest while(1) trebuie pus in main. Asa cum e scris acum, executa main o data, apoi iese prin porumb. Trebuie tinut in bucla infinita cu while(1).

 

3)Nu uita ca, printre picaturi, trebuie sa masori cu ADCul tensiunea de la iesirea divizorului rezistiv si in functie de ea sa ajustezi valoare1 si valoare2. Asta ia timp si iti va afecta frecventa si factorul de umplere ale undei dreptunghiulare de la iesire. O posibila solutie pentru a pastra frecventa corecta la iesire este sa folosesti intreruperi periodice de la unul din timere. Asta complica programul.

 

4) Valoarea citita nu poate fi aplicata imediat si oricum, pentru ca in mod garantat bucla va intra in oscilatie. Valoarea citita trebuie trecuta printr-un filtru trece jos digital, iar rezultatul filtrului poate modifica valoare1 si valoare2. Filtrul, la randul lui, trebuie sa tina si el seama de defazajul introdus de sistem, astfel ca reactia negativa sa nu se transforme in pozitiva si bucla sa oscileze. De asemenea trebuie tinut cont de timpul de raspuns, altfel, cand conectezi/deconectezi o sarcina, vei avea variatii mari de tensiune.

 

Toate cele de mai sus sunt necesare ca sa obtii un montaj care merge bine.

 

Acuma, ca sa nu te descurajez complet, poti incerca doar bucla while de mai sus si ar trebui sa obtii ceva, dar fara stabilizare, stabilitatea buclei de control si alte fineturi. Probabil ca e bun ca proiect didactic, dar nu e simplu.

 

Spor!

 

 

Editat de cirip
Link spre comentariu

Are rost sa te complici cu microcontroller pentru o astfel de aplicatie ? Sunt bune microcontrollerele, dar au si ele rolul lor, nu inseamna ca trebuie sa le folosim oriunde. Pana la urma costul software-ului devine mai mare ( chiar daca il scrii singur - asta necesita timp, debugging si tot mai poti avea buguri in cod - se merita ?  ) decat costul unui integrat dedicat step-up.

Link spre comentariu
15 hours ago, cirip said:

2)Trebuie sa pastrezi perioadele 1/0 la iesire destul de precis. Perioadele individuale in 0 si 1 vor stabili factorul de umplere, adica valoarea PWMului. Daca procesorul lucreaza la 4MHz, rezolutia nu e prea buna.
Bucla principala, numai ptr PWM, ar arata cam asa:

while(1){
GP1=1;
intarziere(valoare1);
GP1=0;
intarziere(valoare2);
}

 

Atunci am sa incerc sa folosesc un un crystal 12 ~ 16 Mhz ,  cred ca am sa incerc sa scriu  ceva gen Vdelay_us si toata treaba sa mearga cat se poate dinamic pentru usurarea codului din bucla principala.

 

Dar ca idee:  Cand am cadere de tensiune ar trebui sa creasca duty cycle  ?  Sau frecventa  ..... sau ambele ??  Nu trebuie sa fie foarte stabil avand in vedere ca voi alimenta o lampa cu LED-uri =>  Deci consumul o sa fie constant ceea ce inseamna ca  pic-ul nu ar trebui sa aiva prea mari batai de cap cu ajustarile. 

 

ok poate nu este cea mai buna idee, dar as vrea sa realizez mai mult pentru satisfactia reusitei. Pentru ca stiu ca nu sunt scumpe astfel de surse in comutatie 

Link spre comentariu

Proiectul pe care l-ai prezentat în link folosește comparatorul  NU ADC - cel puțin așa rezultă din sumara descriere. Chiar și așa, în condițiile în care nu există o referință absolută nu există nici măsurătoare . De altfel luminozitatea din poze la 3.2V pare mult redusă față de cea la 5V . Deci eu cred că proiectul respectiv NU  stabilizează! Faptul că necesită reprogramare când crește consumul ( la aceeași tensiune ! ) îmi întărește convingerea că e așa. Mai mult frecvența de oscilație este foarte scăzută - circa 7 kHz - ceea ce poate determina manifestări audibile . În concluzie eu cred că proiectul propus nu merită a fi copiat . 

Dacă vrei să faci ceva poți opta, așa cum s-a propus, pentru PIC12F683 . Dacă vrei totuși să faci cu PIC12F675 poți implementa un PWM soft relativ lent , poți face o buclă de control și mai lentă dar folosind o referință externă ( ex. TL431 ) pentru ADC. În acest caz, pentru sarcini lent variabile,  poți obține rezultate decente.

Link spre comentariu

Poți totuși încerca mai întâi cu 675 . Faci un PWM soft bazat pe TMR0 - de exemplu . Ceva de genul - încarc M în TMR0 , fac OUT=1, incrementez până la overflow, fac OUT=0 și încarc N în TMR0. Dacă mențin M+N = constant frecvența va fi constantă și DC va fi variabil . Pui un TL431 pe intrarea GP1 și Feedback-ul pe GP0 . Măsori ieșirea , mediezi ( = filtare trece jos ) , în funcție de diferența față de valoarea prescrisă modifici M ( și N simultan ) 

Link spre comentariu

Dacă vrei să alimentezi leduri cu sursa, ține cont că nu ai nevoie de tensiune stabilizată, ci de curent stabilizat.Adică în funcție de rezistența de sarcină (ledurile consumă mai mult când se încălzesc, fiindcă le scade rezistența) tensiunea va scădea sau crește, pentru a menține curentul constant.

Link spre comentariu
22 hours ago, cirip said:

while(1){
GP1=1;
intarziere(valoare1);
GP1=0;
intarziere(valoare2);
}

Rectificare. Acu' mi-am dat seama ca am gresit. Semnalul de comanda a tranzistorului trebuie scos pe GP4. Prin urmare, in pseudocodul de mai sus, GP1 se va inlocui cu GP4.

 

6 hours ago, allez001 said:

Cand am cadere de tensiune ar trebui sa creasca duty cycle  ?  Sau frecventa  ..... sau ambele ?? 

Trebuie sa cresca factorul de umplere, dar asta se poate face in mai multe feluri: fie maresti raportul dintre perioada de 1 si cea de 0, pastrand suma perioadeleor constanta, fie pastrezi perioada de 1 constanta si o misorezi numai pe cea de 0, ceea ce duce la cresterea frecventei. Cresterea, insa, nu se poate face la ghici. In general cresterea fact. de umplere e mica si are menirea de a compensa pierderile rezistive datorate cresterii de curent. In realitate, daca nu ar exista pierderi, relatia tensiune de iesie fct. de tensiunea de intrare conduce la un factor de umplere constant.   Oricum, asta e cea mai mica grija.

 

Intr-adevar, nu observasem ca nu exista referinta. Si asta e o problema. Nu am citit cu atentie articolul original. Daca foloseste comparatorul , nu ADCul ptr masurarea tensiunii de iesire, atunci filozofia scrierii programului se cam schimba.

 

Cum spuneam, pentru inceput, ca sa fie mai simplu, foloseste oscilatorul intern de 4MHz si scoate un dreptunghi de 30-50KHz pe GP4, conecteaza tranzistorul si celelalte piese si vezi ce iese.

 

Editat de cirip
Link spre comentariu

Randamentul, în principiu, nu este afectat de mecanismul de control - de PIC în acest caz. El este determinat în principal de căderile de tensiune pe tranzistor ( care la rândul lor depind de cum este acesta comandat ) respectiv pe diodă precum și de calitatea ( pierderile ) bobinei . Ca să scoți 12V din 5V la o putere relativ mică ar trebui să atingi ușor 75-80% cu bipolar și peste 80% cu MOSFET . Dar ăsta e un alt subiect de la o altă secțiune . 

Link spre comentariu

@modoran: sper ca initiatorul topicului sa aiba capabilitatea tehnica de a lipi pinii capsulelor QFN !!.

In alta ordine de idei, pentru initiatorul topicului: in atasament gasesti sursa pentru partea de generare a tensiunii de 12V din programatorul PicKit2. Te poti inspira de acolo cu privire la modul de realizare a proiectului tau.

Vpp.zip

Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări