Sunteți pe pagina 1din 9

Achizitia si prelucrarea semnaleleor

Profesor: Sorin Moisa

Cerintele lucrarii de laborator:

1. Generearea unui semna


2. Achizitionarea acelui semna cu un microcontroller
3. Interpretarea datelor ADC si transformarea in valoare reala a semnalui
4. Aplicarea transformarii furrier a semnalului obtinut.
1. Generarea semnaluilui

Generarea semnalului se va folosi telefonul si un programel ”Frequency Generator” care are


posibilitatea de a genera diferite tipuri de semnale pe anumite frecvente.
2. Achizitionarea acelui semna cu un microcontroller:

Se va folosi un microcontroller de la Texas Instruments pe unul din canalele de ADC


“MSP430G2553”

Se va folosi ADC0 pe portul P1.0


Pentru achizitia smenalului din telefon se va folosi un cablu jack doar canalul stang la cuplarea
jackului unde se cupleaza castile telefonului.

Maro se cupleaza la GND uC pentru a avea aceasi masa iar Galben se cupleaza la P1.0 adica ADC0 al
uC.
Partea cea mai interesanta este partea de achizitie adica configurarea uC si interpretarea
semnalului apoi transmiterea lui pe seriala unde va fi descrisa in continuare :

1. Configurarea frecventei de lucru a uC:


DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ;
BCSCTL2 |= DIVS_0;
uC va functiona la o frecventa de 16Mhz main clock si submain clock de 16Mhz.

2. Generarea unei intreruperi cu ajutorul Timerului pentru achizitionarea valorii de ADC la


anumite intervale de timp.

TA0CCR0 = 16000;
TA0CCR1 = 10;
TA0CCTL1 = OUTMOD_0;
TA0CTL = TASSEL_2 + MC_1 + TAIE;

Achizitia se va face o data la 1ms.


#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0 (void)//25 priority
{
AchizitionareaValorii_ADC();//read from ADC10MEM and store somewhere
timer_Ocured = true;
}
3. Configurarea perifericului de ADC.

//VR+ = VREF+ and VR- = VSS sample-and-hold time ADC10 on


ADC10CTL0 = SREF_1 + REF2_5V + ADC10SHT_0 + REFON + ADC10ON + ADC10IE + MSC; //
Set ADC module
ADC10CTL1 = CONSEQ_2 + INCH_0 + ADC10DIV_0 + ADC10SSEL_0; // repeat single-
channel + A0 + clock source ADC
ADC10CTL0 |= ENC + ADC10SC;
Referinta ADC de 2.5V.

4. Configurarea perifericului de Serial/Uart.

P1SEL |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD


P1SEL2 |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104;// 9600 baud at 16mhz
UCA0BR1 = 0;
UCA0MCTL = UCBRS0 + UCBRF_2 + UCOS16;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UC0IFG &= ~UCA0RXIFG;
UC0IFG &= ~UCA0TXIFG;
UC0IE |= UCA0RXIE; // Enable USCI_A0 RX interrupt
UC0IE |= UCA0TXIE; // Enable USCI_A0 RX interrupt
TxBuffer_Uart_Head = 0;
TxBuffer_Uart_Tail = 0;

Setarea BautRate la 9600 biti pe secunda.


5. Transmiterea pe seriala:
while (1)
{
if (timer_Ocured)
{
print("%d,",localAdcValue);
timer_Ocured = 0;
}
}

6. Citirea semnalului negativ , deorece telefonul genereaza semnalul


sinusoidal +- 200mv.

O observatie foarte interesanta a venit de la domnul professor cum vom citi


partea negativa a semnaluilui deoarece uC poate citi intre 0 si vRef adica
2.5V.
Rezolvarea acestei probleme am rezolvato printr-un potetiometru adica un
divisor rezistiv care are referinta nu la GND ci V_REF.
Adica voi incerca sa explic si sa simulez in continuare
Semnalul telefonului la osciloscop:

Semnalul ADC0 vazut la osciloscop:


3. Interpretarea datelor ADC si transformarea in valoare reala a semnalui

Calibrarea:

Deci pentru valoarea maxima cand semnalul are 200mv voltajul la canalul ADC este 2.41152V
Deci pentru valoarea minima cand semnalul are -200mv voltajul la canalul ADC este 2.39617V
Deci pentru valoarea cand semnalul are -0V voltajul la canalul ADC este 2.340383V

Formula de calcul ar fi:


Vref(2500mV)/Resolutia ADC(1024) => 2.44140mV pentru un ADC

Deci pentru valoarea ADC de 984.608768 am avea 984.608768*2.44140= 2403.83uV => 0V a semnalului
de intrare.

Pentru 987.6190822 am avea 987.6190822*2.44140=2.41152mV => 200mV a semnalului de intrare

Pentru 981.5984538 am avea 981.5984538*2.44140=2396.4806mV => -200mV a semnalului de intrare


4. Aplicarea transformarii furrier a semnalului obtinut.

Sa ajuns din a 2 incercare la transformata fourier deoarece aveam valori si negative.


Pentru a nu avea valori negative ar trebui sa ridicam la patrat partea reala si apoi facem radical din
aceasta valoare in felul acesta vom obtine numai valori pozitive
for (int i = 0; i < nr_Achizitii; i++)
{
fourier[i] = 0;
for (int j = 0; j < nr_Achizitii; j++)
{
fourier_real[i] += tmp[j] * cos(-(2 * PI * (i)*(j) / nr_Achizitii));
fourier_imaginar[i] += tmp[j] * sin(-(2 * PI * (i)*(j) / nr_Achizitii));
}

fourier[i] = sqrt(pow(fourier_real[i],2)+pow(fourier_imaginar[i],2));
printf("%d\t%.2f\t%.2f\n",i,tmp[i],fourier[i]);
}

Fourier
80000.0000

70000.0000

60000.0000

50000.0000

40000.0000

30000.0000

20000.0000

10000.0000

0.0000
1 35 69 103137171205239273307341375409443477511545579613647681715

Wave signal
250
200
150
100
50
0
1 33 65 97 129 161193 225257 289321 353385417 449 481513 545577 609641673 705
-50
-100
-150
-200
-250

S-ar putea să vă placă și