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
Revision 4:af13b985c689, committed 2016-05-09
- Comitter:
- masahikofukasawa
- Date:
- Mon May 09 16:59:33 2016 +0000
- Parent:
- 2:11fe67783c4c
- Child:
- 5:4e92a85bbb52
- Commit message:
- Rev.D Masa
Changed in this revision
--- a/akmirsensor.cpp Thu May 05 21:11:23 2016 +0000
+++ b/akmirsensor.cpp Mon May 09 16:59:33 2016 +0000
@@ -79,7 +79,7 @@
}
// Gets interrupt status from EEPROM
AK9750::InterruptStatus intStatus;
- if ((ak9750->getInterruptStatusFromEEPROM(&intStatus)) != AK9750::SUCCESS) {
+ if ((ak9750->getInterruptEnableFromEEPROM(&intStatus)) != AK9750::SUCCESS) {
MSG("#Failed to get interrupts of AK9750 from EEPROM.\n");
}
@@ -109,7 +109,7 @@
// Sets interruput status from the red EEPROM values
AK9750::Status status;
- if ((status=ak9750->setInterruptStatus(&intStatus)) != AK9750::SUCCESS) {
+ if ((status=ak9750->setInterruptEnable(&intStatus)) != AK9750::SUCCESS) {
MSG("#Failed to set interrupts of AK9750. Status = 0x%02X\n", status);
}
MSG("#Interrupt:(0x%02X,0x%02X,0x%02X,0x%02X,0x%02X)\n",intStatus.drdy,intStatus.ir13h,intStatus.ir13l,intStatus.ir24h,intStatus.ir24l);
@@ -260,7 +260,7 @@
}
case Message::CMD_IR_GET_INTERRUPT:
{
- if (ak9750->getInterruptStatus(&interrupt) != AK9750::SUCCESS) {
+ if (ak9750->getInterruptEnable(&interrupt) != AK9750::SUCCESS) {
status = AkmSensor::ERROR;
MSG("#Failed to set hysteresis to AK9750.\n");
}
@@ -278,7 +278,7 @@
interrupt.ir13l = in->getArgument(2);
interrupt.ir24h = in->getArgument(3);
interrupt.ir24l = in->getArgument(4);
- if (ak9750->setInterruptStatus(&interrupt) != AK9750::SUCCESS) {
+ if (ak9750->setInterruptEnable(&interrupt) != AK9750::SUCCESS) {
status = AkmSensor::ERROR;
MSG("#Failed to set hysteresis to AK9750.\n");
}
@@ -360,7 +360,7 @@
}
case Message::CMD_IR_GET_INTERRUPT_EEPROM:
{
- if (ak9750->getInterruptStatusFromEEPROM(&interrupt) != AK9750::SUCCESS) {
+ if (ak9750->getInterruptEnableFromEEPROM(&interrupt) != AK9750::SUCCESS) {
status = AkmSensor::ERROR;
MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
}
@@ -378,7 +378,7 @@
interrupt.ir13l = in->getArgument(2);
interrupt.ir24h = in->getArgument(3);
interrupt.ir24l = in->getArgument(4);
- if (ak9750->setInterruptStatusToEEPROM(&interrupt) != AK9750::SUCCESS) {
+ if (ak9750->setInterruptEnableToEEPROM(&interrupt) != AK9750::SUCCESS) {
status = AkmSensor::ERROR;
MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
}
--- a/akmlinearsensor.cpp Thu May 05 21:11:23 2016 +0000
+++ b/akmlinearsensor.cpp Mon May 09 16:59:33 2016 +0000
@@ -1,5 +1,8 @@
#include "akmlinearsensor.h"
#include "debug.h"
+
+#define WAIT_ADC_MS 1
+
/**
* Constructor.
*
@@ -7,7 +10,7 @@
AkmLinearSensor::AkmLinearSensor(){
event = false;
ain = NULL;
- i2c = NULL;
+ mcp3428 = NULL;
}
/**
@@ -16,7 +19,7 @@
*/
AkmLinearSensor::~AkmLinearSensor(){
if(ain) delete ain;
- if(i2c) delete i2c;
+ if(mcp3428) delete mcp3428;
}
AkmSensor::Status AkmLinearSensor::init(const uint8_t id, const uint8_t subid){
@@ -29,6 +32,14 @@
}else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR){
// 16bit ADC
+ I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
+ i2c->frequency(I2C_SPEED_100KHZ);
+
+ // ADC setting
+ mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH);
+ mcp3428->setChannel(MCP342X::ADC_CH4);
+ mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
+ mcp3428->setConversionMode(MCP342X::CONTINUOUS);
}
else{
return AkmSensor::ERROR;
@@ -61,24 +72,27 @@
}
AkmSensor::Status AkmLinearSensor::readSensorData(Message* msg){
- uint16_t value;
event = false;
msg->setCommand(Message::CMD_START_MEASUREMENT);
if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
+ uint16_t value;
float s = *ain;
value = s*1024;
-// sprintf(str, "$B%X%04d\r\n",primaryId, value);
msg->setArgument( 0, (char)( value >> 8) );
msg->setArgument( 1, (char)( value & 0x00FF) );
}else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR){
- // 16bit ADC
-// sprintf(str, "$B%X%04d\r\n",primaryId, value);
- msg->setArgument( 0, (char)( value >> 8) );
- msg->setArgument( 1, (char)( value & 0x00FF) );
+ MCP342X::Data data;
+ do {
+ mcp3428->getData(&data);
+ wait_ms(WAIT_ADC_MS);
+ } while(data.st == MCP342X::DATA_NOT_UPDATED);
+ MSG("#value=%d st=%d.\n",data.value,data.st);
+
+ msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
+ msg->setArgument( 1, (char)( data.value & 0x00FF) );
}else{
-// sprintf(str, "$B%X%0000\r\n",primaryId);
msg->setArgument( 0, 0);
msg->setArgument( 1, 0);
return AkmSensor::ERROR;
--- a/akmlinearsensor.h Thu May 05 21:11:23 2016 +0000
+++ b/akmlinearsensor.h Mon May 09 16:59:33 2016 +0000
@@ -4,6 +4,7 @@
#include "mbed.h"
#include "SerialNano.h"
#include "akmsensor.h"
+#include "mcp342x.h"
class AkmLinearSensor : public AkmSensor
{
@@ -43,7 +44,7 @@
Ticker ticker;
AnalogIn* ain;
- I2C* i2c;
+ MCP342X* mcp3428;
};
#endif
--- a/akmsensor.h Thu May 05 21:11:23 2016 +0000
+++ b/akmsensor.h Mon May 09 16:59:33 2016 +0000
@@ -8,7 +8,7 @@
#define SPI_SCK P0_8 //SPI, SCK
#define SPI_MISO P0_9 //SPI, MISO
#define SPI_MOSI P0_10 //SPI, MOSI
-#define SPI_CS P0_4 //SPI, CS
+#define SPI_CS P0_11 //SPI, CS
// I2C
#define I2C_SCL P0_8 //I2C, SCL
@@ -51,8 +51,8 @@
AKM_PRIMARY_ID_CURRENT_SENSOR = 0x9,
AKM_PRIMARY_ID_MISC_ANALOG = 0xA,
AKM_PRIMARY_ID_LINEAR_SENSOR = 0xB,
- AKM_PRIMARY_ID_IR_SENSOR = 0xC,
- AKM_PRIMARY_ID_TBD3 = 0xD,
+ AKM_PRIMARY_ID_TBD3 = 0xC,
+ AKM_PRIMARY_ID_IR_SENSOR = 0xD,
AKM_PRIMARY_ID_ANGLE_SENSOR = 0xE,
AKM_PRIMARY_ID_AKD_I2C = 0xF,
} SensorPrimaryId;
--- a/akmsensormanager.cpp Thu May 05 21:11:23 2016 +0000
+++ b/akmsensormanager.cpp Mon May 09 16:59:33 2016 +0000
@@ -30,8 +30,8 @@
"Current Sensor",
"MISC(Analog)",
"Linear Sensor",
+ "TBD3",
"IR Sensor",
- "TBD3",
"Angle Sensor(SPI)", // Temporary
"AKD Daughter Cards(I2C)",
};
@@ -99,6 +99,7 @@
break;
case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY:
+ case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR:
subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
AkmLinearSensor* linearsensor;
linearsensor = new AkmLinearSensor();
@@ -171,7 +172,7 @@
uint8_t value = (uint8_t)(s*pow(2.0,bits));
#else
/* Rev.D */
- MSG("GetID\n");
+ MSG("#GetID\n");
I2C i2c(I2C_SDA0, I2C_SCL0);
// ADC
MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH);
@@ -189,7 +190,7 @@
const int16_t VAL_MIN = -2048; // Corresponds to 0V
uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits));
- MSG("ID = %d.", value);
+ MSG("#ID = %d.\n", value);
#endif
return value;
}

