Sari la conținut
ELFORUM - Forumul electronistilor

modificare frecventa in functie de valorile a 2 intrari ADC


ofilip

Postări Recomandate

Salutare, am facut un pic de programare in facultate dar nu mai stiu nimic :jytuiyu , nu ca s-ar fi lipit ceva de mine. :cry: Asa ca va cer ajutorul in legatura cu un program. Vreau sa masor doi curenti si in fct. de raportul lor sa modific o frecventa.Crede-ti ca ma puteti ajuta cu ceva de genul? mentionez ca am 2 buc 16f886, si un cod functional pt pwm (cand ajung acasa il voi posta), m-am descalcit eu cum sa modific registri pt a modifica pwm-ul dar as vrea daca se poate sa o faca pic-ul automat in fct . de cei 2 curenti. Ca o diagrama in mare, codul ar trebui sa fie ceva de genul. Imi cer scuze anticipat pt. lipsa mea de cunostinte in domeniu, si sa imi iertati greselili de mai jos.start frecventa initiala 80khz factor de umplere 30% Iesire pe 2 porturi - declate intre ele cu 50% din perioadavariabile C1,C2,R1,R2=0;Loop: citeste ADC1; stocheaza ADC1 in C1; citeste ADC2; stocheaza ADC2 in C2; calculeaza C1:C2; stocheaza C1:C2 in R1; daca R1>R2; creste frecventa cu 1Khz; stocheza noua frecventa in Ff; salt la Loop; altfel; revino la Ff si ramai acolo. sfarsit

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

Top autori în acest subiect

  • ofilip

    5

  • Mircea

    2

  • 10vid

    2

Top autori în acest subiect

Uite cum initializezi un PWM hardware la 500Hz, cu un oscilator de 2MHz la un 16F690.

 

Daca prescaler TMR2 este 1:1 (T2CON=0x00), frecventa de 8MHz la PIC, PR2 este 0x24, atunci PWM este 80kHz. Variatia lui PR2 de la 24 la 23 sau 25 iti schimba frecventa PWM cu approx 3kHz. Nu vad cum poti face 1kHz.

 

Vezi ca CCP1 este setat mai jos pentru full-bridge.

 

'Init PWM    CCP1CON  =   0X4E                ' CCP ON mode, FWD (default)                                                       ' P1A/C active "L"                                                       ' modulated P1B/D active "H"    CCPR1L     =   0x00    T2CON      =   0x05                  ' TMR2 ON, 1:4 prescaler    PR2            =   0xFA                 ' f=498Hz    TMR2        =   0'End init PWM

Din postul meu pe forumul mikroelektronika:

Explanation CCP1CON (under the bit number is the choice):

bit-----7-----6-----5-----4-----3-----2-----1-----0

Values:

--------0-----1 Forward Mode OR

--------1-----1 Reverse Mode

---------------------x-----x LSb of CCPR1L (linked to the Duty Cycle)

----------------------------------1-----1-----0-----0 Setup for N channel H-bridge

----------------------------------1-----1-----1-----0 Setup for P-N channel H-bridge

How to calculate PWM frequency? The formula is:PWM period = (PR2+1)*4*TMR2prescale value / FoscWhere:PR2 = 0 to 255 (0x00 to 0XFF)TMR2prescale value = 1, 4 or 16Fosc = PIC frequency in Hz (not MHz!).Example:PR2 = 0xFF (=255)TMR2prescale value = 16Fosc = 20,000,000Hz.Result:Fpwm = 1,220.703HzWant 20kHz? Change PR2 = 15 and the resulted Fpwm = 19,531.250Hz
Link spre comentariu

Daca prescaler TMR2 este 1:1 (T2CON=0x00), frecventa de 8MHz la PIC, PR2 este 0x24, atunci PWM este 80kHz. Variatia lui PR2 de la 24 la 23 sau 25 iti schimba frecventa PWM cu approx 3kHz. Nu vad cum poti face 1kHz.

Daca foloseste cristal de 20MHz, ar putea alege frecventa in pasi de ~1.3kHz, in jurul lui 80kHz.@ofilip, ai uitat sa specifici ce semnifica acel R2, vreun raport C1:C2 citit anterior?Nu vad rostul acelor rapoarte, nu ar fi mai simplu sa compari acel curent cu un curent de referinta, sau cei doi curenti intre ei (nu stiu despre ce e vorba), folosind comparatorul intern? Chiar conteaza valoarea nominala a curentilor, ca sa trebuiasca sa fie cititi cu ADC? Daca da, mai trebuie sa dai niste detalii.
Link spre comentariu

"10vid" - R2 este valoarea citita anterior -R1 este valoarea citita - nu este neaparat di 1k in 1k poate fi si mai mare -Pe mine ma intereseaza ca diferenta dintre cei 2 curenti sa fie cat mai mare, maxima si mi-a venit in minte sa fac raportul citirilor. - nu ma intereseaza valoarea nominala a curentilor, nu trebuie sa ajunga la o anumita valoare, curentii respectivi ii voi citi cu 2 senzori de curet Postez codul pe care il am pt. half bridge pe 106khz si protectie la supracurent, facut de un fost coleg de facultate cu care nu am mai reusit sa iau legatura :cry: , si sper sa gasesc ajutor pe forum.#include #include //Frecventa cristalului de Qartz = 20 MHz#define dead_time 8; //DEFINIREA DEAD-TIME-ULUI IN MULTIPLI DE PERIOADE DE TACT INTERNE ALE MICROCONTROLLER-ULUI //PENTRU O FUNCTIONARE CU UN CRISTAL DE 20 MHZ, O ASTFEL DE PERIOADA ARE VALOAREA DE 200 nS. //ASADAR, LA VALOAREA SETATA SE INTRODUCE UN DEAD TIME DE 1,6 uSvoid init_uC (void){ ANSEL = 0B00000000; ANSELH = 0B00000000; TRISB2 = 1; //PINI DE IESIRE PENTRU PWM, CARE SUNT TINUTI CA INTRARE, TRISC2 = 1; //PENTRU A NU INFLUENTA CONDUCTIA TRANZISTOARELOR PANA LA ACTIVAREA BLOCULUI PWM TRISB0 = 1; //PIN DE INTRARE PENTRU INTRERUPEREA DATA DE COMPARATORUL CURENTULUI DE IESIRE GIE = 1; //ACTIVAREA INTRERUPERII GLOBALE INTE = 1; //ACTIVAREA INTRETUPERII PE INTRAREA INT (RB0) INTF = 0; //STERG FLAG-UL DE INTRERUPERE INTEDG = 1; //INTRAREA IN INRERUPERE PE FRONT POZITIV DAT DE COMPARATOR}void init_pwm (void){ CCP1CON = 0B10001111; //PWM FUNCTIONEAZA IN HALF BRIDGE CU PINII DE IESIRE ACTIVI IN STAREA LOW CCPR1L = 0X17; //SETAREA FACTORULUI DE UMPLERE AL SEMNALELOR LA APROX. 65% PWM1CON = 0B10000000|dead_time; //DEAD TIME INTRODUS, AVAND VALOAREA SETATA PRIN #define PR2 = 0B00101110; //VALOAREA REGISTRULUI DE SETARE A FRECVETEI DE FUNCTIONARE LA 100KHz T2CON = 0B00000100; //TIMER2 PORNIT SI CU PRESCALARE DE 1 TRISB2 = 0; //PINII DE PWM SUNT SETATI ACUM CA IESIRE TRISC2 = 0; //PENTRU CA S-A PORNIT BLOCUL PWM}void main (void){ init_uC(); init_pwm(); while(1);}void interrupt ISR(void) //SUBRUTINA DE INTRERUPERE PENTRU DEZACTIVAREA PWM-ULUI{ if(INTF) //DACA INDEPLINESC CONDITIA DE INTRERUPERE EXTERNA { if(INTEDG) //DACA S-A PRIMIT UN FRONT POZITIV { CCP1CON = 0B00000000; //OPRESC GENERAREA SEMNALELOR PWM TRISB2 = 1; //REPUN PINII BLOCULUI DE IESIRE TRISC2 = 1; //CA FIIND DE INTRARE (INALTA IMPEDANTA) } else { //DACA S-A PRIMIT UN FRONT NEGATIV (DECI NU MAI ESTE SUPERCURENT) init_pwm(); //REPORNESC IESIRILE PWM } INTEDG = ~INTEDG; //INVERSEZ FRONTUL NECESAR INTRERUPERII INTF = 0; //STERG FLAG-UL DE INTRERUPERE }}

Link spre comentariu

In primul meu post am gresit cand am scris ca factorul de umplere trebuie sa fie de 30%. El trebuie sa fie undeva la 60-70% pt ca dupa microcontroller folosesc 2 optocuploare care imi inverseaza semnalul de intrare, si astfel ajung la un factor de umplere de cca 30-40%.

Link spre comentariu

Nu ai pus o schema si e imposibil sa se faca un program fara sa se stie exact cum stau lucrurile, mai ales ca e foarte usor sa busesti mosfetii la genul asta de aplicatie.Ce intereseaza e: pentru care nivel logic dat de uC conduce mosfetul? Asta pentru a stii atat polaritatea PWM-ului, dar si ce rezistente trebuie puse (pull-up sau pull-down) la iesirea uC, pentru a indeplini conditia initiala de a porni cu mosfetii inchisi.O a doua problema e tensiunea de supracurent ce intra in comparator (in functie probabil de valoarea unei rezistente de sunt) care este pragul?.

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