A simple library for controlling an MCP4241 digital potentiometer

Committer:
ollie8
Date:
Sat Feb 08 13:31:51 2014 +0000
Revision:
2:54e9d9ddc350
Parent:
1:179b46a0165e
DigiPot can now be used in linear and log modes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ollie8 0:f547d674e543 1 #include "DigiPot.h"
ollie8 2:54e9d9ddc350 2 #include <math.h>
ollie8 0:f547d674e543 3
ollie8 0:f547d674e543 4 #define POT_0 0x00
ollie8 0:f547d674e543 5 #define POT_1 0x10
ollie8 2:54e9d9ddc350 6 #define MAX 129.0
ollie8 2:54e9d9ddc350 7 #define MIN 0
ollie8 2:54e9d9ddc350 8 #define MAX_P 100
ollie8 2:54e9d9ddc350 9 #define BASE 10.0
ollie8 2:54e9d9ddc350 10 #define ROUND 0.5
ollie8 0:f547d674e543 11
ollie8 2:54e9d9ddc350 12 DigiPot::DigiPot(PinName miso, PinName mosi, PinName clk, PinName cs, Mode mode) {
ollie8 0:f547d674e543 13 chsel = new DigitalOut(cs);
ollie8 1:179b46a0165e 14 spi = new SPI(mosi, miso, clk);
ollie8 2:54e9d9ddc350 15 this->mode = mode;
ollie8 1:179b46a0165e 16 spi->format(8,0);
ollie8 1:179b46a0165e 17 spi->frequency(1000000);
ollie8 0:f547d674e543 18 level = 0x00;
ollie8 2:54e9d9ddc350 19 percent = 0x00;
ollie8 2:54e9d9ddc350 20 scale = log10(MAX);
ollie8 0:f547d674e543 21 }
ollie8 0:f547d674e543 22
ollie8 0:f547d674e543 23 void DigiPot::increment() {
ollie8 2:54e9d9ddc350 24 if (mode == LINEAR) {
ollie8 2:54e9d9ddc350 25 if (level < MAX) {
ollie8 2:54e9d9ddc350 26 setLevel(level++);
ollie8 2:54e9d9ddc350 27 }
ollie8 2:54e9d9ddc350 28 } else {
ollie8 2:54e9d9ddc350 29 if (percent < MAX_P) {
ollie8 2:54e9d9ddc350 30 setLevel(round(pow(BASE, ((scale/MAX_P)*percent++))));
ollie8 2:54e9d9ddc350 31 }
ollie8 2:54e9d9ddc350 32 }
ollie8 0:f547d674e543 33 }
ollie8 0:f547d674e543 34
ollie8 0:f547d674e543 35 void DigiPot::decrement() {
ollie8 2:54e9d9ddc350 36 if (mode == LINEAR) {
ollie8 2:54e9d9ddc350 37 if (level > MIN) {
ollie8 2:54e9d9ddc350 38 setLevel(level--);
ollie8 2:54e9d9ddc350 39 }
ollie8 2:54e9d9ddc350 40 } else {
ollie8 2:54e9d9ddc350 41 if (percent > MIN) {
ollie8 2:54e9d9ddc350 42 setLevel(round(pow(BASE, ((scale/MAX_P)*percent--))));
ollie8 2:54e9d9ddc350 43 }
ollie8 2:54e9d9ddc350 44 }
ollie8 0:f547d674e543 45 }
ollie8 0:f547d674e543 46
ollie8 0:f547d674e543 47 void DigiPot::setLevel(unsigned char level) {
ollie8 0:f547d674e543 48 *chsel = 0;
ollie8 0:f547d674e543 49 spi->write(POT_0);
ollie8 0:f547d674e543 50 spi->write(level);
ollie8 0:f547d674e543 51 *chsel = 1;
ollie8 1:179b46a0165e 52 wait_us(2);
ollie8 0:f547d674e543 53 *chsel = 0;
ollie8 0:f547d674e543 54 spi->write(POT_1);
ollie8 0:f547d674e543 55 spi->write(level);
ollie8 0:f547d674e543 56 *chsel = 1;
ollie8 0:f547d674e543 57 }
ollie8 0:f547d674e543 58
ollie8 0:f547d674e543 59 void DigiPot::mute() {
ollie8 0:f547d674e543 60 setLevel(0x00);
ollie8 0:f547d674e543 61 }
ollie8 0:f547d674e543 62
ollie8 0:f547d674e543 63 void DigiPot::unmute() {
ollie8 0:f547d674e543 64 setLevel(level);
ollie8 0:f547d674e543 65 }
ollie8 0:f547d674e543 66
ollie8 0:f547d674e543 67 unsigned char DigiPot::getLevel() {
ollie8 0:f547d674e543 68 return level;
ollie8 2:54e9d9ddc350 69 }
ollie8 2:54e9d9ddc350 70
ollie8 2:54e9d9ddc350 71 unsigned char DigiPot::round(double value) {
ollie8 2:54e9d9ddc350 72 return (unsigned char) floor(value+ROUND);
ollie8 2:54e9d9ddc350 73 }