Sari la conținut

Oscilator sinusoidal de 7,83 Hz


iozsi50

Postări Recomandate

Buna ziua.As dori ajutor pentru realizarea unui Oscilator sinusoidal de 7,83 Hz  modulat tot cu un semnal sinusoidal de aceeasi amplitudine de 120 Hz. Orice idee si ajutor schematic mi-ar fi de ajutor. Am ceva habar de programare al microcontrolerului Arduino...Multumesc.

Link spre comentariu
Distribuie pe alte site-uri

Aveti nevoie de fix 7,83Hz ? Ganditi-va inainte sa construiti un asemenea generator, cum il calibrati ?! Cu ce aparat ?

 

Pentru a obtine o asemenea precizie cu nu foarte multe batai de cap ca varianta 100% analogica, o solutie ar fi sa creeati un generator de semnal de 783Hz cu arduino si sa-i conectati pe iesire un divizor de frecventa (/100) cu o schema de principiu cum este cea de 10:

https://www.electronicshub.org/frequency-divider-circuit/ 

Link spre comentariu
Distribuie pe alte site-uri

Va recomand sa parcurgeti si materialul urmator pentru a intelege notiunea de "modulare" a unui semnal:

https://www.ee-diary.com/2023/03/frequency-modulation-using-555-timer.html

Retineti ca modularea unui semnal se poate face atat in frecventa cat si in amplitudine. Deci, pentru inceput trebuie sa va trasati mai exact ceea ce doriti sa obtineti prin, citez: "modulat tot cu un semnal sinusoidal".

Link spre comentariu
Distribuie pe alte site-uri

partea de jos e a figurii e semalul purtator de 120Hz semalul modulat e sus ala care are frecventa celui de jos dar cu amplitudinea variabila.

 

Figura pusa de tine e un caz particular cand semnalul modulator are numai esantiane pozitive (adica are si o componenta continua) - nu sunt sigur ca vrei asta. (de fapt nu sunt sigur ca stii ce vrei) 

 

modulatia in amplitudine e relativ simpla din punct de vedere matematic  trebuie doar inmulte cele doua sinusoide.  

A1(sin f1) * A2(sin f2) 

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Da probabil ca nu stiu ce vreau.De aceea am trecut al incepator...Semnalul ce am masurat arata ca si cel de jos, era de 7.83hz, dar avea acele "rizuri" pe marginea undei...am intrebat pe cineva ce sunt acele "ondulatii" si mi-a spus ceea ce am cerut cand am deschis topicul...Atunci poate ma luminati si-mi spuneti ce tip de frecventa am masurat...

 

Se poate sterge topicul...Am gasit in mare despre ce este vorba...Multumesc pentru timpul acordat. Numai bine !

Link spre comentariu
Distribuie pe alte site-uri

semnalul de jos din figura care ai atasat-o e un semmal sinusoidal cu o anumita frecventa (nespecificata in figura).

tu ai cerut ajutor pentru un modulator in aplitudine 

Ce ma induce pe mine in eroare e ca spui ca semnalul e ca cel de jos dar cu rizuri ca cel de sus - intradevar cel de sus e modulat in amplitudine. (poate era mai simplu sa spui ca spui ca vrei un semnal ca cel de sus din figura)

Oricum se pare ca nu mai ai nevoie de nici un ajutor ca ai "gasit in mare despre ce e vorba"

Numai bine si tie!

RR  

 

@donpetru se poate obtine exact 7.83Hz cu orice MCU care are un oscilator cu quartz (sau unul cat de cat precis) si timere. E foarte simplu de fapt (dupa 35 de ani de programare)

Calculezi un lookup table cu valorile sinus pentru o perioada completa a unui semnal de 7.83Hz supraesantionat de 100x (oversampled) deci vei avea in total 783 de esantioane in tabela. (poti face asta in excel de exemplu). Programezi un timer sa exipire cu frecventa de 783Hz (de 783 de ori pe secunda) - si sa genereze o intrerupere fa fiecare expirare. La fiecare intrerupere iei esantionul urmator din tabela si-l trimiti la un DAC (facut cu rezistente R2R) sau la alt timer folosit ca PWM care-l trimiti afara la un pin (daca folosesti PWM - mai pui un filtru trece jos RC la pinul respectiv ca sa filtrezi frecventa PWM-ului)

La iesirea DAC-ului sau la iesirea filtrului Trece jos al PWM-ului vei avea exact 7.83Hz.

 

 

Editat de roadrunner
  • Thanks 1
Link spre comentariu
Distribuie pe alte site-uri

Era bun de stiut la ce ii folosesti un asemenea aparat (circuit) !!!!!!!!!!! :smile:

Doi la mana, e buna observatia admin-ului cum masori exact cei 7,83Hz !!!!! Am intalnit aplicatii unde pretul unui device era influentat in proportie de peste 50% de aparatele folosite la calibrare. Pentru ca daca ai o cerinta unde pe iesire trebuie sa obtii o frecventa stabila la nivel de doua zecimale, scuzati-ma, domnilor, dar e nasol tare de tot. Hai, cei 120Hz e mai masori cum ii masori dar lucrurile se complica.

Acum 20 minute, roadrunner a spus:

[...]se poate obtine exact 7.83Hz cu orice MCU care are un oscilator cu quartz (sau unul cat de cat precis) si timere. E foarte simplu de fapt (dupa 35 de ani de programare)

 

Hai sa-ti spun eu, pana raspunde dl.petru. Nu e simplu pt toata lumea. Chiar si cu timere m-am jucat si ca sa generezi la nivel de doua zecimale nu e chiar asa usor. Poate cu niste DSP-uri sau ARM-uri pe 32bit, si sinus, dar nu e floare la ureche. E mai simplu sa stabilzezi dupa parerea mea cu mai putin ani programare ca tine un, cum zice si dl.petru, un 783Hz (il mentii mai usor stabil) si apoi il divizi cu 100.

Cu timere-le din microcontrolere de 8bit, acolo e jale, step-urile nu iti permit sa obtii fix orice ce frecventa vrei. E mai complicata treaba si cum sunt useri care de abia afla ca exista modulare in frecventa si in amplitudine, vor sa construiasca ceva dar nu stiu exact practic ce vor sa obtinem, ca sa le vindem solutii complexe si bune, e cam de prisos, parerea mea!

Editat de prog
Link spre comentariu
Distribuie pe alte site-uri

am editat postul meu de mai sus cu metoda care as folosi-o eu (nu neaparat cea mai buna si nici singura)

RR

 

La fel e si cu semalele modulate constant, se pot rezolva usor cu look-up table. dar trebuie sa fie mai lung si trebuie sa alegi oversampling-ul mare ca sa-l poti filtra usor la sfarsit. Cu metoda prezentata mai sus de mine obtii faca probleme precizii de fractiuni de hertz la 3 zecimala iar frecventa de esantionare e usor de chiar si cu un trece jos de ordinul I, fiind de 100 de ori mai mare decat semnalul dorit.

RR 

 

PS- la frecventele asa joase poti cascada timere daca nu ai suficient prescaler sau rezolutie la timer (sau poti sa folosest un simplu contor sotware in rutina de intrerupere a timer-ului)

sau daca ai suficient RAM poti face oversampling mai mare la esantioane, ai suficiente metode sa obtii cu precizie de 0.001Hz. Aceleasi metode sunt folosite in NCO (numeric control oscillators) - cu un  acumulator de faza (care de fapti e timerul in cazul nostru cu MCU) de 20 de biti obtii fractiuni de hertz cu stabilitatea quartz-ului (20ppm) fara probleme.

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Citat

Doi la mana, e buna observatia admin-ului cum masori exact cei 7,83Hz !!!!!

sper ca e o gluma intrebarea. 

 

Citat

ca sa le vindem solutii complexe si bune, e cam de prisos, parerea mea!

ce e complicat ?

a.) calulezi valorile sinus in excel python (sau C la initializarea MCU) si le pui intr-un array.

b.) alegi niste valori potrivite la timer in functie de clk-ul timerului si calculezi valoare de reload ca sa obtii o intrerupere la 1/783. Faci enable la timer interrupt

c.) scrii rutina de intrerupere care sa citeasca valoare urmatoare din look-up table si s-o trimita la un port de o biti (lipesti 16 rezistoare la portul ala ca sa faci un DAC R2R)

 

Eu zic ca sunt maxim 30 de linii de cod si frumusetia e ca MCU nu mai arde decat maxim zece periode de ceas de 783 de ori pe secunda. (adica practic nu face nimic decat muta niste numere din RAM la un port de 783 de ori pe secunda)

 

daca cineva are o solutie mai simpla sau mai precisa decat asta as vrea s-o aud. 

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Problema cu post-ul original e nu am inteles exact ce vrea, a zis ca vrea un semnal de 7.83Hz modulat de un semnal de 120Hz (de fapr invers cel de frecventa mica il moduleaza pe cel de frecventa mare - cu toate ca matematic daca le inversezi obtii acelasi lucru) dar mai ales ca nu era foarte dispus sa invete ceva (decat asa in mare) - aste e viata, de unii se lipeste informatia de altii nu. (nu toti trebuie sa cante la pian, trebuie sa avem si pe unii sa care pianu')

RR

 

PS Totusi e o idee buna pentru un episod de Youtube...si alt episod cu masurearea cu precizie mare a frecventei generate fara scule scumpe.

 

 

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

#include <timer.h>
#include <arduino-timer.h>
  
unsigned char dac_val(100); //tabela asta trebuie populata cu valori 100 precalculate pentru o peioada sinus.
Timer<1, micros> timer; // create a timer with 1 task and microsecond resolution

bool dac_update(void *) {
	static unsigned char i=0;
	PORTD = dac_val(i);
	i++;
	if (i==100) i=0;
return true; // repeat? true
}

void setup() {
DDRD = B11111111;  // sets Arduino port D pins 0 to 7 as outputs
// call the dac_update function every 1277 microsec (1/1277us = 1/0.001277 sec = 783.08 Hz)
timer.every(1277, dac_update);  
}

void loop() {
timer.tick(); // tick the timer
}

 

deci o tabela cu 100 de valori sinus precalculate (o perioada completa) va genera o frecventa de 7.8308Hz  -  asta direct cu ce are Arduino (care nu prea are)

15 linii de cod. (16 rezistente in DAC-ul R2R,  1 rez si un cond sa filtrezi componenta de 783Hz si un ultim cond serie sa separi componenta continua de la iesirea DAC-ului.

 

https://www.arduino.cc/reference/en/libraries/arduino-timer/

 

daca vrea semnal modulat la iesire trebuie un look-up table mai lung care-l incarci cu semanlul modulat nu cu cel sinusoidal (alegerea valorilor din timer si lungimea tabelei trebuie aleasa corespunzator ca sa ai perioade complete in rest nu e mare lucru doar se schimba niste numere)

RR

 

PS - Inainte sa uit, valorile precalculate trebuie sa fie truchiate la 8 biti si sa se adauge un bias de 127 pentru ca DAC-ul R2R (din rezistente) lucreaza numai cu valori pozitive. (bias-ul se va scoate cu un condesator serie la iesire)

 

Editat de roadrunner
  • Thanks 1
Link spre comentariu
Distribuie pe alte site-uri

Am fost indus in eroare cu semnalul modulator de o anumita persoana...Se pare ca e doar o frecventa de aproximativ 7.82 hz....ar trebui sa fie de 7.83 hz...Am gasit un program pentru arduino ,si cu un filtru RC cu care reusesc sa reproduc acea unda sinusoidala,cu acel "rizuri"... 

 

uint8_t pVal = 127;
const float pi2 = 6.28;
const int samples = 122.389;//100...prin modificarea acestei valori obtin 7.82...se pare ca de aici sunt "rizurile"...
int WavSamples[samples];
int count = 0;

void setup() {
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);
  setPwmFrequency(10, 1);
  analogWrite(10, 127);

  float in, out;

  for (int i = 0; i < samples; i++) {
    in = pi2 * (1 / (float)samples) * (float)i;
    WavSamples = (int)(sin(in) * 127.5 + 127.5);
  }
}

void loop() {
  if (count > samples) count = 0;
  bitBangPWM(WavSamples[count], 4);
  count++;
}

void bitBangPWM(unsigned long on, int pin) {
  int period = 1000;
  on = map(on, 0, 255, 0, period);
  unsigned long start = micros();
  digitalWrite(pin, HIGH);
  while ((start + on) > micros());
  start = micros();
  digitalWrite(pin, LOW);
  while ((start + (period - on)) > micros());
}

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if (pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch (divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if (pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if (pin == 3 || pin == 11) {
    switch (divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x07; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

Link spre comentariu
Distribuie pe alte site-uri

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
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.

×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock