Sari la conținut
ELFORUM - Forumul electronistilor

Generator semnal 30....60khz


criss

Postări Recomandate

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
  • Răspunsuri 13
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • criss

    7

  • mitescu

    2

  • one

    2

  • puriu

    2

Top autori în acest subiect

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

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

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

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

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
  • 1 lună mai târziu...

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

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

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
  • 2 săptămâni mai târziu...

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

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

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