Ejemplo mínimo de PIC32 PWM

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.

Creo que van muchas cosas en el "HardwareProfile.h"archivo. Como veo, no configuró ninguna de las funciones de los pines. No sé mucho sobre PIC32, pero tal vez el pin se comparte con una entrada digital o una entrada analógica o cualquier otro periférico, y es posible que deba configurarlo para usarlo como salida PWM.
La mejor manera de iniciar cualquier programa Micro es definir cada pin en algo que tenga sentido. Configuré todo en entrada o salida digital a menos que deba ser otra cosa (incluso los pines no utilizados). Además, configurar todos los temporizadores y registros de control ayuda a evitar que sucedan cosas "extrañas".

Respuestas (1)

Consulte la página 54 en la hoja de datos de oc. Hay un elemento en la lista que el código de ejemplo que muestra el OP no coincide, aunque es posible que 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 verificar el código, como se indicó anteriormente, y, a veces, las macros tienen errores. Si está utilizando MplabX, haga clic con el botón derecho en la macro y vaya a la declaración para revisar la implementación.

La 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 de la familia MC) no funcionan muy bien. Todo lo que se necesita es un poco mal en alguna parte y las cosas simplemente no funcionarán. Cada detalle importa. Ir a través de cada uno 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?

Además, 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++);
    }
}
Está proporcionando excelentes consejos generales para trabajar con el PIC32, pero ¿tiene una respuesta específica a la pregunta del OP?
Sin tener el hardware OP a mano, será bastante difícil dar un ejemplo de trabajo. No vi ningún problema con su ejemplo. Decir "Parece que no está haciendo nada" realmente no es lo suficientemente descriptivo para hacer más. Por lo tanto, la sugerencia de seguir cada detalle, porque generalmente es donde he encontrado estos problemas.
Probé el código que el OP publicó en un kit de inicio de ethernet, agregué bits de configuración e incluye, y cambié a OpenOC3, y funcionó de inmediato. Entonces, probablemente sea un problema de hardware.
¿Puedes publicar tu código? ¿El único cambio fue pasar a OC3? ¿Obtuviste el mismo resultado que el OP con OC1?
Añadido código completo. Ilumina lentamente el LED n.° 1 en el kit de inicio. El kit de inicio Ethernet utiliza 795f512L.