A simple library for controlling an MCP4241 digital potentiometer

DigiPot.cpp

Committer:
ollie8
Date:
2014-02-08
Revision:
2:54e9d9ddc350
Parent:
1:179b46a0165e

File content as of revision 2:54e9d9ddc350:

#include "DigiPot.h"
#include <math.h>

#define POT_0 0x00
#define POT_1 0x10
#define MAX 129.0
#define MIN 0
#define MAX_P 100
#define BASE 10.0
#define ROUND 0.5

DigiPot::DigiPot(PinName miso, PinName mosi, PinName clk, PinName cs, Mode mode) {
    chsel = new DigitalOut(cs);
    spi = new SPI(mosi, miso, clk);
    this->mode = mode;
    spi->format(8,0); 
    spi->frequency(1000000);
    level = 0x00;
    percent = 0x00;
    scale = log10(MAX);
}

void DigiPot::increment() {
    if (mode == LINEAR) {
        if (level < MAX) {
            setLevel(level++);    
        }
    } else {
        if (percent < MAX_P) {
            setLevel(round(pow(BASE, ((scale/MAX_P)*percent++))));
        }        
    }
}

void DigiPot::decrement() {
    if (mode == LINEAR) {
        if (level > MIN) {
            setLevel(level--);    
        }
    } else {
        if (percent > MIN) {
            setLevel(round(pow(BASE, ((scale/MAX_P)*percent--))));
        }
    }
}

void DigiPot::setLevel(unsigned char level) {
    *chsel = 0;
    spi->write(POT_0);
    spi->write(level);
    *chsel = 1;
    wait_us(2);
    *chsel = 0;
    spi->write(POT_1);
    spi->write(level);
    *chsel = 1;
}

void DigiPot::mute() {
    setLevel(0x00);
}

void DigiPot::unmute() {
    setLevel(level);
}

unsigned char DigiPot::getLevel() {
    return level;
}

unsigned char DigiPot::round(double value) {
    return (unsigned char) floor(value+ROUND);    
}