Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
Diff: akmanalogsensor.cpp
- Revision:
- 49:c8f8946129b6
- Parent:
- 45:6af8fdde0ef3
--- a/akmanalogsensor.cpp Tue Dec 19 12:18:13 2017 -0800 +++ b/akmanalogsensor.cpp Tue May 01 21:31:15 2018 +0000 @@ -1,29 +1,25 @@ #include "akmanalogsensor.h" +#define SCALING_CONSTANT_3V 0.5997202865 +#define SCALING_CONSTANT_5V 0.3603082852 #define WAIT_ADC_MS 1 -/** - * Constructor. - * - */ AkmAnalogSensor::AkmAnalogSensor() : AkmSensor(){ ain = NULL; - mcp3428 = NULL; } -/** - * Destructor. - * - */ + AkmAnalogSensor::~AkmAnalogSensor(){ if(ain) delete ain; - if(mcp3428) delete mcp3428; } -AkmSensor::Status AkmAnalogSensor::init(const uint8_t id, const uint8_t subid){ + +AkmSensor::Status AkmAnalogSensor::init(const uint8_t p_id, const uint8_t s_id){ + VERBOSE("#AkmAnalogSensor init()\r\n"); - primaryId = id; - subId = subid; + + primaryId = p_id; + subId = s_id; if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ430L) sensorName = "EQ-430L"; else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ431L) sensorName = "EQ-431L"; @@ -53,24 +49,17 @@ else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_EM3242) sensorName = "EM3242"; else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_AK9710) sensorName = "AK9710"; else return AkmSensor::ERROR; - - MCP342X::AdcChannel channel = MCP342X::ADC_CH3; // 0-5.0V out as default + if( ((primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId <= AKM_PRIMARY_ID_CURRENT_SENSOR_3V)) || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){ - channel = MCP342X::ADC_CH4; // 0-3.0V out + + ain = new AnalogIn(ANALOG_IN_A0); + VERBOSE("#ADC Connected to 3V Channel\r\n"); } - - // 16bit ADC - I2C* i2c = new I2C(I2C_SDA,I2C_SCL); - i2c->frequency(I2C_SPEED); - VERBOSE("#AkmAnalogSensor::init: I2C created at %d Hz\r\n", I2C_SPEED); - - // ADC setting - mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH); - mcp3428->setChannel(channel); - mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT); - mcp3428->setConversionMode(MCP342X::CONTINUOUS); - VERBOSE("#AkmAnalogSensor::init: MPC342X ADC created\r\n"); + else { + ain = new AnalogIn(ANALOG_IN_A0);; + VERBOSE("#ADC Connected to 5V Channel\r\n"); + } interval = SENSOR_SAMPLING_RATE; // 10Hz @@ -97,27 +86,49 @@ } AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){ + + uint16_t ain16 = 0; + int16_t ain16_sign = 0; + double ain_norm = 0; + double ain_scl = 0; + VERBOSE("#AkmAnalogSensor: Reading sensor data\r\n"); AkmSensor::clearEvent(); msg->setCommand(Message::CMD_START_MEASUREMENT); - if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || - primaryId == AKM_PRIMARY_ID_MISC_ANALOG || - primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V || - primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V ){ - MCP342X::Data data; - do { - VERBOSE("#Waiting..\r\n"); - mcp3428->getData(&data); - wait_ms(WAIT_ADC_MS); - } while(data.st == MCP342X::DATA_NOT_UPDATED); + if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || primaryId == AKM_PRIMARY_ID_MISC_ANALOG || + primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V ) + { + // Sample the ADC + ain_norm = ain->read(); + ain_norm *= 1.97; + + if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){ + ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_3V; + VERBOSE("#3V scale = %.4f\r\n", ain_scl); + } + if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V){ + ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_5V; + VERBOSE("#5V scale = %.4f\r\n", ain_scl); + } + + ain16 = (uint16_t)(65535 * ain_norm); - msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) ); - msg->setArgument( 1, (char)( data.value & 0x00FF) ); - }else{ - msg->setArgument( 0, 0); - msg->setArgument( 1, 0); + //ain16_sign = (int16_t)ain16; + //ain16_sign = (int16_t)ain16 - 32768; + ain16_sign = (int16_t)ain_norm*48011.0 - 32768; + + VERBOSE("#ain_norm = %.4f\r\n", ain_norm); + VERBOSE("#ain16 = %d\r\n", ain16); + VERBOSE("#ain16_sign = %d\r\n", ain16_sign); + + msg->setArgument(0, (char)((ain16_sign & 0xFF00) >> 8)); + msg->setArgument(1, (char)(ain16_sign & 0x00FF)); + } + else{ + msg->setArgument(0, 0); + msg->setArgument(1, 0); MSG("readSensorData Error\r\n"); return AkmSensor::ERROR; }