// accurate clock is not needed for callibration
// Callibration for internal I/V resistor 10k ... 8.5-Digits multimeter is needed
// connection: D2=BCK, D3=LRCK, D4=DATA
// 1) offset
// short D10 with GND for offset adjustment
// set with trimmer TR3 (TR4) voltage 0.000305mV on tpL (tpR)
// 2) maximum Positive value
// short D11 with GND for maximum Positive value adjustment
// set with trimmer TR1 (TR2) voltage 10.000000V on tpL (tpR)
// 3) maximum Negative value
// short D12 with GND for maximum Negative value adjustment
// check if on tpL (tpR) is voltage -9.999695V
// if not, adjust it with trimmer TR1 (TR2)
// repeat process untill you fit the values
long oldTime_1ms = 0;
uint32_t timer_500ms = 0;
uint32_t timer_1000ms = 0;
uint32_t counter_32 = 0;
int counter_data = 0;
void setup() {
// put your setup code here, to run once:
pinMode(2, OUTPUT); // BCK
pinMode(3, OUTPUT); // LRCK
pinMode(4, OUTPUT); // DATA
pinMode(10, INPUT_PULLUP); // short D10 with GND for offset adjustment
pinMode(11, INPUT_PULLUP); // short D11 with GND for maximum positive current (voltage) output
pinMode(12, INPUT_PULLUP); // short D12 with GND for minimum positive current (voltage) output
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if ((millis() - oldTime_1ms) >= 1) { // for 8 MHz delay is 2ms, for 16 MHz delay is 1ms
oldTime_1ms = millis();
timer_500ms++;
timer_1000ms++;
}
// Generate BCK and LRCK
if (timer_500ms >= 500) {
timer_500ms = 0;
digitalWrite(2, !digitalRead(2));
counter_32++;
if (counter_32 >= (2 * 32)) { // 2x because it counts on every half BCK cycle
counter_32 = 0;
digitalWrite(3, !digitalRead(3));
}
}
if (timer_1000ms >= 1000) {
timer_1000ms = 0;
if (counter_data >= 31) {
counter_data = -1;
}
// Callibration for internal I/V resistor 10k ... 8.5-Digits multimeter is needed
// Send data for offset callibration (1LSB = 0.0305uA ==> 0.0305uA x 10k = 0.305uV = 0.000305mV on tpL/tpR)
if (digitalRead(10) == LOW) {
if (counter_data == -1) digitalWrite(4, 0); // bit 32
if (counter_data == 0) digitalWrite(4, 0); // 0 (MSB)
if (counter_data == 1) digitalWrite(4, 0); // 1
if (counter_data == 2) digitalWrite(4, 0); // 2
if (counter_data == 3) digitalWrite(4, 0); // 3
if (counter_data == 4) digitalWrite(4, 0); // 4
if (counter_data == 5) digitalWrite(4, 0); // 5
if (counter_data == 6) digitalWrite(4, 0); // 6
if (counter_data == 7) digitalWrite(4, 0); // 7
if (counter_data == 8) digitalWrite(4, 0); // 8
if (counter_data == 9) digitalWrite(4, 0); // 9
if (counter_data == 10) digitalWrite(4, 0); // 10
if (counter_data == 11) digitalWrite(4, 0); // 11
if (counter_data == 12) digitalWrite(4, 0); // 12
if (counter_data == 13) digitalWrite(4, 0); // 13
if (counter_data == 14) digitalWrite(4, 0); // 14
if (counter_data == 15) digitalWrite(4, 1); // 15 (LSB)
if (counter_data > 15) digitalWrite(4, 0); // x
}
// Send data for max Pos callibration (1.0000000mA ==> 1.0000000mA x 10k = 10.000000V on tpL/tpR)
if (digitalRead(11) == LOW) {
if (counter_data == -1) digitalWrite(4, 0); // bit 32
if (counter_data == 0) digitalWrite(4, 1); // 0 (MSB)
if (counter_data == 1) digitalWrite(4, 1); // 1
if (counter_data == 2) digitalWrite(4, 1); // 2
if (counter_data == 3) digitalWrite(4, 1); // 3
if (counter_data == 4) digitalWrite(4, 1); // 4
if (counter_data == 5) digitalWrite(4, 1); // 5
if (counter_data == 6) digitalWrite(4, 1); // 6
if (counter_data == 7) digitalWrite(4, 1); // 7
if (counter_data == 8) digitalWrite(4, 1); // 8
if (counter_data == 9) digitalWrite(4, 1); // 9
if (counter_data == 10) digitalWrite(4, 1); // 10
if (counter_data == 11) digitalWrite(4, 1); // 11
if (counter_data == 12) digitalWrite(4, 1); // 12
if (counter_data == 13) digitalWrite(4, 1); // 13
if (counter_data == 14) digitalWrite(4, 1); // 14
if (counter_data == 15) digitalWrite(4, 1); // 15 (LSB)
if (counter_data > 15) digitalWrite(4, 0); // x
}
// Send data for max Neg callibration (-0.9999695mA ==> -0.9999695mA x 10k = -9.999695V on tpL/tpR)
if (digitalRead(12) == LOW) {
if (counter_data == -1) digitalWrite(4, 0); // bit 32
if (counter_data == 0) digitalWrite(4, 0); // 0 (MSB)
if (counter_data == 1) digitalWrite(4, 0); // 1
if (counter_data == 2) digitalWrite(4, 0); // 2
if (counter_data == 3) digitalWrite(4, 0); // 3
if (counter_data == 4) digitalWrite(4, 0); // 4
if (counter_data == 5) digitalWrite(4, 0); // 5
if (counter_data == 6) digitalWrite(4, 0); // 6
if (counter_data == 7) digitalWrite(4, 0); // 7
if (counter_data == 8) digitalWrite(4, 0); // 8
if (counter_data == 9) digitalWrite(4, 0); // 9
if (counter_data == 10) digitalWrite(4, 0); // 10
if (counter_data == 11) digitalWrite(4, 0); // 11
if (counter_data == 12) digitalWrite(4, 0); // 12
if (counter_data == 13) digitalWrite(4, 0); // 13
if (counter_data == 14) digitalWrite(4, 0); // 14
if (counter_data == 15) digitalWrite(4, 0); // 15 (LSB)
if (counter_data > 15) digitalWrite(4, 0); // x
}
counter_data++;
}
}