convertire segnale digitale in analogico
- Login o registrati per inviare commenti
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
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 #pragma config FOSC = HS //OSC = HS Impostato per lavorare ad alta frequenza 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; //Imposto PORTB tutti ingrrssi LATB = 0x00; //Imposto PORTC tutti ingressi ad RC1 come uscita LATC = 0x00; //Imposto PORTD tutte uscite LATD = 0x00; //Imposto PORTE tutti ingrrssi LATE = 0x00; 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 //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 LATCbits.LATC1 = 0x00 ; ClosePWM2 () ; // Chiudo il modulo pwm if (PORTBbits.RB1 == 0) { //Controllo la pressione di RB 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 LATCbits.LATC1 = 0x00 ; ClosePWM2 () ; // Chiudo il modulo pwm 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 LATCbits.LATC1 = 0x00 ; ClosePWM2 () ; // Chiudo il modulo pwm 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 LATCbits.LATC1 = 0x00 ; ClosePWM2 () ; // Chiudo il modulo pwm }
#include
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON
//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
TRISA = 0xFF;
TRISB = 0xFF;
TRISC = 0b11111101;
TRISD = 0x00;
TRISE = 0xFF;
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
}
else {
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
}
else {
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
if (PORTBbits.RB2 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
}
else {
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
if (PORTBbits.RB3 == 0) { //Controllo la pressione di RB
for (i=0; i<10000; i++) { //Pausa filtraggio spike
}
}
else {
}
SetDCPWM2 (500); //Aggiorno il duty cycle
}
}
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-Genera...
ti consiglio questo circuito solo perchè l'ho progettato alle superiori vedendolo funzionare. Spero che riuscirai nel tuo intento a presto.
- Login o registrati per inviare commenti


















2 settimane 6 giorni fa
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