A simple library for controlling an MCP4241 digital potentiometer
DigiPot.cpp@2:54e9d9ddc350, 2014-02-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |