Sari la conținut
ELFORUM - Forumul electronistilor

Fast PWM Mode cu selectia factorului de umplere


criss

Postări Recomandate

Buna

 

Doresc sa realizez un modul PWM pt comanda unor leduri, cu frecventa(aprox.) de 200hz si ca factorul de umplere sa il pot varia(50% si altul la 90%) prin actionarea a doua butoane.

 

Am facut ceva incercari dar nu mi-a reusit:

 

- Microcontrolerul este Attiny 2313, cu timer intern 1Mhz

 

- Timerul/counter0 pe 8 biti

 

- iesire comanda leduri: PB2

 

- intrare pt selectia factorului de umplere de 50% = PD2 respectiv 90% PD3 iar daca ambele intrari sunt 'selectate' factorul de umplere va fi de 90%.

 

 

#include <avr/io.h>int main(){	DDRB |=     (1<<PB2);	DDRD |=	(0<<PD2);	DDRD |=	(0<<PD3);	TCCR0A |= (1<<WGM00) | (1<<WGM01) | (1<<COM0A1);TCCR0B |= (1<<CS00) | (1<<CS01);while (1)             { if (PIND & (1<<2))  {	OCR0A = 127; 		}	  else if (PIND & (1<<3)){	OCR0A = 229;	}else if ((PIND & (1<<2)) || (PIND & (1<<3)) ){	OCR0A = 229;}else {	OCR0A = 0;}}
Link spre comentariu
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    3

  • mitescu

    1

Zile populare

Top autori în acest subiect

Pai.. in primul rand nu se stiu starile de la butoane. Trebuia sa le configurezi cu pull-up intern si actionarea sa o faci prin punere la GND. Adica buton apasat insemna 0 logic pe intrare.

PORTD=0x0C;DDRD=0x00;
configurarea iesirii este

PORTB=0x00;DDRB=0x04;
configurarea timerului 0 se face in mod Phase correct PWM top=FFh

TCCR0A=0x81;TCCR0B=0x02;
iar codul de "citire " butoane va fi:

while (1)      {      if(PIND.2==0){OCR0A=127;}      if(PIND.2==0){OCR0A=229;}      };
Link spre comentariu

Multumesc pt ajutor, dar cam am intrat in ceata.

 

butoanele vor fi actionat prin + adica pe intrare voi avea 1 logic.

mai am lucrat aseara pe ea si asta mi-a reusit pe jumatate, dar tot nu pot compara cele 2 intrari deodata, adica sa stiu cand sunt apasate ambele butoane deodata!ex. La apasarea butonului de pe PD2 voi avea factorul de umplere 15% iar la PD3 30% dupa care la actionarea ambelor butoane in aceeasi timp voi avea 100%(aceasta nu-mi functioneaza)

 

#include <avr/io.h>unsigned int new_value;int main(){	DDRD |= (0<<PD2);	DDRD |= (0<<PD3);	DDRB |= (1<<PB2);while (1)              {TCCR0A |= (1<<WGM00) | (1<<WGM01) | (1<<COM0A1);TCCR0B |=  (1<<CS01);OCR0A = new_value; if (PIND & (1<<3))  {	new_value = 30;	}		  else if (PIND & (1<<2)){	new_value = 15;	}else if ( (PIND & (1<<2)) & (PIND & (1<<3)) )   // aici nu-mi functioneaza, ceva nu fac bine si nu-mi pot da seama ce...{	new_value = 255;}else {	new_value = 0;	}}}
pe cele doua intrari folosesc rezistente PULL-DOWN de 10k

 

Posted Image

Link spre comentariu

am rezolvat :)

 

dar a mai aparut o problema si ma precis cand intrarile nu sunt 'actionate'(nu am tensiune la pini) ledul este aprins(extrem de slab, dar imi este frica ca poate influienta optocuplorul care va inlocui ledul), nu se pune problema 'parazitilor', intrarile sunt 'trase' la masa.

Iar a doua intrebare ar fi cum pot mentine aceeasi/aproximativ frecventa dar sa pot varia factorul de umplere:

ex. Pt factorul de umplere de 50% valoarea lui OCR0A este 127, frecventa microcontrolerului fiind de 1Mhz iar divizorul fiind de 8. frecventa ar fi: 1 MHz / 8*127 = ~984hz

 

iar pt 90% = 229.

1 MHz / 8*229 = ~545hz

 

daca l-as putea 'stabiliza' la 200hz ar fi bine.adica sa mentin aceste valori pt factorul de umplere si sa modific divizorii?

 

#include <avr/io.h>unsigned int new_value;int main(){	DDRB |=  (1<<PB2);	DDRD |=  (0<<PD2);	DDRD |=  (0<<PD3);while (1)              {	TCCR0A |= (1<<WGM00) | (1<<WGM01) | (1<<COM0A1);	TCCR0B |=  (1<<CS01);	OCR0A = new_value; if ((PIND & (1<<3)) && !(PIND & (1<<2)))  {	new_value = 30;	}  else if ((PIND & (1<<2)) && !(PIND & (1<<3))){	new_value = 15;	}else if ( (PIND & (1<<2)) && (PIND & (1<<3)) )   {	new_value = 255;}else {	new_value = 0;	}  } }
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