Hola a todos, estoy desarrollando un variador de frecuencia, y el módulo de control lo estoy realizando con el dsPIC 33fj32MC204, ya que me permite hacer simulaciones en proteus para ir verificando (Por ahora no tengo mi kit de desarrollo) y se me ha presentado el siguiente problema. Buscando en la web de microchip encontré con un código que lleve al dsp que estoy usando, y que genera las salidas de PWM sinusoidal para la activación de los IGBT's, el detalle es que al hacer la corrida en el MPLAB verifico que todos los registros de configuración del modulo MCPWM están bien configurados, pero el valor del ciclo útil no se modifica y creo que el problema está en la multiplicación fraccionaria del dsp. Aqui les cuelgo el código, para ver si alguien me ayuda, repito, en el while(1) luego de unas cuantas iteraciones se resetea el micro.... o eso pienso.... Alguna idea?
#define FCY 7372800 // 7.37 MIPS
#define FPWM 16000 // 4 kHz
#define DEADTIME (unsigned int)(0.000002 * FCY)
#define _DES_FREQ 60 // 50 Hz sine wave is required
#define _DELTA_PHASE (unsigned int)(_DES_FREQ * 65536 / FPWM)
unsigned int Phase, Delta_Phase,Phase_Offset;
signed long sinetable[64]={0, 3263, 6493, 9658, 12728, 15671, 18458, 21062,
23457, 25618, 27525, 29158, 30502, 31542, 32269, 32675, 32757, 32513,
31945, 31061, 29867, 28377, 26605, 24568, 22287, 19785, 17086, 14217,
11207, 8085, 4884, 1633, -1633, -4884, -8085, -11207, -14217, -17086,
-19785, -22287, -24568, -26605, -28377, -29867, -31061, -31945, -32513,
-32757, -32675, -32269, -31542, -30502, -29158, -27525, -25618, -23457,
-21062, -18458, -15671, -12728, -9658, -6493, -3263, 0};
void iniciarMCPWM(void)
{
TRISB = 0xFC00; // PWM pins as outputs, and FLTA as input
P1TPER = (FCY/FPWM - 1) >> 1; // Compute Period for desired frequency
P1OVDCON = 0x0000; // Disable all PWM outputs.
P1DTCON1 = DEADTIME; // ~2 us of dead time @ 20 MIPS and 1:1 Prescaler
PWM1CON1 = 0x0077; // Enable PWM output pins and enable complementary mode
P1DC1 = P1TPER; /* 0 Volts on Phase A. This value corresponds to
50% of duty cycle, which in complementary mode
gives an average of 0 Volts */
P1DC2 = P1TPER; // 0 Volts on Phase B.
P1DC3 = P1TPER; // 0 Volts on Phase C.
IFS3bits.PWM1IF = 0; // Clear PWM Interrupt flag
IEC3bits.PWM1IE = 1; // Enable PWM Interrupts
P1OVDCON = 0x3F00; // PWM outputs are controller by PWM module
P1TCONbits.PTMOD = 2; // Center aligned PWM operation
Phase = 0; // Reset Phase Variable
Delta_Phase = _DELTA_PHASE; // Initialize Phase increment for 60Hz sine wave
P1TCONbits.PTEN = 1; // Start PWM
return;
}
#define _120_DEGREES 0x5555
#define _240_DEGREES 0xAAAA
int Multiplier, Result;
int main (void)
{
iniciarMCPWM();
while (1)
{
Phase += Delta_Phase; // Accumulate Delta_Phase in Phase variable
Phase_Offset = _120_DEGREES;// Add proper value to phase offset
Multiplier = sinetable[(Phase + Phase_Offset) >> 10];// Take sine info
asm("MOV _Multiplier, W4"); // Load first multiplier
asm("MOV _P1TPER, W5"); // Load second multiplier
asm("MOV #_Result, W0"); // Load W0 with the address of Result
asm("MPY W4*W5, A"); // Perform Fractional multiplication
asm("SAC A, [W0]"); // Store multiplication result in var Result
P1DC1 = Result + P1TPER; // Remove negative values of the duty cycle
}
}