1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 01:56:14 +01:00

Update IO_AnalogueInputs.h

Increase frequency of ADC conversions to 4ms, since 10ms driver cycle isn't enough time for a 7.8ms conversion to complete reliably.
This commit is contained in:
Neil McKechnie 2021-09-15 10:44:43 +01:00
parent 02a715d54d
commit 592f87303e

View File

@ -69,6 +69,7 @@ public:
static void create(VPIN firstVpin, int nPins, uint8_t i2cAddress) { static void create(VPIN firstVpin, int nPins, uint8_t i2cAddress) {
new ADS111x(firstVpin, nPins, i2cAddress); new ADS111x(firstVpin, nPins, i2cAddress);
} }
private:
void _begin() { void _begin() {
// Initialise ADS device // Initialise ADS device
if (I2CManager.exists(_i2cAddress)) { if (I2CManager.exists(_i2cAddress)) {
@ -79,16 +80,16 @@ public:
DIAG(F("ADS111x device not found, I2C:%x"), _i2cAddress); DIAG(F("ADS111x device not found, I2C:%x"), _i2cAddress);
} }
} }
void _loop(unsigned long currentMicros) { void _loop(unsigned long currentMicros) override {
if (currentMicros - _lastMicros >= scanInterval) { if (currentMicros - _lastMicros >= scanInterval) {
// Check that previous non-blocking write has completed, if not then wait // Check that previous non-blocking write has completed, if not then wait
_i2crb.wait(); uint8_t status = _i2crb.wait();
if (status == I2C_STATUS_OK) {
// If _currentPin is in the valid range, continue reading the pin values // If _currentPin is in the valid range, continue reading the pin values
if (_currentPin < _nPins) { if (_currentPin < _nPins) {
_outBuffer[0] = 0x00; // Conversion register address _outBuffer[0] = 0x00; // Conversion register address
uint8_t status = I2CManager.read(_i2cAddress, _inBuffer, 2, 1, _outBuffer); // Read register uint8_t status = I2CManager.read(_i2cAddress, _inBuffer, 2, _outBuffer, 1); // Read register
if (status == I2C_STATUS_OK) { if (status == I2C_STATUS_OK) {
_value[_currentPin] = ((uint16_t)_inBuffer[0] << 8) + (uint16_t)_inBuffer[1]; _value[_currentPin] = ((uint16_t)_inBuffer[0] << 8) + (uint16_t)_inBuffer[1];
#ifdef IO_ANALOGUE_SLOW #ifdef IO_ANALOGUE_SLOW
@ -96,6 +97,9 @@ public:
#endif #endif
} }
} }
if (status != I2C_STATUS_OK)
DIAG(F("ADS111x I2C:x%d Error:%d"), _i2cAddress, status);
}
// Move to next pin // Move to next pin
if (++_currentPin >= _nPins) _currentPin = 0; if (++_currentPin >= _nPins) _currentPin = 0;
@ -103,23 +107,23 @@ public:
// of configuration register settings. // of configuration register settings.
_outBuffer[0] = 0x01; // Config register address _outBuffer[0] = 0x01; // Config register address
_outBuffer[1] = 0xC0 + (_currentPin << 4); // Trigger single-shot, channel n _outBuffer[1] = 0xC0 + (_currentPin << 4); // Trigger single-shot, channel n
_outBuffer[2] = 0x83; // 128 samples/sec, comparator off _outBuffer[2] = 0xA3; // 250 samples/sec, comparator off
// Write command, without waiting for completion. // Write command, without waiting for completion.
I2CManager.write(_i2cAddress, _outBuffer, 3, &_i2crb); I2CManager.write(_i2cAddress, _outBuffer, 3, &_i2crb);
_lastMicros = currentMicros; _lastMicros = currentMicros;
} }
} }
int _readAnalogue(VPIN vpin) { int _readAnalogue(VPIN vpin) override {
int pin = vpin - _firstVpin; int pin = vpin - _firstVpin;
return _value[pin]; return _value[pin];
} }
void _display() { void _display() override {
DIAG(F("ADS111x I2C:x%x Configured on Vpins:%d-%d"), _i2cAddress, _firstVpin, _firstVpin+_nPins-1); DIAG(F("ADS111x I2C:x%x Configured on Vpins:%d-%d"), _i2cAddress, _firstVpin, _firstVpin+_nPins-1);
} }
protected: // ADC conversion rate is 250SPS, or 4ms per conversion. Set the period between updates to 10ms.
// With ADC set to 128 samples/sec, that's 7.8ms/sample. So set the period between updates to 10ms // This is enough to allow the conversion to reliably complete in time.
#ifndef IO_ANALOGUE_SLOW #ifndef IO_ANALOGUE_SLOW
const unsigned long scanInterval = 10000UL; // Period between successive ADC scans in microseconds. const unsigned long scanInterval = 10000UL; // Period between successive ADC scans in microseconds.
#else #else