C Program PWM Library

How to write a C Program PWM Library in C Programming Language ?




/*
 * PWM library
 * 
 */
#include "pwm.h"

void initPWM(uint16_t freq, uint8_t dutyCyle, uint8_t pin) 
{
    T2CON = (1<<TMR2_PS2);
    //PR2 = 1/(CPUCLK/freq * 16) - 1;
    PR2 = 249;
    dutyCyle *= (PR2 / 100);
    switch(pin) {
        case 1:
            OC1R = dutyCyle;
            OC1RS = dutyCyle;
            OC1CONSET = (1<<OC_ON) | (1<<OC_OCM1) | (1<<OC_OCM2);
            TRISDCLR = (1<<OC1);
            break;
        case 2:
            OC2R = dutyCyle;
            OC2RS = dutyCyle;
            OC1CONSET = (1<<OC_ON) | (1<<OC_OCM1) | (1<<OC_OCM2);
            TRISDCLR = (1<<OC2);
            break;
        case 3:
            OC3R = dutyCyle;
            OC3RS = dutyCyle;
            OC3CONSET = (1<<OC_ON) | (1<<OC_OCM1) | (1<<OC_OCM2);
            TRISDCLR = (1<<OC3);
            break;
        case 4:
            OC4R = dutyCyle;
            OC4RS = dutyCyle;
            OC4CONSET = (1<<OC_ON) | (1<<OC_OCM1) | (1<<OC_OCM2);
            TRISDCLR = (1<<OC4);
            break;
        case 5:
            OC5R = dutyCyle;
            OC5RS = dutyCyle;
            OC5CONSET = (1<<OC_ON) | (1<<OC_OCM1) | (1<<OC_OCM2);
            TRISDCLR = (1<<OC5);
            break;
    }
    T2CONSET = (1<<TMR2_ON);
}

void pwmWrite(uint8_t dutyCyle, uint8_t pin)
{
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    switch(pin) {
        case 1:
            OC1R = dutyCyle;
            OC1RS = dutyCyle;
            break;
        case 2:
            OC2R = dutyCyle;
            OC2RS = dutyCyle;
            break;
        case 3:
            OC3R = dutyCyle;
            OC3RS = dutyCyle;
            break;
        case 4:
            OC4R = dutyCyle;
            OC4RS = dutyCyle;
            break;
        case 5:
            OC5R = dutyCyle;
            OC5RS = dutyCyle;
            break;
    }
}

void pwmWriteC1(uint8_t dutyCyle)
{   
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    OC1R = dutyCyle;
    OC1RS = dutyCyle;
}

void pwmWriteC2(uint8_t dutyCyle)
{   
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    OC2R = dutyCyle;
    OC2RS = dutyCyle;
}

void pwmWriteC3(uint8_t dutyCyle)
{   
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    OC3R = dutyCyle;
    OC3RS = dutyCyle;
}

void pwmWriteC4(uint8_t dutyCyle)
{   
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    OC4R = dutyCyle;
    OC4RS = dutyCyle;
}

void pwmWriteC5(uint8_t dutyCyle)
{   
    if(dutyCyle > 100)
        return;
    dutyCyle *= (PR2 / 100);
    OC5R = dutyCyle;
    OC5RS = dutyCyle;
}


Learn More :