Home Forum MICROCONTROLLORI convertire segnale digitale in analogico

Questo argomento contiene 3 risposte, ha 3 partecipanti, ed è stato aggiornato da  ingmarketz 2 anni, 8 mesi fa.

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #58674

    OPGUIDO
    Membro

    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

    #71134

    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

    #71131

    OPGUIDO
    Membro

    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
    }
    }

    }

    #71135

    ingmarketz
    Membro

    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-XR8038A-8038-/170717403237?pt=Componenti_elettronici_attivi&hash=item27bf8cd865#ht_985wt_1344

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

Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.