criss Postat Ianuarie 6, 2010 Partajează Postat Ianuarie 6, 2010 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
mitescu Postat Ianuarie 7, 2010 Partajează Postat Ianuarie 7, 2010 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
criss Postat Ianuarie 7, 2010 Autor Partajează Postat Ianuarie 7, 2010 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 Link spre comentariu
criss Postat Ianuarie 7, 2010 Autor Partajează Postat Ianuarie 7, 2010 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
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