Home
Accesso / Registrazione
 di 

convertire segnale digitale in analogico

3 risposte [Ultimo post]
ritratto di OPGUIDO
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 34 settimane fa
Utente dal: 11/06/2011
Messaggi: 58

Ciao. all'uscita di un PIC 18f4550 (porta RC1) mi esce un segnale PWM con una frequenza ad onda quadra (digitale) come faccio a trasformarla in onda sinusoidale (analogica)?
Grazie

ritratto di Vittorio Crapella
Offline
Titolo: PowerUser
Utente Power
Ultima visita:
22 settimane 5 giorni fa
Utente dal: 21/09/2011
Messaggi: 281
Ma è PWM normale o è un PWM

Ma è PWM normale o è un PWM con duty cile adeguato per ricostruire una sinusoide

se è normale non credo si possa, al limite puoi ottenere una continua con livello proporzionale al duty cicle con una rete R C, R in serie all'uscita e C dopo la R verso massa

Stessa cosa con rete RC per ricostruire l'andamento sinusoidale ..
I valori RC vanno scelti in funzione della frequenza..
dove R deve essere alemeno di valore tale da limitare la massima Iout del PIC

ritratto di OPGUIDO
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 34 settimane fa
Utente dal: 11/06/2011
Messaggi: 58
Ciao e grazie , ho realizzato

Ciao e grazie , ho realizzato un passa basso per tagliare le frequenze superiori a 500HZ ( R da 68K e C da 4700pF ) non succede nulla.
Ecco il codice:

# include

# include
# include
#include

#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON

//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilitato il Watchdog Timer
//LVT = OFF Disabilitato programmazione LVT
//PBADEN = OFF Disabilitato gli ingrassi analogici
//CCP2MX = ON il modulo CCP è posto su RC1

void main (void) {

int i; //Variabile usata per creare un conteggio fittizio di pausa

unsigned char period; //Periodo del segnale pwm

int duty_cycle = 0; //Duty Cycle

//Imposto PORTA tutti ingrrssi

LATA = 0x00;
TRISA = 0xFF;

//Imposto PORTB tutti ingrrssi

LATB = 0x00;
TRISB = 0xFF;

//Imposto PORTC tutti ingressi ad RC1 come uscita

LATC = 0x00;
TRISC = 0b11111101;

//Imposto PORTD tutte uscite

LATD = 0x00;
TRISD = 0x00;

//Imposto PORTE tutti ingrrssi

LATE = 0x00;
TRISE = 0xFF;

EnablePullups (); //Abilito resistori di pullups

OpenTimer2 (TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16 ); //Apro il timer2 per il pwm

while (1) { //Ciclo infinito

if (PORTBbits.RB0 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}

//OpenTimer2 (TIMER_INT_OFF & T2_PS_1_16 & T2_POST_1_16 ); //Apro il timer2 per il pwm

period = 237; // (232) Imposto una frequenza di 262Hz DO centrale

if (PORTBbits.RB0 == 0) { //Controllo la pressione di RB

OpenPWM2(period) ; //Apro il modulo pwm

LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {

LATCbits.LATC1 = 0x00 ;

ClosePWM2 () ; // Chiudo il modulo pwm
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}

if (PORTBbits.RB1 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}

period = 224; // (222) Imposto una frequenza di 277Hz DO #

if (PORTBbits.RB1 == 0) { //Controllo la pressione di RB

OpenPWM2(period) ; //Apro il modulo pwm

LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {

LATCbits.LATC1 = 0x00 ;

ClosePWM2 () ; // Chiudo il modulo pwm
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
if (PORTBbits.RB2 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}

period = 212; // (219) Imposto una frequenza di 294Hz RE

if (PORTBbits.RB2 == 0) { //Controllo la pressione di RB

OpenPWM2(period) ; //Apro il modulo pwm

LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {

LATCbits.LATC1 = 0x00 ;

ClosePWM2 () ; // Chiudo il modulo pwm
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
if (PORTBbits.RB3 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}

period = 210; // (215) Imposto una frequenza di 311Hz RE #

if (PORTBbits.RB3 == 0) { //Controllo la pressione di RB

OpenPWM2(period) ; //Apro il modulo pwm

LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {

LATCbits.LATC1 = 0x00 ;

ClosePWM2 () ; // Chiudo il modulo pwm
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}

}

ritratto di ingmarketz
Offline
Titolo: User+
Utente+
Ultima visita:
1 anno 4 settimane fa
Utente dal: 09/11/2011
Messaggi: 37
alternativa

CIao, scusa ma purtroppo non ho molto tempo, però ti volevo proporre un alternativa:
spero che tu abbia dimestichezza con l'elettronica analogica, innanzitutto mi pare di aver capito che ti serve generare una sinusoide con lo stesso duty cicle della tua onda pwm.
In questo caso puoi usare il seguente schema logico:

PIC --> onda pwm --> filtor passa basso --> valore medio dell'onda --> icl8038 --> onda sinusoidale con duty cicle del pwm

http://www.intersil.com/data/fn/fn2864.pdf

dal datasheet del 8038 dell'intersil vedi che è un generatore di forme d'onda devi fare riferimento alloa schema di figura 3A con delle varianti:

1) non collegare RA e RB con la VCC ma RA lo collegherai con una tensione proporzionale al duty cicle ovvero quel valore medio che avevi estratto con il filtro passa basso mentre ad RB colleghi una tensione pari alla tensione complementare del valore medio dell'onda:

(es.calcolo tensione complementare: poniamo ad esempio il caso che il massimo valore del segnale che rappresenta il valore medio del pwm si 3 V allora la tensione complementare al valore medio sarà definita come: 3V - Valmedio)

questo al fine di generare correnti internamente al 8038 di carica e scarica sul condensatore proporzionali a queste tensioni e quindi generare un onda con duty cicle variabile.(vedi schema elettrico del 8038 per capire perchè , lo schema con i transistori)

note: -per generare la tensione complementare basta un semplice operazionale in configurazione differenziale tipo usa un uA71 sempre che la freq non sia troppo alta altrimenti lo slew rate del opamp non è adeguato

-per la progettazione dei valori di RA RB C e per la progettazione delle tensioni da collegare a RA e RB usa le formule a pagina 5 del datasheet chiaramente andranno adattate per esplicitare queste tensioni , ma è molto semplice basta considerare solo i transistori i transistori da Q1 a Q13 e Q25 , ti conviene prima capire come sono state ricavate le formule del datasheet una volta fatto riuscirai a capire quale termine Vsupply devi sostituire con la tensione da collegare alle resistenze.

- per i transistori considera trascurabili le tensioni VCE(SAT)di saturazione

- quando progetti tutte le grtandezze fai attenzione ai valori di corrente che entrano nei pin 4 e 5 perchè ricordo che esse devono trovarsi in un certo range tipo da qualche uA a 100mA mi pare.

per la reperibilità del componente ti dico solo che si può trovare anche su ebay quindi non stante sia un componente un po datato lo riesci a trovare in giro nei negozi di elettronica.

http://www.ebay.it/itm/N-2-Integrato-XR8038ACP-Precision-Waveform-Generator-XR-8038A-XR803...

ti consiglio questo circuito solo perchè l'ho progettato alle superiori vedendolo funzionare. Spero che riuscirai nel tuo intento a presto.

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 0 utenti e 59 visitatori collegati.

Ultimi Commenti