A collection of Analog Devices drivers for the mbed platform
For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
Revision 1:c1f0670bb370, committed 2016-03-30
- Comitter:
- Suciu
- Date:
- Wed Mar 30 17:35:04 2016 +0300
- Parent:
- 0:f4275700536f
- Child:
- 2:36a3230c38cf
- Commit message:
- Added CN0357-example project and related drivers
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/cn0357_example/Makefile Wed Mar 30 17:35:04 2016 +0300 @@ -0,0 +1,88 @@ +# This file was automagically generated by mbed.org. For more information, +# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded + +GCC_BIN = +PROJECT = CN0357-MBED +OBJECTS = ./main.o ./AD7790.o ./AD5270.o ./cn0357.o +SYS_OBJECTS = ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ramfunc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/board.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/cmsis_nvic.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/hal_tick.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/mbed_overrides.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/retarget.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/startup_stm32f411xe.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_adc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_adc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_can.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cec.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cortex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_crc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cryp.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_cryp_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dac.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dac_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dcmi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dcmi_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma2d.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dma_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_dsi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_eth.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_flash_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_fmpi2c_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_fmpi2c.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_msp_template.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_gpio.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hash.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hash_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_hcd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2c.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2c_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2s.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_i2s_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_irda.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_iwdg.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_lptim.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_ltdc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_ltdc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_smartcard.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_nand.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_nor.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pccard.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pcd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pcd_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pwr.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_pwr_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_qspi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rcc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rcc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rng.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rtc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_rtc_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sai.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sai_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sd.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sdram.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_spdifrx.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_spi.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_sram.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_tim.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_tim_ex.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_uart.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_usart.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_hal_wwdg.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_fmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_fsmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_sdmmc.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/stm32f4xx_ll_usb.o ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/system_stm32f4xx.o +INCLUDE_PATHS = -I. -I./mbed -I./mbed/TARGET_NUCLEO_F411RE -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM/TARGET_STM32F4 -I./mbed/TARGET_NUCLEO_F411RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F411RE -I./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM +LIBRARY_PATHS = -L./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM +LIBRARIES = -lmbed +LINKER_SCRIPT = ./mbed/TARGET_NUCLEO_F411RE/TOOLCHAIN_GCC_ARM/STM32F411XE.ld + +############################################################################### +AS = $(GCC_BIN)arm-none-eabi-as +CC = $(GCC_BIN)arm-none-eabi-gcc +CPP = $(GCC_BIN)arm-none-eabi-g++ +LD = $(GCC_BIN)arm-none-eabi-gcc +OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy +OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump +SIZE = $(GCC_BIN)arm-none-eabi-size + +ifeq ($(HARDFP),1) + FLOAT_ABI = hard +else + FLOAT_ABI = softfp +endif + + +CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI) +CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP +CC_SYMBOLS = -DTARGET_RTOS_M4_M7 -DTARGET_FF_ARDUINO -DTOOLCHAIN_GCC_ARM -DTARGET_NUCLEO_F411RE -D__CORTEX_M4 -DTARGET_LIKE_MBED -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_LIKE_CORTEX_M4 -DMBED_BUILD_TIMESTAMP=1458639619.11 -DTARGET_M4 -D__MBED__=1 -DTARGET_STM -DTARGET_STM32F4 -DTARGET_FF_MORPHO -DTOOLCHAIN_GCC -DTARGET_STM32F411RE -DARM_MATH_CM4 + +LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref +LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys + + +ifeq ($(DEBUG), 1) + CC_FLAGS += -DDEBUG -O0 +else + CC_FLAGS += -DNDEBUG -Os +endif + +.PHONY: all clean lst size + +all: $(PROJECT).bin $(PROJECT).hex size + + +clean: + rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS) + + +.asm.o: + $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $< +.s.o: + $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $< +.S.o: + $(CC) $(CPU) -c -x assembler-with-cpp -o $@ $< + +.c.o: + $(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $< + +.cpp.o: + $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o $@ $< + + + +$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) + $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) + + +$(PROJECT).bin: $(PROJECT).elf + $(OBJCOPY) -O binary $< $@ + +$(PROJECT).hex: $(PROJECT).elf + @$(OBJCOPY) -O ihex $< $@ + +$(PROJECT).lst: $(PROJECT).elf + @$(OBJDUMP) -Sdh $< > $@ + +lst: $(PROJECT).lst + +size: $(PROJECT).elf + $(SIZE) $(PROJECT).elf + +DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) +-include $(DEPS) + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/cn0357_example/main.cpp Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,94 @@
+/**
+* @file main.cpp
+* @brief Toxic gas sensor shield application
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#include "mbed.h"
+#include "cn0357.h"
+
+/** @mainpage
+ * CN0357 single-supply, low noise, portable gas detector circuit using an
+ * electrochemical sensor. The Alphasense CO-AX carbon monoxide sensor is used
+ * in this example. Electrochemical sensors offer several advantages for
+ * instruments that detect or measure the concentration of many toxic gases.
+ * Most sensors are gas specific and have usable resolutions under one part per
+ * million (ppm) of gas concentration.
+ *
+ * EVAL-CN0357 example program for MBED platforms. To achieve connection between
+ * the shield and the ST Nucleo, the following connections need to be made:
+ *
+ * - ICSP pin 1 -> pin 12 of the Arduino header
+ * - ICSP pin 3 -> pin 13 of the Arduino header
+ * - ICSP pin 4 -> pin 11 of the Arduino header
+ * - if VIN is not supplied, 5V to VIN
+ *
+ * @page CN0357 CN0357 Analog Devices wiki page
+ * @brief link->
+ * https://wiki.analog.com/resources/eval/user-guides/eval-adicup360/hardware/cn0357
+ * @page AD7790 AD7790 datasheet
+ * @brief link ->
+ * http://www.analog.com/media/en/technical-documentation/data-sheets/AD7790.pdf
+ * @page AD5270 AD5270 datasheet
+ * @brief link ->
+ * http://www.analog.com/media/en/technical-documentation/data-sheets/AD5270_5271.pdf
+ *
+ */
+const float SENSOR_RANGE = 2000; ///< gas sensor range in PPM
+const float SENSOR_SENSITIVITY = (65 * pow(10, -9)); ///< gas sensor sensitivity in A/ppm - 65 nA/ppm
+
+Serial pc(USBTX, USBRX); ///< Serial interface to the pc
+
+/**
+ @brief Displays CN0357 circuit readings and data to the UART
+
+ @param ui16Data - ADC data register value to be displayed
+ @param fData1 - ADC input voltage reading to be displayed
+ @param fdata2 - Gas Concentration reading to be displayed
+
+ **/
+void display_data(uint16_t ui16Data, float fData1, float fdata2)
+{
+
+ pc.printf("\r\nADC Data Register Value = %#08x", ui16Data); /** Send valid ADC data register value*/
+ pc.printf("\r\nADC Input Voltage input = %f V", fData1); /** Send valid voltage input value */
+ pc.printf("\r\nGas Concentration = %f PPM", fdata2); /** Send valid gas concentration value */
+
+ pc.printf("\r\n");
+}
+
+
+/**
+ * Project entry-point - initializes the CN0357 shield, reads the data when the ADC is ready and outputs the sensor
+ * value in PPM
+ */
+int main()
+{
+ /* Main variables */
+
+
+ CN0357 cn0357;
+ cn0357.init(SENSOR_RANGE, SENSOR_SENSITIVITY);
+
+ /* Infinite loop */
+ while (1) {
+
+ uint8_t ui8Status_Reg = cn0357.read_adc_status(); // Read ADC Status Register
+
+ if (ui8Status_Reg == 0x08) { // Checks if ADC data is available
+ uint16_t ui16Adcdata = cn0357.read_sensor();
+ float fAdcVoltage = cn0357.data_to_voltage(ui16Adcdata); // Convert ADC data to voltage
+ float fConcentration = cn0357.calc_ppm(fAdcVoltage); // Convert voltage to Gas concentration
+ display_data(ui16Adcdata, fAdcVoltage, fConcentration); // Display data thru UART
+
+ // printf("OneshotRead: %f PPM \r\n", cn0357.readPPM());
+ }
+
+ wait_ms(1000);
+ }
+
+ /* Infinite loop, never returns. */
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad5270/AD5270.cpp Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,94 @@
+/**
+* @file AD5270.cpp
+* @brief Source file for AD5270 rheostat
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#include "mbed.h"
+#include "AD5270.h"
+
+/**
+ * @brief AD5270 constructor, sets CS pin and SPI format
+ * @param CS - (optional)chip select of the AD5270
+ * @param max_resistance - (optional) nominal resistance of the AD5270 chip in ohms
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK - (optional)pin of the SPI interface
+ */
+AD5270::AD5270(PinName CS, float max_resistance, PinName MOSI,PinName MISO,PinName SCK):
+ ad5270(MOSI,MISO,SCK),cs(CS),_max_resistance(max_resistance)
+{
+ ad5270.format(8,3);
+ cs=true;
+}
+
+/**
+ * @brief Compute for the nearest RDAC value from given resistance
+ * @param resistance - resistor
+ * @return RDAC value - closest possible to given resistance
+ */
+uint16_t AD5270::calc_RDAC(float resistance)
+{
+ return static_cast<uint16_t>( (resistance / _max_resistance) * 1024.0 );
+}
+
+/**
+ * @brief Puts the AD5270 SDO line in to Hi-Z mode
+ * @return none
+ */
+void AD5270::set_SDO_HiZ(void)
+{
+ write_reg(HI_Z_Cmd);
+ write_reg(NO_OP_cmd);
+}
+
+/**
+ * @brief Set AD5270 SPI frequency
+ * @param hz - SPI bus frequency in hz
+ * @return none
+ */
+void AD5270::frequency(int hz)
+{
+ ad5270.frequency(hz);
+}
+
+/**
+ * @brief Issues AD5270 a command
+ * @param command - command to be sent
+ * @param data - (optional)value for the requested command
+ * @return response form the AD5270
+ */
+uint16_t AD5270::write_cmd(uint8_t command, uint16_t data)
+{
+ /* build 16 bit data to be written - Command + Value */
+ uint16_t ui16Command = ((command & 0x3C) << 8) | (data & 0x3FF);
+ return write_reg(ui16Command);
+}
+
+/**
+ * @brief Writes 16bit data to the AD5270 SPI interface
+ * @param data to be written
+ * @return data returned by the AD5270
+ */
+uint16_t AD5270::write_reg(uint16_t data)
+{
+ uint16_t result;
+ uint8_t upper_byte = (data >> 8) & 0xFF;
+ uint8_t lower_byte = data & 0xFF;
+ cs = false;
+ result = ((ad5270.write(upper_byte)) << 8);
+ result |= ad5270.write(lower_byte);
+ cs = true;
+ return result;
+}
+
+/**
+ * @brief Gets maximum resistance of the AD5270 digital rheostat
+ * @return maximum resistance in ohms
+ */
+float AD5270::get_max_resistance()
+{
+ return _max_resistance;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad5270/AD5270.h Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,56 @@
+/**
+* @file AD5270.h
+* @brief Header file for AD5270 rheostat
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#ifndef AD5270_H
+#define AD5270_H
+
+#include "mbed.h"
+
+/**
+ * @brief Analog Devices AD5270 SPI Digital Rheostat class
+ */
+class AD5270
+{
+public:
+
+ /// AD5270 commands
+ typedef enum {
+ NO_OP = 0x00, ///< No data
+ NO_OP_cmd = 0x0000, ///< 16 bit no data
+ WRITE_RDAC = 0x04, ///< Write to the RDAC Register
+ READ_RDAC = 0x08, ///< Read from the RDAC Register
+ STORE_50TP = 0x0C, ///< Write to the RDAC to memory
+ SW_RST = 0x10, ///< Software reset to last memory location
+ READ_50TP_CONTENTS = 0x14, ///< Read the last memory contents
+ READ_50TP_ADDRESS = 0x18, ///< Read the last memory address
+ WRITE_CTRL_REG = 0x1C, ///< Write to the control Register
+ READ_CTRL_REG = 0x20, ///< Read from the control Register
+ SW_SHUTDOWN = 0x24, ///< Software shutdown (0) - Normal, (1) - Shutdown
+ HI_Zupper = 0x80, ///< Get the SDO line ready for High Z
+ HI_Zlower = 0x01, ///< Puts AD5270 into High Z mode
+ HI_Z_Cmd = 0x8001 ///< Puts AD5270 into High Z mode*/
+ } AD5270Commands_t;
+
+ AD5270(PinName CS=SPI_CS, float max_resistance = 20000.0, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+ void set_SDO_HiZ(void);
+ void frequency(int hz);
+ uint16_t calc_RDAC(float resistance);
+ uint16_t write_cmd(uint8_t command, uint16_t data = 0x00);
+ uint16_t write_reg(uint16_t data);
+ float get_max_resistance(void);
+
+ SPI ad5270; ///< SPI instance of the AD5270
+ DigitalOut cs; ///< DigitalOut instance for the chipselect of the AD5270
+
+private:
+ const static int _RESET = 0xff;
+ const static int _DUMMY_BYTE = 0xAA;
+ float _max_resistance;
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad7790/AD7790.cpp Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,117 @@
+/**
+* @file AD7790.cpp
+* @brief Source file for AD7790 ADC
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#include <stdint.h>
+#include "mbed.h"
+#include "ad7790.h"
+
+
+/**
+ * @brief AD7790 constructor, sets CS pin and SPI format
+ * @param CS - (optional)chip select of the AD7790
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK - (optional)pin of the SPI interface
+ */
+AD7790::AD7790(PinName CS,
+ PinName MOSI,
+ PinName MISO,
+ PinName SCK) :
+ ad7790(MOSI, MISO, SCK),cs(CS)
+{
+ ad7790.format(8,3);
+ cs = true; // cs is active low
+}
+
+/**
+ * @brief Set AD7790 SPI frequency
+ * @param hz - SPI bus frequency in hz
+ * @return none
+ */
+void AD7790::frequency(int hz)
+{
+ ad7790.frequency(hz);
+}
+
+/**
+ * @brief Resets the AD7790
+ * @return none
+ */
+void AD7790::reset()
+{
+ cs = false;
+ ad7790.write(_RESET);
+ ad7790.write(_RESET);
+ ad7790.write(_RESET);
+ ad7790.write(_RESET);
+ cs = true;
+}
+
+/**
+ * @brief Reads the data register of the AD7790
+ * @return value of the register
+ */
+uint16_t AD7790::read_data(void)
+{
+ uint16_t dataResult = 0;
+
+ cs = false;
+ ad7790.write(_DATA_READ);
+ dataResult = ((ad7790.write(_DUMMY_BYTE)) << 8);
+ dataResult |= (ad7790.write(_DUMMY_BYTE));
+ cs = true;
+
+ return dataResult;
+}
+
+/**
+ * @brief Reads a register of the AD7790
+ * @param regAddress - address of the register
+ * @return value of the register
+ */
+uint16_t AD7790::read_reg(AD7790Registers_t regAddress)
+{
+ uint16_t data = regAddress << 12;
+ data |= _DUMMY_BYTE;
+ data |= _READ_FLAG;
+ return write_spi(data);
+}
+
+/**
+ * @brief Writes a register of the AD7790
+ * @param regAddress - address of the register
+ * @param regValue - value to be written
+ * @return none
+ *
+ */
+void AD7790::write_reg(AD7790Registers_t regAddress,uint8_t regValue)
+{
+ uint16_t data = regAddress << 12;
+ data |= regValue;
+ write_spi(data);
+}
+
+/**
+ * @brief Writes 16bit data to the AD7790 SPI interface
+ * @param data to be written
+ * @return data returned by the AD7790
+ */
+uint16_t AD7790::write_spi(uint16_t data)
+{
+ uint16_t result;
+ uint8_t upper_byte = (data >> 8) & 0xFF;
+ uint8_t lower_byte = data & 0xFF;
+ cs = false;
+ result = (ad7790.write(upper_byte) << 8);
+ result |= ad7790.write(lower_byte);
+ cs = true;
+ return result;
+}
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/ad7790/AD7790.h Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,56 @@
+/**
+* @file AD7790.h
+* @brief Header file for AD7790 ADC
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#ifndef AD7790_H
+#define AD7790_H
+
+#include "mbed.h"
+
+/**
+ * @brief Analog Devices AD7790 SPI 16-bit Buffered Sigma-Delta ADC
+ */
+class AD7790
+{
+public:
+ /// AD7790 registers
+ typedef enum {
+ COMMUNICATION_REG = 0, ///< Communication register
+ STATUS_REG = 0, ///< Status register
+ MODE_REG, ///< Mode register
+ FILTER_REG, ///< Filter Register
+ DATA_REG ///< Data register
+ } AD7790Registers_t;
+
+ /// AD7790 channel configuration
+ typedef enum {
+ DIFFERENTIAL, ///< AIN(+)-AIN(-)
+ RESERVED, ///< reserved
+ SHORT, ///< AIN(-)-AIN(-)
+ VDDMONITOR ///< Monitor VDD
+ } AD7790Channel_t;
+
+ AD7790(PinName CS=SPI_CS, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+ void frequency(int hz);
+ void reset(void);
+ void write_reg(AD7790Registers_t regAddress, uint8_t regValue);
+ uint16_t write_spi(uint16_t data);
+ uint16_t read_reg (AD7790Registers_t regAddress);
+ uint16_t read_data(void);
+
+ SPI ad7790; ///< SPI instance of the AD7790
+ DigitalOut cs; ///< DigitalOut instance for the chipselect of the AD7790
+
+private:
+
+ const static int _RESET = 0xFF;
+ const static int _DUMMY_BYTE = 0xAA;
+ const static int _READ_FLAG = 0x0800;
+ const static int _DATA_READ = 0x38; // Read from the Data Register
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/cn0357/cn0357.cpp Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,192 @@
+/**
+* @file CN0357.cpp
+* @brief Source file for CN0357 toxic gas sensor shield
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+
+#include "mbed.h"
+#include "AD7790.h"
+#include "AD5270.h"
+#include "cn0357.h"
+
+/**
+ * @brief CN0357 constructor
+ * @param CSAD7790 - (optional)chip select of the AD7790
+ * @param CSAD5270 - (optional)chip select of the AD5270
+ * @param MOSI - (optional)pin of the SPI interface
+ * @param MISO - (optional)pin of the SPI interface
+ * @param SCK - (optional)pin of the SPI interface
+ */
+CN0357::CN0357(PinName CSAD7790, PinName CSAD5270, PinName MOSI, PinName MISO,
+ PinName SCK) :
+ ad7790(CSAD7790, MOSI, MISO, SCK), ad5270(CSAD5270, 20000.0, MOSI, MISO, SCK) ,
+ _sensor_sensitivity(0), _sensor_range(0), _RDACvalue(0)
+{
+}
+
+/**
+ * @brief initializes the AD7790 and the AD5270
+ * @param range - range of the sensor used (in ppm)
+ * @param sensitivity - sensitivity of the sensor (A/ppm)
+ * @param jp - (optional)jumper configuration of the CN0357
+ * @param mode_val - (optional)if jp is set to InternalADC, configures the mode register of the Internal ADC
+ * @param filter_val - (optional)if jp is set to InternalADC, configures the filter register of the Internal ADC
+ */
+void CN0357::init(float range, float sensitivity,JumperConfig_t jp,uint8_t mode_val, uint8_t filter_val)
+{
+ ad5270.frequency(500000);
+ ad7790.frequency(500000);
+
+ float resistance = set_sensor_parameters(range,sensitivity);
+ _rdac_init(resistance);
+ if(jp == INTERNAL_AD7790) {
+ _AD7790_init(mode_val, filter_val);
+ }
+
+}
+
+/**
+ * @brief initializes the RDAC and sets SDO to HiZ
+ * @param resistance - resistance value to initialize the RDAC
+ * @return
+ */
+void CN0357::_rdac_init(float resistance)
+{
+ /* RDAC initialization*/
+ /* Compute for the nearest RDAC value from given resistance and save data to the structure */
+ set_RDAC_value(resistance);
+ /* Set AD5270 SDO to Hi-Z */
+ ad5270.set_SDO_HiZ();
+}
+
+/**
+ * @brief initializes the AD7790
+ * @param mode_val - configures the mode register of the Internal ADC
+ * @param filter_val - configures the filter register of the Internal ADC
+ */
+void CN0357::_AD7790_init(uint8_t mode_val, uint8_t filter_val)
+{
+ ad7790.reset();
+ // wait_ms(1000);
+ ad7790.write_reg(AD7790::MODE_REG, mode_val);
+ ad7790.write_reg(AD7790::FILTER_REG, filter_val);
+
+}
+
+/**
+ * @brief reads the status register of the AD7790
+ * @return status register value
+ */
+uint8_t CN0357::read_adc_status(void)
+{
+ return ad7790.read_reg(AD7790::STATUS_REG);
+}
+
+/**
+ * @brief reads the ADC and computes the sensor voltage
+ * @return sensor voltage
+ */
+float CN0357::read_sensor_voltage(void)
+{
+ return data_to_voltage(read_sensor());
+}
+
+/**
+ * @brief reads the data register of the AD7790
+ * @return data register value
+ */
+uint16_t CN0357::read_sensor(void)
+{
+ return ad7790.read_data();
+}
+
+/**
+ * @brief reads and computes the sensor reading in PPM
+ * @return value of the sensor reading in PPM
+ */
+float CN0357::read_ppm()
+{
+ return calc_ppm(read_sensor_voltage()); /* Convert voltage to Gas concentration*/
+}
+
+/**
+ * @brief computes a value in PPM from a reading received as a param
+ * @param adcVoltage - voltage to be converted to PPM
+ * @return sensor value in PPM
+ */
+float CN0357::calc_ppm(float adcVoltage)
+{
+ float fConcentration = 0;
+ fConcentration = (fabs(adcVoltage) / _RDACvalue) / _sensor_sensitivity;
+ return fConcentration;
+}
+
+/**
+ * @brief computes voltage from a 16 bit ADC value received as a parameter
+ * @param data - ADC value
+ * @return sensor voltage
+ */
+float CN0357::data_to_voltage(uint16_t data)
+{
+ return ((static_cast<float>(data) / pow(2, 15)) - 1) * 1.2; /* Bipolar voltage computation from ADC code */
+}
+
+/**
+ * @brief sets a new value for the RDAC
+ * @param resistance new value for the resistance
+ * @return none
+ */
+void CN0357::set_RDAC_value(float resistance)
+{
+ // Compute for the RDAC code nearest to the required feedback resistance
+ uint16_t RDAC_val = (resistance / 20000.0) * 1024.0;
+ // Compute for the constants used in voltage and PPM conversion computation
+ _RDACvalue = ((static_cast<float> (RDAC_val) * 20000.0) / 1024.0);
+ ad5270.write_cmd(AD5270::WRITE_CTRL_REG, 0x02); // RDAC register write protect - allow update of wiper position through digital interface
+ ad5270.write_cmd(AD5270::WRITE_RDAC, RDAC_val); // write data to the RDAC register
+}
+
+/**
+ * @brief getter method for RDAC value
+ * @return value of the RDAC in ohms
+ */
+float CN0357::get_RDAC_value()
+{
+ return _RDACvalue;
+}
+
+/**
+ * @brief set sensor range and sensitivity
+ * sets sensor range, sensitivity
+ * returns suggested resistance value for feedback resistor
+ * @param range - range of the sensor used (in ppm)
+ * @param sensitivity - sensitivity of the sensor (in A/ppm)
+ * @return suggested resistance value for feedback resistor
+ */
+float CN0357::set_sensor_parameters(float range, float sensitivity)
+{
+ _sensor_sensitivity = static_cast<float>(sensitivity);
+ _sensor_range = range;
+ return (1.2 / (static_cast<float>(_sensor_range * _sensor_sensitivity)));
+}
+
+/**
+ * @brief getter method for sensor sensitivity
+ * @return sensor sensitivity (in A/ppm)
+ */
+float CN0357::get_sensor_sensitivity()
+{
+ return _sensor_sensitivity;
+}
+
+/**
+ * @brief getter method for sensor range
+ * @return sensor range (in ppm)
+ */
+float CN0357::get_sensor_range()
+{
+ return _sensor_range;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/cn0357/cn0357.h Wed Mar 30 17:35:04 2016 +0300
@@ -0,0 +1,62 @@
+/**
+* @file CN0357.h
+* @brief Header file for CN0357 toxic gas sensor shield
+* @version V0.1
+* @author ADI
+* @date March 2015
+**/
+
+#ifndef CN0357_H
+#define CN0357_H
+
+#include "mbed.h"
+#include "ad7790.h"
+#include "ad5270.h"
+
+/**
+ * @brief EVAL-CN0357 toxic gas sensor shield
+ */
+class CN0357
+{
+public:
+
+ /// CN0357 shield jumper configuration
+ typedef enum {
+ INTERNAL_AD7790 = 0, ///< The shield's AD7790 is used
+ EXTERNAL_ADC ///< Sensor analog output is routed to A1 pin of the shield
+ } JumperConfig_t;
+
+ CN0357(PinName CSAD7790=D8, PinName CSAD5270=D6, PinName MOSI=SPI_MOSI,PinName MISO=SPI_MISO,PinName SCK=SPI_SCK);
+ void init(float range, float sensitivity,JumperConfig_t jp = INTERNAL_AD7790, uint8_t mode_val = _DEFAULT_MODE_VAL, uint8_t filter_val = _DEFAULT_FILTER_VAL);
+
+ uint8_t read_adc_status(void);
+ uint16_t read_sensor(void);
+ float read_sensor_voltage(void);
+ float data_to_voltage(uint16_t data);
+ float calc_ppm(float adcVoltage);
+ float read_ppm(void);
+
+ void set_RDAC_value(float resistor_val);
+ float get_RDAC_value(void);
+ float set_sensor_parameters(float range, float sensitivity);
+ float get_sensor_range(void);
+ float get_sensor_sensitivity(void);
+
+
+ AD7790 ad7790; ///< AD7790 instance - can be used for manual overriding
+ AD5270 ad5270; ///< AD5270 instance - can be used for manual overriding
+
+private:
+ const static int _RESET = 0xff;
+ const static int _DEFAULT_MODE_VAL = 0x00;
+ const static int _DEFAULT_FILTER_VAL = 0x07;
+ float _sensor_sensitivity;
+ float _sensor_range;
+ float _RDACvalue;
+ void _rdac_init(float resistanceValue);
+ void _AD7790_init(uint8_t mode_val, uint8_t filter_val);
+
+
+};
+
+#endif // CN0357_H
CN0357 - Toxic gas measurement
CN0216 - Weight Scale