DAC
12 Anni 8 Mesi fa #11
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: DAC
Ciao,
quando fai uso di ClosePWM1 ();
devi anche fare uso di OpenPWM1 (); in combinazione con il settare il duty cycle.
Ovvero devi scrivere OpenPWM1 (); alla pressione del tasto oltre che impostare il duty cycle.
Saluti,
Mauro
quando fai uso di ClosePWM1 ();
devi anche fare uso di OpenPWM1 (); in combinazione con il settare il duty cycle.
Ovvero devi scrivere OpenPWM1 (); alla pressione del tasto oltre che impostare il duty cycle.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
12 Anni 8 Mesi fa #12
da Guido
Risposta da Guido al topic Re: DAC
Ciao, e grazie per il tempo che mi dedichi, ho provato come hai scritto anche settando il Duty cycle a o e 1023, non ho risolto nulla ho solo peggiorato le cose, ora premendo il pulsante mi esce un altra freq.
Pezzo di codice corretto:
if (PIR1bits.TMR2IF == 1) {
if (PORTBbits.RB0 == 0) {
OpenPWM1 ();
set_duty_cycle (sine[sample]);
repeat++;
}
else {
ClosePWM1 ();
set_duty_cycle (1023);
//set_duty_cycle (0);
}
if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;
}
if (sample > 31) {
sample = 0;
}
}
//Clear Timer 2 Interrupt Flag
PIR1bits.TMR2IF = 0;
}
Pezzo di codice corretto:
if (PIR1bits.TMR2IF == 1) {
if (PORTBbits.RB0 == 0) {
OpenPWM1 ();
set_duty_cycle (sine[sample]);
repeat++;
}
else {
ClosePWM1 ();
set_duty_cycle (1023);
//set_duty_cycle (0);
}
if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;
}
if (sample > 31) {
sample = 0;
}
}
//Clear Timer 2 Interrupt Flag
PIR1bits.TMR2IF = 0;
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
12 Anni 8 Mesi fa #13
da Guido
Risposta da Guido al topic Re: DAC
Ciao, ho trovato la causa del rumore di fondo è causato da questa istruzione:
CCP1CON = CCP1CON | 0b00001100;
Ho midifucato un po il codice e ne è uscito un suono quasi piacevole, ora la frequenza si presenta solo al premere del pulsante, mi piacerebbe avere un onda più sinusoidale e che il suono non si spegnesse nel senso che non vada a zero per poi risalire, ma che si attenui e non cessi , se lo puoi testare fammi sapere, ecco il codice:
# include <p18f4550.h>
# include <pwm.h>
# include <timers.h>
#include <portb.h>
#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 set_duty_cycle (int duty_cycle);
void set_duty_cycle (int duty_cycle);
void main (void) {
int sine[] = {250,299,346,389,427,458,481,495,500,495,481,458,427,389,346,299,250,201,154,111,73,42,19,5,0,5,19,42,73,111,154,201};
// Repeat the sample for x time
// sampling frequency must be changed to keep analog signal frequency costnat
const unsigned char REPEATING_FACTOR = 3;
static unsigned char sample = 0;
static unsigned char repeat = 0;
int i; //Variabile usata per creare un conteggio fittizio di pausa
unsigned char period; //Periodo del segnale pwm
//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
set_duty_cycle (250);
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
}
period = 237; // Imposto una frequenza di 262Hz DO centrale
if (PORTBbits.RB0 == 0) { //Controllo la pressione di RB
OpenPWM2(period) ; //Apro il modulo pwm
set_duty_cycle (sine[sample]);
repeat++;
LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {
LATCbits.LATC1 = 0x00 ;
ClosePWM2 () ; // Chiudo il modulo pwm
}
if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;
}
if (sample > 31) {
sample = 0;
}
}
}
}
void set_duty_cycle (int duty_cycle) {
CCPR2L = (unsigned char) (duty_cycle >> 2);
if (duty_cycle & 0x0001)
CCP2CONbits.DC2B0 = 0x0001;
else
CCP2CONbits.DC2B0 = 0x0000;
if (duty_cycle & 0x0002)
CCP2CONbits.DC2B1 = 0x0001;
else
CCP2CONbits.DC2B1 = 0x0000;
}
CCP1CON = CCP1CON | 0b00001100;
Ho midifucato un po il codice e ne è uscito un suono quasi piacevole, ora la frequenza si presenta solo al premere del pulsante, mi piacerebbe avere un onda più sinusoidale e che il suono non si spegnesse nel senso che non vada a zero per poi risalire, ma che si attenui e non cessi , se lo puoi testare fammi sapere, ecco il codice:
# include <p18f4550.h>
# include <pwm.h>
# include <timers.h>
#include <portb.h>
#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 set_duty_cycle (int duty_cycle);
void set_duty_cycle (int duty_cycle);
void main (void) {
int sine[] = {250,299,346,389,427,458,481,495,500,495,481,458,427,389,346,299,250,201,154,111,73,42,19,5,0,5,19,42,73,111,154,201};
// Repeat the sample for x time
// sampling frequency must be changed to keep analog signal frequency costnat
const unsigned char REPEATING_FACTOR = 3;
static unsigned char sample = 0;
static unsigned char repeat = 0;
int i; //Variabile usata per creare un conteggio fittizio di pausa
unsigned char period; //Periodo del segnale pwm
//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
set_duty_cycle (250);
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
}
period = 237; // Imposto una frequenza di 262Hz DO centrale
if (PORTBbits.RB0 == 0) { //Controllo la pressione di RB
OpenPWM2(period) ; //Apro il modulo pwm
set_duty_cycle (sine[sample]);
repeat++;
LATCbits.LATC1 = 0x01 ; //Accendo il Led 1
}
else {
LATCbits.LATC1 = 0x00 ;
ClosePWM2 () ; // Chiudo il modulo pwm
}
if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;
}
if (sample > 31) {
sample = 0;
}
}
}
}
void set_duty_cycle (int duty_cycle) {
CCPR2L = (unsigned char) (duty_cycle >> 2);
if (duty_cycle & 0x0001)
CCP2CONbits.DC2B0 = 0x0001;
else
CCP2CONbits.DC2B0 = 0x0000;
if (duty_cycle & 0x0002)
CCP2CONbits.DC2B1 = 0x0001;
else
CCP2CONbits.DC2B1 = 0x0000;
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
12 Anni 8 Mesi fa #14
da Guido
Risposta da Guido al topic Re: DAC
Ciao, variando ancora questo parametro il suono diventa ancora piu piacevole:
const unsigned char REPEATING_FACTOR = 1; //3 numero ripetizioni standard
const unsigned char REPEATING_FACTOR = 1; //3 numero ripetizioni standard
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Guido
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 583
- Ringraziamenti ricevuti 1
12 Anni 8 Mesi fa #15
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: DAC
Ciao Guido,
ora hai un buon livello di programmazione e riesci a modificare il codice senza grossi problemi.
Purtroppo la difficolta' successiva non deve essere vista nel codice e le impostazioni delle periferiche ma della teoria dietro alla scelta delle impostazioni e delle periferiche stesse.
Cerca di capire la teoria dietro l'articolo e successivamente il codice, altrimenti cambierai solo il codice senza controllarlo realmente.
Purtroppo la teoria del campionamento non e' banale.
...pero' in compenso ora hai qualcosa che suona su cui lavorare e apportare le modifiche!
Qual'e la forma d'onda che ottieni?
Riesci fare un'immagine?
Saluti,
Mauro
ora hai un buon livello di programmazione e riesci a modificare il codice senza grossi problemi.
Purtroppo la difficolta' successiva non deve essere vista nel codice e le impostazioni delle periferiche ma della teoria dietro alla scelta delle impostazioni e delle periferiche stesse.
Cerca di capire la teoria dietro l'articolo e successivamente il codice, altrimenti cambierai solo il codice senza controllarlo realmente.
Purtroppo la teoria del campionamento non e' banale.
...pero' in compenso ora hai qualcosa che suona su cui lavorare e apportare le modifiche!
Qual'e la forma d'onda che ottieni?
Riesci fare un'immagine?
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.