¿Cómo puedo tener dos entradas analógicas, controlar dos salidas PWM en PIC16f?

0

Estoy buscando tener doble PWM fuera de un PIC16f1619. Esto es parte de un proyecto de suministro de energía que tiene potes para limitar el voltaje y la corriente. Estoy simulando el control del regulador con solo dos LED en este momento.

En el modo de depuración (en la placa de Curiosidad de Microchip), parece que Analog_AN0 nunca se ejecuta, sin embargo, tanto la salida de RC6 como la de RC7 dependen solo de PORTA0 (no se controlan por separado).

No puedo haber configurado el PWM y el ADC correctamente, pero no estoy seguro de por qué.

Cualquier ayuda se agradecería, ya que me estoy sacando el pelo por lo que estoy seguro de que es un problema simple.

#define _XTAL_FREQ 16000000 //16mhz
#include <xc.h>

#define RS RC0
#define EN RC1
#define D4 RC2
#define D5 RC3
#define D6 RC4
#define D7 RC5


void Analog_AN0(void)
{
    PWM3CON = 0b10000000;//Enable the PWM3 H/W
    RC6PPS = 0b00001110; //Sets RC6 to output PWM3
    ADCON0 = 0b00000001; //pin RAO is connected to AN0. ADC ON
    ADCON1bits.ADCS = 0; //Conversion clk of fosc/2 (time required to convert each bit)
    ADCON1bits.ADPREF = 1; //Vref is VDD 3.3V
    ADCON1bits.ADFM = 0; // will right-justify the result and store the 10bit value  in the16bit register ADRES
    ADCON2 = 0;
    PWM3DCL = ADRESL;
    PWM3DCH = ADRESH;
}
void Analog_AN1(void)
{
    PWM4CON = 0b10000000; //Enable PWM4 H/W
    RC7PPS = 0b00001111; //Sets RC7 to output PWM4
    ADCON0 = 0b00000011; //pin RA1 is connected to AN1. ADC ON
    ADCON1bits.ADCS = 0; //Conversion clk of fosc/2 (time required to convert each bit)
    ADCON1bits.ADPREF = 1; //Vref is VDD 3.3V
    ADCON1bits.ADFM = 0; // will right-justify the result and store the 10bit value  in the16bit register ADRES
    ADCON2 = 0;
    PWM4DCL = ADRESL;
    PWM4DCH = ADRESH;
}
void main (void)
{
    OSCCON = 0b01011000;//sets clck to 1mhz
    ANSELC = 0x00; //Sets PortC as digital
    TRISC = 0x00;
    ANSELA = 0b11111100; //all pins on A are digital except 0 and1
    TRISA = 0b00000011; //all pins on A are output except 0 and 1
    INTCONbits.GIE = 0; //No interrupts
    CCPTMRSbits.P3TSEL0 = 0; //Associates TMR2 with PWM3
    CCPTMRSbits.P4TSEL0 = 0; //Associates TMR4 with PWM4
    //Set up Timer 2
    T2CON = 0b01110000; //TMR2 OFF, prescaler 128, postscaler 1;
    T2CLKCON = 0x00; //fosc/4
    PR2 = 19; //10ms NEED TO RECALCULATE
    TMR2 = 0x00; //Starting condition
    PIR1bits.TMR2IF = 0; //Empties the flag to begin
    T2CONbits.T2ON = 1; //init. timer
    //Set up Timer 4
    T4CON = 0b01110000;//TMR2 off, pre 128, post 16
    T4CLKCON = 0x00; //fosc/4
    PR4 = 19; //10ms NEED TO RECALCULATE
    TMR4 = 0x00; //Starting condition
    PIR2bits.TMR4IF = 0; //Empties the flag to begin
    T4CONbits.T4ON = 1; //init. timer

    while (1)
    { 
        PIR1bits.ADIF=0;//makes sure that the flag is clear
        Analog_AN0();
        __delay_ms(10);
        Analog_AN1();
        // ADCON0bits.GO=1; //Conversion now starts




    }
}
    
pregunta Christopher Dyer

1 respuesta

1

Parece que no estás configurando el bit GO / nDONE. Solo está activando el módulo ADC (bit 0 de ADCON0 / 2). Lea los ejemplos en la hoja de datos cómo hace la conversión ADC. Debe establecer el bit GO en '1' y luego esperar a que el hardware lo vuelva a '0' después de que se complete la conversión y se actualice ADRESL / ADRESH.

    
respondido por el anrieff

Lea otras preguntas en las etiquetas