Mi proyecto se basa en una gestión estricta del tiempo y una sincronización precisa de los eventos
para eso necesito variar la frecuencia PWM y el ciclo de trabajo en tiempo real con dos potenciómetros.
He tenido éxito en variar el ciclo de trabajo con un potenciómetro usando una pic18f2550 pero no pude agregar otra entrada analógica para el segundo potenciómetro ni variar la frecuencia.
También es posible que necesite hasta 4 señales PWM que serán idénticas pero demoradas entre otras, por lo que sé que la familia 18f tiene solo dos módulos de PCC, por lo que podría decirme qué imagen puede hacer el trabajo.
el siguiente código es para una simple variación del ciclo de trabajo.
Cualquier ayuda es muy apreciada
gracias a todos por adelantado
#include <xc.h>
#include "PWM_config.h"
#include <pic18f2550.h>
void init_ADC (void)
{
ADCON1=0b00001110; //setting voltage reference and AN0 as analog input
ADCON0bits.CHS=0b0000; //setting channel 0
ADCON2=0b10011101; /* 16Tosc conversion clock, 6Tad acquisition time, ADC Result Right Justified */
}
int doADC0(void)
{
int result;
ADCON0bits.ADON=1; //turning on ADC
__delay_us (5); // acquisition delay of 4.6 us
ADCON0bits.GODONE=1; //start conversion
while (ADCON0bits.GODONE==1);
result=ADRES*0.0977517;
return result;
}
void init_PWM1 (unsigned char period)
{
TRISCbits.RC2=0;
/*CCP PWM mode*/
CCP1CONbits.CCP1M=0b1100; //CCP1 to PWM mode
CCP1CONbits.DC1B=0b00;
/*timer2 configuration*/
PR2=(period*312500)-1; //avec Fosc=20MHz
T2CON=0x02; //set prescaler to 16
TMR2ON=1;
}
void PWM_setDC (unsigned int pourcentage_DC)
{
unsigned int DC=(10.23*pourcentage_DC);
CCPR1L = DC>>2; // PWM duty cycle - first 8-bits (MSb)
CCP1CON |= ((DC<<4)&0x30); // PWM duty cycle - last 2-bits (LSb) in CCP1CON 5,4 bits
}
void main (void)
{
TRISAbits.RA0=1;
init_ADC();
init_PWM1(0.002); //setting the period to 2ms
while (1)
{
if (doADC0()<1) {PWM_setDC(0); PORTCbits.RC2=0; }
else PWM_setDC(doADC0());
}
}