Ejemplo mínimo de PIC32 PWM

3

Tengo problemas para que una salida PWM simple funcione en un PIC32MX775F512H . Mirando en línea , esto parece ser todo lo que necesito para que algo funcione:

int main(void)
{
    SYSTEMConfig(SYSTEM_FREQ_HZ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);

    OpenOC1( OC_ON | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);
    OpenTimer2( T2_ON | T2_PS_1_1 | T2_SOURCE_INT, 0xFFFF);
    SetDCOC1PWM(0x4000); // 50% duty cycle

    while(1)
    {
    }
}

Sin embargo, el pin OC1 (pin 46 en el paquete 64 QFN) no parece estar haciendo nada.

    
pregunta Rocketmagnet

1 respuesta

4

Consulte la página 54 en la oc hoja de datos Hay un elemento en la lista que el ejemplo el código mostrado por el OP no coincide, aunque ese no sea el problema. # 3 Escriba el registro OxCR con el ciclo de trabajo inicial.

Personalmente, no me importa el uso de macros porque es demasiado genérico y difícil de volver a verificar el código, como arriba, y algunas veces las macros tienen errores. Si está utilizando MplabX, haga clic con el botón derecho en la macro y navegue hasta la declaración para revisar la implementación.

Página 65 tiene un ejemplo completo, excepto por una subrutina principal, se puede copiar y pegar con bastante facilidad.

Los chips Pic32 (y otros en la familia MC) no se sostienen muy bien. Todo lo que necesitas es un poco mal en alguna parte y las cosas simplemente no funcionan. Cada detalle importa. Ir a través de cada paso a paso y funcionará. Además, no tengo suficiente reputación para comentar, pero ¿podría @RocketMagnet dar más detalles sobre cómo está comprobando el pin OC1?

También, 0xFFFF / 0x4000 = ciclo de trabajo del 33%.

Código añadido -

#include <stdio.h>
#include <stdlib.h>
#include "p32xxxx.h"
#include "plib.h"
#define SYSTEM_FREQ_HZ 80000000
#pragma config FPLLODIV = DIV_1, FSOSCEN = OFF, FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FWDTEN = OFF, FPBDIV = DIV_1, POSCMOD = XT, FNOSC = PRIPLL, CP = OFF
#pragma config FMIIEN = ON, FETHIO = OFF, FUSBIDIO = OFF, FVBUSONIO = OFF   // external PHY in RMII/alternate configuration
#pragma config UPLLEN = ON,UPLLIDIV = DIV_2
/*
 * 
 */
int main(void)
{
    SYSTEMConfig(SYSTEM_FREQ_HZ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
    INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);

    OpenOC1( OC_ON | OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);
    OpenTimer2( T2_ON | T2_PS_1_1 | T2_SOURCE_INT, 0xFFFF);
    unsigned short a;
    int b;
    while(1)
    {
        for(b=0;b<100;b++)
            Nop();
        SetDCOC1PWM(a++);
    }
}
    
respondido por el Erik Friesen

Lea otras preguntas en las etiquetas