mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ 0.1.03
+ added powerDownCode (code/interface is experimental, test + refactor needed) + added RDY test in several places + removed smooth2Value() => sample sketch + extended test sketch + tested on 100, 400, 800 KHz (works)
This commit is contained in:
parent
79a66c4bc8
commit
e2cd8c1a75
@ -2,7 +2,7 @@
|
||||
// FILE: MCP4725.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PURPOSE: Simple MCP4725 DAC library for Arduino
|
||||
// VERSION: 1.0.02
|
||||
// VERSION: 1.0.03
|
||||
// HISTORY: See MCP4725.cpp
|
||||
// URL:
|
||||
//
|
||||
@ -10,6 +10,7 @@
|
||||
// 0.1.00 - 2013-11-24 initial version
|
||||
// 0.1.01 - 2013-11-30 added readDAC() & writeDAC (registerwrite)
|
||||
// 0.1.02 - 2013-12-01 added readEEPROM() & RDY()
|
||||
// 0.1.03 - 2013-12-01 added powerDownMode code
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
@ -30,9 +31,9 @@ void MCP4725::begin()
|
||||
// 0=1000 1=888 2=800 8=500
|
||||
// 12=400KHz 24=250 32=200 72=100 152=50
|
||||
// F_CPU/16+(2*TWBR) // TWBR is a uint8_t
|
||||
|
||||
|
||||
_lastValue = readDAC();
|
||||
// _powerDownMode = readPowerDownMode();
|
||||
_powerDownMode = readPowerDownModeEEPROM();
|
||||
}
|
||||
|
||||
int MCP4725::setValue(uint16_t value)
|
||||
@ -51,31 +52,7 @@ uint16_t MCP4725::getValue()
|
||||
|
||||
#ifdef MCP4725_EXTENDED
|
||||
|
||||
int MCP4725::smooth2Value(uint16_t value, uint8_t steps)
|
||||
{
|
||||
// speed optimization
|
||||
if (value == _lastValue) return 0;
|
||||
|
||||
if (value > MCP4725_MAXVALUE) return MCP4725_VALUE_ERROR;
|
||||
if (steps == 0) steps++;
|
||||
|
||||
uint16_t delta = (value - _lastValue)/steps;
|
||||
if (delta > 0)
|
||||
{
|
||||
uint16_t v = _lastValue;
|
||||
for (int i=0; i < steps-1; i++)
|
||||
{
|
||||
v += delta;
|
||||
writeFastMode(v);
|
||||
}
|
||||
}
|
||||
// be sure to get the end value right
|
||||
int rv = writeFastMode(value);
|
||||
_lastValue = value;
|
||||
return rv;
|
||||
}
|
||||
|
||||
// unfortunately it is not possible to write a different value
|
||||
// unfortunately it is not possible to write a different value
|
||||
// to the DAC and EEPROM simultaneously or write EEPROM only.
|
||||
int MCP4725::writeDAC(uint16_t value, bool EEPROM)
|
||||
{
|
||||
@ -110,29 +87,55 @@ uint16_t MCP4725::readEEPROM()
|
||||
#endif
|
||||
|
||||
#ifdef MCP4725_POWERDOWNMODE
|
||||
//
|
||||
// PDmode can be written to DAC or to DAC&EEPROM,
|
||||
// for now the lib only support DAC&EEPROM
|
||||
// this will change after enough experience is gathered how to use
|
||||
|
||||
// write to DAC & EEPROM
|
||||
int MCP4725::writePowerDownMode(uint8_t PDM)
|
||||
{
|
||||
_powerDownMode = PDM;
|
||||
_powerDownMode = (PDM & 0x03); // force only pdm bits
|
||||
return writeDAC(_lastValue, true);
|
||||
}
|
||||
|
||||
// from EEPROM
|
||||
uint8_t MCP4725::readPowerDownMode()
|
||||
uint8_t MCP4725::readPowerDownModeEEPROM()
|
||||
{
|
||||
while(!RDY());
|
||||
uint8_t buffer[4];
|
||||
readRegister(buffer, 4);
|
||||
uint8_t value = (buffer[3] & 0x60) >> 5;
|
||||
// EEPROM
|
||||
uint8_t value = (buffer[3] >> 5) & 0x03;
|
||||
// DAC
|
||||
// uint8_t value = (buffer[0] >> 1) & 0x03;
|
||||
return value;
|
||||
}
|
||||
|
||||
int MCP4725::powerOnReset()
|
||||
uint8_t MCP4725::readPowerDownModeDAC()
|
||||
{
|
||||
return command(MCP4725_GENERAL_RESET);
|
||||
while(!RDY());
|
||||
uint8_t buffer[1];
|
||||
readRegister(buffer, 1);
|
||||
uint8_t value = (buffer[0] >> 1) & 0x03;
|
||||
return value;
|
||||
}
|
||||
|
||||
// PAGE 22
|
||||
// experimental
|
||||
int MCP4725::powerOnReset()
|
||||
{
|
||||
int rv = command(MCP4725_GENERAL_RESET);
|
||||
// what happens to _lastValue and _powerDownMode...
|
||||
return rv;
|
||||
}
|
||||
|
||||
// PAGE 22
|
||||
// experimental
|
||||
int MCP4725::powerOnWakeUp()
|
||||
{
|
||||
return command(MCP4725_GENERAL_WAKEUP);
|
||||
int rv = command(MCP4725_GENERAL_WAKEUP);
|
||||
// what happens to _lastValue and _powerDownMode...
|
||||
return rv;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -146,6 +149,7 @@ int MCP4725::writeFastMode(uint16_t value)
|
||||
{
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
uint8_t h = ((value / 256) & 0x0F); // set C0 = C1 = 0, no PDmode
|
||||
h = h | (_powerDownMode << 4);
|
||||
uint8_t l = value & 0xFF;
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
Wire.write(h);
|
||||
@ -169,13 +173,13 @@ bool MCP4725::RDY()
|
||||
}
|
||||
|
||||
// PAGE 19 DATASHEET
|
||||
// reg = MCP4725_DAC | MCP4725_EEPROM
|
||||
// reg = MCP4725_DAC | MCP4725_EEPROM
|
||||
int MCP4725::writeRegisterMode(uint16_t value, uint8_t reg)
|
||||
{
|
||||
uint8_t h = (value / 16);
|
||||
uint8_t l = (value & 0x0F) << 4;
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
reg = reg | _powerDownMode;
|
||||
reg = reg | (_powerDownMode << 1);
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
Wire.write(reg);
|
||||
Wire.write(h);
|
||||
@ -195,7 +199,7 @@ uint8_t MCP4725::readRegister(uint8_t* buffer, uint8_t length)
|
||||
Wire.beginTransmission(_deviceAddress);
|
||||
int rv = Wire.endTransmission();
|
||||
if (rv != 0) return 0; // error
|
||||
|
||||
|
||||
Wire.requestFrom(_deviceAddress, length);
|
||||
uint8_t cnt = 0;
|
||||
uint32_t before = millis();
|
||||
|
@ -4,7 +4,7 @@
|
||||
// FILE: MCP4725.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PURPOSE: Simple MCP4725 DAC library for Arduino
|
||||
// VERSION: 1.0.02
|
||||
// VERSION: 1.0.03
|
||||
// HISTORY: See MCP4725.cpp
|
||||
// URL:
|
||||
//
|
||||
@ -21,10 +21,11 @@
|
||||
#include "Wiring.h"
|
||||
#endif
|
||||
|
||||
#define MCP4725_VERSION "1.0.02"
|
||||
#define MCP4725_VERSION "1.0.03"
|
||||
|
||||
// regisiterMode
|
||||
#define MCP4725_DAC 0x40
|
||||
#define MCP4725_EEPROM 0x20
|
||||
#define MCP4725_DACEEPROM 0x60
|
||||
|
||||
// constants
|
||||
@ -39,11 +40,11 @@
|
||||
#define MCP4725_GENERAL_RESET 0x06
|
||||
#define MCP4725_GENERAL_WAKEUP 0x09
|
||||
|
||||
// powerDown Mode
|
||||
// powerDown Mode - TODO ENUM?
|
||||
#define MCP4725_PDMODE_NORMAL 0x00
|
||||
#define MCP4725_PDMODE_1K 0x02
|
||||
#define MCP4725_PDMODE_100K 0x04
|
||||
#define MCP4725_PDMODE_500K 0x06
|
||||
#define MCP4725_PDMODE_1K 0x01
|
||||
#define MCP4725_PDMODE_100K 0x02
|
||||
#define MCP4725_PDMODE_500K 0x03
|
||||
|
||||
// conditional to minimize footprint.
|
||||
#define MCP4725_EXTENDED
|
||||
@ -58,42 +59,39 @@ public:
|
||||
// uses writeFastMode
|
||||
int setValue(uint16_t value);
|
||||
// returns last value set - cached - much faster than readDAC();
|
||||
uint16_t getValue();
|
||||
|
||||
uint16_t getValue();
|
||||
|
||||
#ifdef MCP4725_EXTENDED
|
||||
int smooth2Value(uint16_t value, uint8_t steps);
|
||||
|
||||
int writeDAC(uint16_t value, bool EEPROM = false);
|
||||
bool RDY();
|
||||
uint16_t readDAC();
|
||||
uint16_t readEEPROM();
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef MCP4725_POWERDOWNMODE
|
||||
// experimental
|
||||
int writePowerDownMode(uint8_t PDM);
|
||||
uint8_t readPowerDownMode();
|
||||
uint8_t readPowerDownModeEEPROM();
|
||||
uint8_t readPowerDownModeDAC();
|
||||
int powerOnReset();
|
||||
int powerOnWakeUp();
|
||||
#endif
|
||||
|
||||
|
||||
private:
|
||||
uint8_t _deviceAddress;
|
||||
uint16_t _lastValue;
|
||||
uint8_t _powerDownMode; // DATASHEET P15?
|
||||
|
||||
uint8_t _powerDownMode; // DATASHEET P15?
|
||||
int writeFastMode(uint16_t value);
|
||||
|
||||
#ifdef MCP4725_EXTENDED
|
||||
|
||||
#ifdef MCP4725_EXTENDED
|
||||
int writeRegisterMode(uint16_t value, uint8_t reg);
|
||||
uint8_t readRegister(uint8_t* buffer, uint8_t length);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef MCP4725_POWERDOWNMODE
|
||||
int command(uint8_t cmd);
|
||||
#endif
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -41,12 +41,6 @@ void setup()
|
||||
#ifdef MCP4725_EXTENDED
|
||||
Serial.println("\n\nMCP4725_EXTENDED\n\n");
|
||||
|
||||
Serial.println("smooth2Value(2000, 10)");
|
||||
DAC.smooth2Value(2000, 10);
|
||||
Serial.print("Value:\t");
|
||||
Serial.println(DAC.getValue());
|
||||
Serial.println();
|
||||
|
||||
for (int i=100; i<500; i+=100)
|
||||
{
|
||||
Serial.print("writeDAC(");
|
||||
@ -86,17 +80,56 @@ void setup()
|
||||
#ifdef MCP4725_POWERDOWNMODE
|
||||
Serial.println("\n\nMCP4725_POWERDOWNMODE\n\n");
|
||||
|
||||
/*
|
||||
int writePowerDownMode(uint8_t PDM);
|
||||
uint8_t readPowerDownMode();
|
||||
int powerOnReset();
|
||||
int powerOnWakeUp();
|
||||
*/
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
Serial.print("DAC.writePowerDownMode(");
|
||||
Serial.print(i);
|
||||
Serial.println(")");
|
||||
DAC.writePowerDownMode(i);
|
||||
Serial.print("EPR PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeEEPROM());
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
Serial.println("EXPERIMENTAL");
|
||||
Serial.println("DAC.writePowerDownMode(3)");
|
||||
DAC.writePowerDownMode(3);
|
||||
Serial.println("DAC.powerOnReset()");
|
||||
Serial.println("Before");
|
||||
Serial.print("DAC PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeDAC());
|
||||
Serial.print("EPR PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeEEPROM());
|
||||
DAC.powerOnReset();
|
||||
Serial.println("After");
|
||||
Serial.print("DAC PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeDAC());
|
||||
Serial.print("EPR PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeEEPROM());
|
||||
Serial.println();
|
||||
|
||||
|
||||
Serial.println("EXPERIMENTAL");
|
||||
Serial.println("DAC.writePowerDownMode(2)");
|
||||
DAC.writePowerDownMode(2);
|
||||
Serial.println("DAC.powerOnWakeUp()");
|
||||
Serial.println("Before");
|
||||
Serial.print("DAC PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeDAC());
|
||||
Serial.print("EPR PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeEEPROM());
|
||||
DAC.powerOnWakeUp();
|
||||
Serial.println("after");
|
||||
Serial.print("DAC PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeDAC());
|
||||
Serial.print("EPR PDM Value:\t");
|
||||
Serial.println(DAC.readPowerDownModeEEPROM());
|
||||
Serial.println();
|
||||
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
Serial.println("\n\nPERFORMANCE\n");
|
||||
Serial.println("\n\nPERFORMANCE");
|
||||
Serial.print("TWBR:\t");
|
||||
Serial.println(TWBR);
|
||||
Serial.println();
|
||||
@ -131,15 +164,6 @@ void setup()
|
||||
|
||||
#ifdef MCP4725_EXTENDED
|
||||
|
||||
// start = micros();
|
||||
// for (int i=0; i< 100; i++)
|
||||
// {
|
||||
// DAC.smooth2Value(i*10, 10);
|
||||
// }
|
||||
// end = micros();
|
||||
// Serial.print("100x DAC.smooth2Value(i*10, 10):\t");
|
||||
// Serial.println(end - start);
|
||||
|
||||
start = micros();
|
||||
for (int i=0; i< 1000; i++)
|
||||
{
|
||||
@ -188,7 +212,34 @@ void setup()
|
||||
|
||||
#ifdef MCP4725_POWERDOWNMODE
|
||||
|
||||
// TODO TIMING TEST
|
||||
Serial.println("\nEXPERIMENTAL");
|
||||
|
||||
start = micros();
|
||||
for (int i=0; i< 10; i++)
|
||||
{
|
||||
volatile int x = DAC.readPowerDownModeDAC();
|
||||
}
|
||||
end = micros();
|
||||
Serial.print("10x DAC.readPowerDownModeDAC():\t\t");
|
||||
Serial.println(end - start);
|
||||
|
||||
start = micros();
|
||||
for (int i=0; i< 10; i++)
|
||||
{
|
||||
volatile int x = DAC.readPowerDownModeEEPROM();
|
||||
}
|
||||
end = micros();
|
||||
Serial.print("10x DAC.readPowerDownModeEEPROM():\t");
|
||||
Serial.println(end - start);
|
||||
|
||||
start = micros();
|
||||
for (int i=0; i< 10; i++)
|
||||
{
|
||||
volatile int x = DAC.writePowerDownMode(i & 0x03);
|
||||
}
|
||||
end = micros();
|
||||
Serial.print("10x DAC.writePowerDownMode(i):\t\t");
|
||||
Serial.println(end - start);
|
||||
|
||||
#endif
|
||||
|
||||
@ -213,5 +264,3 @@ void loop()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
98
libraries/MCP4725/examples/smooth2Value/smooth2Value.ino
Normal file
98
libraries/MCP4725/examples/smooth2Value/smooth2Value.ino
Normal file
@ -0,0 +1,98 @@
|
||||
//
|
||||
// FILE: smooth2Value.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.00
|
||||
// PURPOSE: test mcp4725 lib
|
||||
// DATE: 2013-12-01
|
||||
// URL:
|
||||
//
|
||||
// Released to the public domain
|
||||
//
|
||||
|
||||
#include <Wire.h>
|
||||
#include "MCP4725.h"
|
||||
|
||||
MCP4725 DAC(0x62); // 0x62 or 0x63
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
|
||||
Serial.print("MCP4725 test program: ");
|
||||
Serial.println(MCP4725_VERSION);
|
||||
|
||||
DAC.begin();
|
||||
|
||||
Serial.print("\nValue:\t");
|
||||
Serial.println(DAC.getValue());
|
||||
Serial.println();
|
||||
|
||||
|
||||
Serial.println("smooth2Value(2000, 10)");
|
||||
DAC.smooth2Value(2000, 10);
|
||||
Serial.print("Value:\t");
|
||||
Serial.println(DAC.getValue());
|
||||
Serial.println();
|
||||
|
||||
Serial.println("smooth2Value(100, 50)");
|
||||
DAC.smooth2Value(100, 10);
|
||||
Serial.print("Value:\t");
|
||||
Serial.println(DAC.getValue());
|
||||
Serial.println();
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
Serial.println("\n\nPERFORMANCE\n");
|
||||
Serial.print("TWBR:\t");
|
||||
Serial.println(TWBR);
|
||||
Serial.println();
|
||||
|
||||
uint32_t start = micros();
|
||||
for (int i=0; i< 100; i++)
|
||||
{
|
||||
DAC.smooth2Value(i*10, 10);
|
||||
}
|
||||
uint32_t end = micros();
|
||||
Serial.print("100x DAC.smooth2Value(i*10, 10):\t");
|
||||
Serial.println(end - start);
|
||||
|
||||
Serial.print("\nDone... (start triangle mode)");
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// different gradients
|
||||
DAC.smooth2Value(4095, 4096);
|
||||
DAC.smooth2Value(0, 4096);
|
||||
DAC.smooth2Value(4095, 2048);
|
||||
DAC.smooth2Value(0, 2048);
|
||||
DAC.smooth2Value(4095, 1024);
|
||||
DAC.smooth2Value(0, 1024);
|
||||
}
|
||||
|
||||
|
||||
int smooth2Value(uint16_t value, uint8_t steps)
|
||||
{
|
||||
static int _lastValue = 0;
|
||||
|
||||
// speed optimization
|
||||
if (value == _lastValue) return 0;
|
||||
if (value > MCP4725_MAXVALUE) return MCP4725_VALUE_ERROR;
|
||||
if (steps == 0) steps++;
|
||||
|
||||
uint16_t delta = (value - _lastValue)/steps;
|
||||
if (delta > 0)
|
||||
{
|
||||
uint16_t v = _lastValue;
|
||||
for (int i=0; i < steps-1; i++)
|
||||
{
|
||||
v += delta;
|
||||
DAC.setValue(v);
|
||||
}
|
||||
}
|
||||
// be sure to get the end value right
|
||||
int rv = DAC.setValue(value);
|
||||
_lastValue = value;
|
||||
return rv;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user