criss Postat Iunie 18, 2013 Partajează Postat Iunie 18, 2013 Buna ziua,Vreau sa fac un generator semnal pt un buzzer la o frecventa variabila intre 30khz....60khz si ca la fiecare 3s sa schimbe scala, ex din 5 in 5 khz.Inca nu stiu ce forma de semnal voi folosi nici uCul (spre atmega 8 m-as indrepta), inca nici nu am calculat ce divizor voi utiliza si daca ma pot incadra in scala dorita.T0 vreau sa-l folosesc pt temporizarea de 3s si T1 pt generare semnal.Cum as putea rezolva cu variarea frecventei in timpul functionarii? Link spre comentariu
puriu Postat Iunie 21, 2013 Partajează Postat Iunie 21, 2013 Se poate folosi orice MC. Semnalul este dreptunghiular simetric. Perioada semnalului de 16 - 32 microsecunde se imparte in doua semiperioade de cate 8 - 16 usec. dupa care iesirea trece in zero, respectiv in 1. Este greu sa se obtina trepte exacte de frecventa, dar se pot obtine usor trepte de durata. Durata unei semiperioade se obtine prin executarea unei bucle de un numar programat de ori. O bucla de 2 usec. poate fi executata de 4,5,6,7 sau 8 ori. Link spre comentariu
Eugenn Postat Iunie 21, 2013 Partajează Postat Iunie 21, 2013 Pentru precizie se poate folosi si un DDS ca acesta http://www.myplace.nu/avr/minidds/ sau http://www.electronics-lab.com/projects/test/013/ , http://www.scienceprog.com/avr-dds-signal-generator-v20/ . Mai trebuie adaugata o intrerupere la un timer in care sa se schimbe frecventa DDS-ului. Link spre comentariu
criss Postat Iunie 21, 2013 Autor Partajează Postat Iunie 21, 2013 nu stiu ce intelegeti prin 'precizie'. in cazul meu nu am nevoie de precizie ci de aproximatie si cat mai simplu as dori sa-l realizez.as utiliza un atmega 8, dar nu stiu ce semnal sa folosesc T1 in ce mod sa fie(normal,CTC...etc) Link spre comentariu
mitescu Postat Iunie 22, 2013 Partajează Postat Iunie 22, 2013 Poti utiliza ATMega 8 la timer1 in modul Fast Pwm TOP=ICR1 Frecventele dorite nu vor fi exact ceea ce doresti( mici abateri) si se pot obtine cu valorile ICR1 si OCR1 astfel: Quartz= 8000 KHz 30 KHz ICR1= 265 OCR1= 133 freq real= 30.075 KHz 35 KHz ICR1= 227 OCR1= 114 freq real= 35.087 KHz 40 KHz ICR1= 199 OCR1= 100 freq real= 40 KHz 45 KHz ICR1= 176 OCR1= 88 freq real= 45.197 KHz 50 KHz ICR1= 159 OCR1= 80 freq real= 50 KHz 55 KHz ICR1= 144 OCR1= 72 freq real= 55.172 KHz 60 KHz ICR1= 132 OCR1= 66 freq real= 60.15 KHz Factorul de umplere va avea o abatere de la 50% maxima de 2% Quartz-ul este 8MHz - poate fi si oscilatorul intern dar abaterile vor fi .. mai mari Daca pui quartz de 9MHz obtii: Quartz= 9000 KHz 30 KHz ICR1= 299 OCR1= 150 freq real= 30 KHz 35 KHz ICR1= 256 OCR1= 128 freq real= 35.019 KHz 40 KHz ICR1= 224 OCR1= 112 freq real= 40 KHz 45 KHz ICR1= 199 OCR1= 100 freq real= 45 KHz 50 KHz ICR1= 179 OCR1= 90 freq real= 50 KHz 55 KHz ICR1= 162 OCR1= 81 freq real= 55.214 KHz 60 KHz ICR1= 149 OCR1= 75 freq real= 60 KHz ptr 12MHz : Quartz= 12000 KHz 30 KHz ICR1= 399 OCR1= 200 freq real= 30 KHz 35 KHz ICR1= 341 OCR1= 171 freq real= 35.087 KHz 40 KHz ICR1= 299 OCR1= 150 freq real= 40 KHz 45 KHz ICR1= 265 OCR1= 133 freq real= 45.112 KHz 50 KHz ICR1= 239 OCR1= 120 freq real= 50 KHz 55 KHz ICR1= 217 OCR1= 109 freq real= 55.045 KHz 60 KHz ICR1= 199 OCR1= 100 freq real= 60 KHz si 16MHz: Quartz= 16000 KHz 30 KHz ICR1= 532 OCR1= 266 freq real= 30.018 KHz 35 KHz ICR1= 456 OCR1= 228 freq real= 35.01 KHz 40 KHz ICR1= 399 OCR1= 200 freq real= 40 KHz 45 KHz ICR1= 354 OCR1= 177 freq real= 45.07 KHz 50 KHz ICR1= 319 OCR1= 160 freq real= 50 KHz 55 KHz ICR1= 289 OCR1= 145 freq real= 55.172 KHz 60 KHz ICR1= 265 OCR1= 133 freq real= 60.15 KHz pentru 8MHz din 1KHz in 1KHz Quartz= 8000 KHz 30 KHz ICR1= 265 OCR1= 133 freq real= 30.075 KHz 31 KHz ICR1= 257 OCR1= 129 freq real= 31.007 KHz 32 KHz ICR1= 249 OCR1= 125 freq real= 32 KHz 33 KHz ICR1= 241 OCR1= 121 freq real= 33.057 KHz 34 KHz ICR1= 234 OCR1= 117 freq real= 34.042 KHz 35 KHz ICR1= 227 OCR1= 114 freq real= 35.087 KHz 36 KHz ICR1= 221 OCR1= 111 freq real= 36.036 KHz 37 KHz ICR1= 215 OCR1= 108 freq real= 37.037 KHz 38 KHz ICR1= 209 OCR1= 105 freq real= 38.095 KHz 39 KHz ICR1= 204 OCR1= 102 freq real= 39.024 KHz 40 KHz ICR1= 199 OCR1= 100 freq real= 40 KHz 41 KHz ICR1= 194 OCR1= 97 freq real= 41.025 KHz 42 KHz ICR1= 189 OCR1= 95 freq real= 42.105 KHz 43 KHz ICR1= 185 OCR1= 93 freq real= 43.01 KHz 44 KHz ICR1= 180 OCR1= 90 freq real= 44.198 KHz 45 KHz ICR1= 176 OCR1= 88 freq real= 45.197 KHz 46 KHz ICR1= 172 OCR1= 86 freq real= 46.242 KHz 47 KHz ICR1= 169 OCR1= 85 freq real= 47.058 KHz 48 KHz ICR1= 165 OCR1= 83 freq real= 48.192 KHz 49 KHz ICR1= 162 OCR1= 81 freq real= 49.079 KHz 50 KHz ICR1= 159 OCR1= 80 freq real= 50 KHz 51 KHz ICR1= 155 OCR1= 78 freq real= 51.282 KHz 52 KHz ICR1= 152 OCR1= 76 freq real= 52.287 KHz 53 KHz ICR1= 149 OCR1= 75 freq real= 53.333 KHz 54 KHz ICR1= 147 OCR1= 74 freq real= 54.054 KHz 55 KHz ICR1= 144 OCR1= 72 freq real= 55.172 KHz 56 KHz ICR1= 141 OCR1= 71 freq real= 56.338 KHz 57 KHz ICR1= 139 OCR1= 70 freq real= 57.142 KHz 58 KHz ICR1= 136 OCR1= 68 freq real= 58.394 KHz 59 KHz ICR1= 134 OCR1= 67 freq real= 59.259 KHz 60 KHz ICR1= 132 OCR1= 66 freq real= 60.15 KHz Succes !! Link spre comentariu
criss Postat Iunie 25, 2013 Autor Partajează Postat Iunie 25, 2013 multumesc pt ajutor! azi am avut un pic de timp liber si m-am apucat de soft, inca hw nu l-am facut. #include <avr/io.h>int main(void){ DDRB |= (1 << DDB1); // PB1 is output OCR1 = 133; ICR1A= 265; // set PWM 30khz TCCR1A |= (1 << COM1A0); TCCR1A |= (1 << WGM11); TCCR1B |= (1 << WGM12) | (1 << WGM13); // fast PWM Mode 14 TCCR1B |= (1 << CS10); // NO prescaler while (1) { // pot sa modific in timpul rularii valorile: OCR1A si ICR1? sau trebuie sa incep din nou prin initializarea functiei??.... }} Link spre comentariu
mitescu Postat Iunie 26, 2013 Partajează Postat Iunie 26, 2013 Pai.. nu pre e bine.Nu trebuie sa toggle , o sa obtii jumatate din frecventa, trebuie sa fie clear on copare match.Ca sa-ti fie mai simplu , puneTCCR1A=0X82TCCR1B=0X19Iar ptr conformitate , pui dupa astaICR1=265OCR1=133si: DA - poti schimba "din mers" valorile lui ICR1 si OCR1Ideea este simpla, timer1 numara pana la valoarea ICR1, dupa care se face 0 si o ia de la capat.Cand este 0 OC1A=1In timpul numararii cand este egal cu OCR1A, OC1A se face 0.Prin urmare factorul de umplere il controlezi din OCR1A. Pentru 50% , el trebuie sa fie cam la jumatatea lui ICR1, si deci poti scrie ceva de genul:ICR1=176; // ptr 45KHzOCR1A=ICR1A/2;totusi este mai bine sa lucrezi direct cu valori numerice, este mai rapida schimbareaICR1=176;OCR1A=88;Succes ! Link spre comentariu
criss Postat August 12, 2013 Autor Partajează Postat August 12, 2013 cred ca aceasta deja va fi bun: // definire frecventa procesor 8Mhz#ifndef F_CPU#define F_CPU 8000000UL #endif#include <avr/io.h>#include <avr/interrupt.h> volatile unsigned char incS; // 1000 mS //----------- timer 0 ---------------ISR (TIMER0_OVF_vect) {// timer static unsigned char CountMS = 0; static unsigned char CountS = 0; TCNT0 += 6; if (++CountMS == 400) { CountMS = 0; if (++CountS == 10) // 1000ms (1s) { CountMS = 0; incS =+1; } } }// -------------------------------------------------------------------void Timer_0_setup(void){// setup timer 0TCCR0 |= (1 << CS01); // 8 divizor => 1MhzTCNT0 = 0; // Valoare intialaTIMSK |= (1<<TOIE0); //Timer/Counter0 Overflow Interrupt Enable }// -------------------------------------------------------------int main(void){ // initializare Timer 0 Timer_0_setup(); // ------------- timer 1 ------TCCR1A=0X82;TCCR1B=0X19;ICR1=176;OCR1A=88; sei(); // enable interrupt while(1) { if (incS == 3) { //36.036 KHz ICR1=221; OCR1A=111; } else if (incS == 6) { // 42.105 KHz ICR1=189; OCR1A=95; } else if (incS == 9) { // 48.192 KHz ICR1=165; OCR1A=83; } else if (incS == 12) { // 54.054 KHz ICR1=147; OCR1A=74; } else if (incS == 15) { // 60.15 KHz ICR1=132; OCR1A=66; } if (incS > 15) { incS = 0; //** 30 KHz ** ICR1=265; OCR1A=133; } } } Link spre comentariu
one Postat August 14, 2013 Partajează Postat August 14, 2013 Pe un alt thread tot la AVR am gasit acest link: http://www.myplace.nu/avr/minidds/ Link spre comentariu
criss Postat August 15, 2013 Autor Partajează Postat August 15, 2013 mersi dar eu doream ceva stand alone fara pc. acuma am reusit sa fac softul si hw doar cand atasez tranzistorul final atunci oscileaza ca naiba, nu mai am frecventa cat de cat stabila + ca depaseste 60khz si cam pe la 120khz se opreste(fracventa l-am masurat la iesirea uCului, daca deconectez tranzistorul totul merge ca uns).Tranzistorul final este un IRLZ24NSPBF... intre iesirea uC si poarta tranzistorului am pus o rezistenta de 1k, iar intre sursa si poarta am pus tot un 1k ca si rezistenta pull-low Link spre comentariu
puriu Postat August 15, 2013 Partajează Postat August 15, 2013 Tranzistorul final trebuie comandat printr-un filtru RC, de exemplu un rezistor de 1 kilo serie si un condensator de 100 pico la masa. Link spre comentariu
criss Postat August 16, 2013 Autor Partajează Postat August 16, 2013 am pus condensatorul si rezistenta dar tot aceeasi treaba, oscileaza enorm de mult, daca ar fi fost doar cativa khz nu era problema dar deja depaseste 100khz la 60khz ce ar trebui sa-i am ii enorm de mult :(dupa mai multe incercari am observat ca sub 22nF merge(adica se aprinde ledul dar totusi oscileaza), peste aceasta valoare finalul nu comanda sarcina (un led folosesc ca si sarcina). Link spre comentariu
one Postat August 26, 2013 Partajează Postat August 26, 2013 mersi dar eu doream ceva stand alone fara pc.Nici macar nu te-ai uitat cu atentie, imi pare rau ca am pierdut timpul cautand o sugestie pentru tine.Eu ti-am recomandat un proiect asemanator de la care ai putea sa copii partea cu generarea frecventelor. Comunicatia RS232 poate fi ignorata...Autorul pune la dispozitie codul in assembler. Nu ai nici o treaba cu computerul. Poti scrie "manual" valoarea frecventei, in program, fara sa o citesti pe seriala.Daca te astepti sa iti dea cineva un proiect EXACT cum iti trebuie atunci succes... Link spre comentariu
criss Postat August 26, 2013 Autor Partajează Postat August 26, 2013 ii drept ca doar o privire am aruncat si nu am citit , nu programul este problema, l-am facut functioneaza brici, doar daca atasez un final (driver) nu mai am aceeasi frecventa si oscileaza anapoda.partea de comanda putere ma intereseaza(un difuzor/buzzer la 12V). 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