Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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; }