Home
Accesso / Registrazione
 di 

rumore di fondo

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

Ciao come posso eliminre un fastodioso rumore di fondo, su questo codice riesco a visualizzare l'onda (è quadra con le creste arrotondate, la vorrei sinusoidale), purtroppo ho un rumore di fondo, tutte le volte che rilascio il pulsante , come faccio ad eliminarlo?
Ecco il codice:

#include
#include

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

//OSC = HS Set to work for high speed
//WDT = OFF watchdog timer is off
//LVP = OFF LVP programming is off
//PBADEN = OFF Analog input on PORTB are off

//************************************************************
// Functions Prototypes
//************************************************************
void set_duty_cycle (int duty_cycle);
void turn_on_PWM1 (void);
void High_Int_Event (void);

//************************************************************
// Global variables
//************************************************************

//Samples
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;

//************************************************************
// Interrupt Handler
//************************************************************

#pragma code high_vector = 0x08
void high_interrupt (void) {
// go to the interrupt handler
_asm GOTO High_Int_Event _endasm
}

#pragma code
#pragma interrupt High_Int_Event

void High_Int_Event (void) {

static unsigned char sample = 0;
static unsigned char repeat = 0;

if (PIR1bits.TMR2IF == 1) {

if (PORTBbits.RB0 == 0) {
set_duty_cycle (sine[sample]);

repeat++;

}
else {
set_duty_cycle (0);

}

if (repeat == REPEATING_FACTOR) {
repeat = 0;
sample++;

if (sample > 31) {
sample = 0;
}
}

}

//Clear Timer 2 Interrupt Flag
PIR1bits.TMR2IF = 0;

}

//************************************************************
// Main program
//************************************************************

void main (void){

// PORTA settings
LATA = 0x00;
TRISA = 0xFF;

// PORTB settings
LATB = 0x00;
TRISB = 0xFF;

// PORTC settings
LATC = 0x00;
TRISC = 0b11111010;

// PORTD settings
LATD = 0x00;
TRISD = 0x00;

// PORTE settings
LATE = 0x00;
TRISE = 0xFF;

//*************************************
// Modules Initializaion
//*************************************

// Set the PWM frequency to
PR2 = 198;

set_duty_cycle (250);

// Turn ON TMR2 and set Prescaler to 0
T2CON = 0x04;

turn_on_PWM1 ();

// Enable Timer 2 Interrupt
PIE1bits.TMR2IE = 1;

// Standrd interrupt (by default is already 0)
RCONbits.IPEN = 0;

// Enable global interrupt
INTCONbits.GIE = 1;

// Enable Peripheral Interrupt
INTCONbits.PEIE = 1 ;

// just loop for nothing...
while (1){
}
}

//************************************
// Set the Diuty Cicle
//************************************

void set_duty_cycle (int duty_cycle) {

CCPR1L = (unsigned char) (duty_cycle >> 2);

if (duty_cycle & 0x0001)
CCP1CONbits.DC1B0 = 0x0001;
else
CCP1CONbits.DC1B0 = 0x0000;

if (duty_cycle & 0x0002)
CCP1CONbits.DC1B1 = 0x0001;
else
CCP1CONbits.DC1B1 = 0x0000;
}

//************************************
// Turn ON the PWM module
//************************************
void turn_on_PWM1 (void) {

CCP1CON = CCP1CON | 0b00001100;

}

ritratto di Emanuele
Offline
Titolo: Moderator
Moderatore
Ultima visita:
2 ore 43 min fa
Utente dal: 28/07/2007
Messaggi: 1022
Utente PREMIUM
Un condensatore di antirimbalzo sul pulsante?

Un condensatore di antirimbalzo sul pulsante?

Un filtro firmware per eliminare un rumore di fondo, non è una cosa molto banale da realizzare, forse è meglio intervenire con un filtraggio prima dell'ingresso nel micro.
(se il banale condensatore non è sufficiente :)

ritratto di OPGUIDO
Offline
Titolo: User++
Utente++
Ultima visita:
1 anno 42 settimane fa
Utente dal: 11/06/2011
Messaggi: 58
Ciao, e ti ringrazio, temo

Ciao, e ti ringrazio, temo che il problema sia causato dal codice, mi spiego: la frequenza che osservo e sento dallo speaker c'è sempre, quando premo il pulsante visulizzo la forma d'onda (quadra con le creste arrotondate, la vorrei sinusoidale) e sento la freq. impostata nel codice, lo rilascio e torna come prima, mi serve di capire quale parte del codice continua a girare quando non schiaccio il pulsante, ho provato a fare delle prove, e l'unico risultato è stato che non funzionava niente.

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 28 utenti e 86 visitatori collegati.

Ultimi Commenti