Sari la conținut
ELFORUM - Forumul electronistilor

Software PWM - 12F675


78ATI

Postări Recomandate

Buna tuturor,Am o rugaminte pentru toti colegii de forum:Incerc sa fac un mic dimmer pentru un led, sau mai precis pentru o sursa de lumina cu cateva led-uri, si am considerat ca pentru un astfel de "job" un 12F675 este suficient, cu atat mai mult ca imi prisoseste printr-un sertar.Am reusit sa modulez in frecventa astfel incat sa se aprinda in moduri diferite: 0%, 10% ...50% etc din cei 5V furnizati pe portul de iesire.Problema este ca nu reusesc nici cum sa fac cumva sa trec prin aceste moduri sub forma unui ciclu FOR.Pentru a face ca tensiunea sa fie 2.5V, am creat urmatoare bucla:while 1=0 ' bucla infinitaGPIO.4=1delay_us(500)GPIO.4=0delay_us(500)wendNu stiu cum as putea face ca aceasta bucla sa nu fie infinita ci sa fie parcursa un anumit timp de exemplu 1secunda. Daca folosesc functia delay, se intazie executia respectivelor comenzi insa nu pot face incrementarea altor variabile.Puteti sa ma ajutati in acest sens?Va multumesc!

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

Top autori în acest subiect

  • 78ATI

    4

  • INCEPATOR21

    4

  • Th3_uN1Qu3

    3

  • cirip

    2

Top autori în acest subiect

Nu stiu cum as putea face ca aceasta bucla sa nu fie infinita ci sa fie parcursa un anumit timp de exemplu 1secunda. Daca folosesc functia delay, se intazie executia respectivelor comenzi insa nu pot face incrementarea altor variabile.Puteti sa ma ajutati in acest sens?Va multumesc!

Nu stiu in ce limbaj e scris programul, dar ideea e sa ai mai multe bucle incluse una in alta.La exterior e bucla infinita Un nivel mai jos e o bucla while finita, care spune dupa cat timp schimbi factorul de umplere, k.La nivelul cel mai de jos e ceea ce ai scris pana acum, dar putin modificat, de ex:GPIO.4=1delay_us(1000-k)GPIO.4=0delay_us(k)si o data la n cicluri in modifici pe k cu o unitate, k=1 ... 999Chestia e sa-l schimbi pe k in timp ce rulezi.Cred ca ai prins ideea.Cirip
Link spre comentariu

Programul este scris in Mikrobasic, sau am incercat sa il scriu. Problema ar fi ca functia delay_us sau delay_ms nu suporta paramentrii variabili ci doar constante. Mai exista o functie vdelay_ms, ce suporta variabile, insa cred ca ms (milisecunda) este un interval cam mare pentru un pwm.Am mai incercat o versiune, sa folosesc intreruperile interne:symbol LED_OUT = GPIO.5dim fact_umplere as byte'*******************************************************************************sub procedure interrupt cnt = cnt + 1 ' increment value of cnt on every interrupt INTCON = %10001000 '0x88end sub'*******************************************************************************main: Cmcon=7 TRISIO = %00001111 ' Configure AN2 (GPIO.2) as an Input ' Configure GPIO.0 as an Input ' Configure GPIO.3 as an Input ANSEL = %00110100 ' Set GPIO.2 as Analog Input ADCON0 = %10001000 ' Set analogue input on GPIO.2 do if cnt = 255 then LED_OUT=1 cnt = 0 end if for cnt=0 to 255 LED_OUT=1 vdelay_ms(fact_umplere) LED_OUT=0 vdelay_ms(255-fact_umplere) next cnt if fact_umplere<255 then fact_umplere=fact_umplere+1 else LED_OUT=1 end if loop until 0 = 1end.Ceea ce se intampla cred ca este foarte rapid,vad doar o "licarire" parcurgerea de la 0% la 100% se face foarte repede. Astfel incat dispare frumusetea pornirii usoare.Cred ma mai trebuie sa studiez "intreruperile"... (ps: folosesc 12F675 cu oscilator intern 4MHz).

Link spre comentariu

vad doar o "licarire" parcurgerea de la 0% la 100% se face foarte repede. Astfel incat dispare frumusetea pornirii usoare.Cred ma mai trebuie sa studiez "intreruperile"... (ps: folosesc 12F675 cu oscilator intern 4MHz).

Sa presupunem ca vrei sa se aprinda de la 0 la 100% in 5 secunde. Semnalul tau are frecventa de 1KHz si trebuie sa ii cresti factorul de umplere de la 0 la 100% in 5 secunde.-In 5 secunde vei avea 5*1K=5000 perioade ale semnalului de 1KHz-Vrei sa cresti de la 1 la 100, inseamna ca la fiecare factor de umplere trebuie sa stea 5000/100=50 perioade.-Deci dupa fiecare 50 de perioade de 1ms incrementezi factorul de umplere, respectiv pe acel k cu 1.Nu cred ca ai nevoie de intreruperi daca nu mai faci si altceva.
Link spre comentariu

Multumesc mult pentru sfat si solutie. Am reusit sa fac un pseudo "PWM" am sa incerc sa il perfectionez.Mai am o problema daca sunteti amabil sa ma ajutati:Am incercat un PIC 18F1320, acesta are PWM hardware. factorul de umplere sau "duty" variaza intre 0 si 255.Pe un port de intrare, setat ca si analogit, am cules semnalul emis de o fotodioda. Aceasta genereaza cu ajutorul unui amplificator un semnal cuprins intre 0 si 3.5V.Ipoteza: In convertorul A/D: 5V -> hex 1024 (A/D)Cerere: Dorec sa fac o relatie intre tensiunea de intrare culeasa de la fotodioda si PWM generat intre 0-255. Formula este extrem de simpla, insa nu functioneaza:ex:dim Voltage as wordVoltage = ADC_Read(0)dim pwm_max as bytepwm_max = (Voltage*255)/1024Culmea: pe hartie calculat, daca Voltage primeste valori intre 0 si 1024, rezulta simplu o valoare a pwm_max intre 0 si 255. Realitatea nu o confirma!Intrebare: PIC-ul nu este capabil sa faca operatia matematica? sau ce se intampla?Va multumesc mult pentru viitoarele sugestii

Link spre comentariu

Ipoteza: In convertorul A/D: 5V -> hex 1024 (A/D)

Corect este : Intrare A/D: 5V -> rezultat in hexa- 3FF, zecimal-1023; considerand ca referinta CAD-ului este tot la 5V.Rezultatul Voltage*255 poate ajunge la o valoare pe 18biti. Ori redimensionezi pwm_max ori folosesti o variabila temporara pt ecuatia respectiva. Incearca astfel:
dim Voltage as worddim pwm_max as bytedim temp as longwordVoltage=ADC_Read(0)temp=(Voltage*255)/1023pwm_max=Lo(temp)
Link spre comentariu

Superb! Functioneaza!Va multumesc mult pentru ajutor! Se pare ca esenta este in definirea variabilei. Credeam ca variabila incarca doar rezultatul final.Pentru cei interesati: pwm invers proportional cu tensiunea generata de o fotodioda: dim i_in as byte dim i_out as word dim i_val as byte dim Voltage as word ' Tensiune citita pe rezistente dim tmp as longint dim pwm_max as byteVoltage = ADC_read(0)Delay_ms(10) tmp=(Voltage*255)/1023 pwm_max=Lo(tmp) i_out=255-pwm_max if i_val<=i_out then for i_in = i_val to i_out step + 1 Pwm_Change_Duty(i_in) ' Change duty ratio Delay_ms(50) next i_in else for i_in = i_val to i_out step - 1 Pwm_Change_Duty(i_in) ' Change duty ratio Delay_ms(50) next i_in end if i_val=i_out

Link spre comentariu
  • 3 luni mai târziu...

buna seara! Ma poate ajuta cineva sa mi faca un program pt 12f675 sau 12f629 sa mi dea pe iesire PWM? As dori sa fac asta din telecomanda ca binecunoscutul IR ON/OFF CU ACEST PIC http://www.ivica-novakovic.from.hr/IrOn ... m#IrOnOff2 . Diferenta este ca vreau sa il folosesc la marirea sau micsorarea volumului unei boxe sau la un bec. nu vreau dimmer doar sa modific din telecomanda pwm. Daca nu cer prea mult as dori sa aibe 2 iesiri pwm sa pot comanda 2 aparate separat. nu stiu sa programez picuri, cu atm8 mi a iesit dar am mai multe picuri si de aceea.va multumesc mult!

Link spre comentariu

Cum intentionezi sa controlezi "volumul unei boxe" cu PWM ?Nu cred ca sta cineva sa-ti faca programul de-a gata, poate doar contra-cost. Insa daca scri tu codul si intampini probleme, atunci probabil vei fi ajutat.

Link spre comentariu

Aveam de gand sa bag pwm de la pic in alimentarea boxei. Daca boxa primeste o tensiune mai mica ar rezulta volum mai mic. Gresesc sau nu?Daca gresesc spuneti mi unde sa caut nu vreau totul de a gata. Si 2: cat ar costa un soft de a controla pwm din telecomanda pt 12f675?

Link spre comentariu

Daca primeste tensiune mai mica vei avea sunet mai distorsionat, nu neaparat volum mai mic. Pana la urma va scadea si volumul, dar evident, odata cu calitatea. Iti trebuie un potentiometru digital pt ce vrei tu.

Link spre comentariu

am inteles, deci acel pot digital impreuna cu pic pwm ar face treaba. Multumesc de raspuns. Incerc de vreo 2 saptamani sa aflu o solutie dar am fost luat doar la misto. Inca o data multumesc pt bunavointa

Link spre comentariu

Da, dar nu neaparat cu PWM. Majoritatea potentiometrilor digitali se comanda prin interfata I2C sau SPI. Chiar e mai usor decat sa te chinui sa faci PWM cu 675, eu am facut si stiu ce zic. Microcontrollerele sunt foarte usor de adaptat la aceste interfete de viteza mica.Cauta la Farnell acesti potentiometri. De fapt sunt in forma unor integrate, nu se rotesc fizic cum sunt cei cu motor de exemplu, sunt niste integrate care se comanda printr'o interfata, cu 2 butoane. Adica exact ce vrei tu. Exista si cu memorie incorporata care tin minte ultima pozitie. Apropo de asta, ma bate gandul sa'mi fac un EQ hibrid, filtre obisnuite analogice (cu operationale), dar comandate cu potentiometri digitali. EQ cu presetari, la care nu mai plangi daca iti umbla cineva. :da

Link spre comentariu

eu de fapt vreau sa controlez cu o telecomanda rc5 un circuit sa faca aceste modificari de volum nu prin apasari fizice direct la boxe sau pot. Asta ca sa fiu sigur ca sunt inteles nu te contrazic la cele spuse. Cu atm8 am reusit sa fac pwm dar nu vreau sa l irosesc de aceea vreau sa fol 12f675 ca tot il am si habar nu am de picuri. inca o data ms

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