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
}
}