FastPWM clone

Device/FastPWM_LPC11U24.cpp

Committer:
Sissors
Date:
2014-06-27
Revision:
10:36362e9067b0
Parent:
7:1b5df740bcd7
Child:
12:4600daab8a83

File content as of revision 10:36362e9067b0:

#ifdef TARGET_LPC11U24

#include "FastPWM.h"

typedef struct {
    uint8_t timer;
    uint8_t mr;
} timer_mr;

LPC_CTxxBx_Type *pwm_obj;
timer_mr tid;
 
static timer_mr pwm_timer_map[11] = {
    {0, 0}, {0, 1}, {0, 2},
    {1, 0}, {1, 1},
    {2, 0}, {2, 1}, {2, 2},
    {3, 0}, {3, 1}, {3, 2},
};
 
static LPC_CTxxBx_Type *Timers[4] = {
    LPC_CT16B0, LPC_CT16B1,
    LPC_CT32B0, LPC_CT32B1
};


void FastPWM::initFastPWM( void ) {
    tid = pwm_timer_map[_pwm.pwm];
    pwm_obj = Timers[tid.timer];
    
    if (tid.timer < 2)
        //16-bit timer
        bits = 16;
    else
        //32-bit timer
        bits = 32;  
}

void FastPWM::pulsewidth_ticks( uint32_t ticks ) {
    tid = pwm_timer_map[_pwm.pwm];
    pwm_obj = Timers[tid.timer];
    
    if (ticks)
        pwm_obj->MR[tid.mr] = pwm_obj->MR3 - ticks;  //They inverted PWM on the 11u24
    else
        pwm_obj->MR[tid.mr] = 0xFFFFFFFF;           //If MR3 = ticks 1 clock cycle wide errors appear, this prevents that (unless MR3 = max).
}

void FastPWM::period_ticks( uint32_t ticks ) {
    tid = pwm_timer_map[_pwm.pwm];
    pwm_obj = Timers[tid.timer];
    
    pwm_obj->TCR = 0x02;
    pwm_obj->MR3 = ticks;
    pwm_obj->TCR = 0x01;   
}

uint32_t FastPWM::getPeriod( void ) {
    tid = pwm_timer_map[_pwm.pwm];
    pwm_obj = Timers[tid.timer];
    
    return pwm_obj->MR3;
}

uint32_t FastPWM::setPrescaler(uint32_t reqScale) {
    tid = pwm_timer_map[_pwm.pwm];
    pwm_obj = Timers[tid.timer];
    
    //If 32-bit, disable auto-scaling, return 1
    if (bits == 32) {
        dynamicPrescaler = false;
        return 1;
    }
    
    //Else 16-bit timer:
    if (reqScale == 0)
        //Return prescaler
        return pwm_obj->PR + 1;
    if (reqScale > (uint32_t)(1<<16))
        reqScale = 1<<16;
    //Else set prescaler, we have to substract one from reqScale since a 0 in PCVAL is prescaler of 1
    pwm_obj->PR = reqScale - 1;

    return reqScale;
}

#endif