From 1f6dafecb097b73c367036df30901259abfaa85f Mon Sep 17 00:00:00 2001 From: Toni Lozano Date: Tue, 26 Jan 2016 14:08:17 +0100 Subject: [PATCH] Modified ADC measurement of PM10 driver to include adc-zoul direct access --- examples/zolertia/zoul/Makefile | 3 +- examples/zolertia/zoul/test-aac-sensor.c | 3 +- examples/zolertia/zoul/test-vac-sensor.c | 2 +- platform/zoul/dev/pm10-sensor.c | 39 ++++++++++++++++-------- platform/zoul/dev/pm10-sensor.h | 2 ++ 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index 95e4a4e1f..a0a8dee0d 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -1,12 +1,11 @@ DEFINES+=PROJECT_CONF_H=\"project-conf.h\" CONTIKI_PROJECT = zoul-demo test-tsl2563 test-sht25 test-pwm test-power-mgmt -ONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor +CONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor CONTIKI_PROJECT += test-grove-light-sensor test-grove-loudness-sensor CONTIKI_PROJECT += test-weather-meter test-grove-gyro test-lcd CONTIKI_PROJECT += test-pm10-sensor test-vac-sensor test-aac-sensor - CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c diff --git a/examples/zolertia/zoul/test-aac-sensor.c b/examples/zolertia/zoul/test-aac-sensor.c index 0884f9200..bbda23955 100644 --- a/examples/zolertia/zoul/test-aac-sensor.c +++ b/examples/zolertia/zoul/test-aac-sensor.c @@ -54,7 +54,6 @@ #define LOOP_PERIOD 2 #define LOOP_INTERVAL (CLOCK_SECOND * LOOP_PERIOD) #define LEDS_PERIODIC LEDS_GREEN -#define BUTTON_PRESS_EVENT_INTERVAL (CLOCK_SECOND) /*---------------------------------------------------------------------------*/ static struct etimer et; @@ -72,7 +71,7 @@ PROCESS_THREAD(test_aac_sensor_process, ev, data) /* Configure the ADC ports */ /* Use pin number not mask, for example if using the PA5 pin then use 5 */ - printf("return configure, %d \n", adc_sensors.configure(ANALOG_AAC_SENSOR, ADC_PIN)); + adc_sensors.configure(ANALOG_AAC_SENSOR, ADC_PIN); printf("AAC test application\n"); leds_on(LEDS_PERIODIC); diff --git a/examples/zolertia/zoul/test-vac-sensor.c b/examples/zolertia/zoul/test-vac-sensor.c index 289a0e839..37db59edf 100644 --- a/examples/zolertia/zoul/test-vac-sensor.c +++ b/examples/zolertia/zoul/test-vac-sensor.c @@ -72,7 +72,7 @@ PROCESS_THREAD(test_vac_sensor_process, ev, data) /* Configure the ADC ports */ /* Use pin number not mask, for example if using the PA5 pin then use 5 */ - printf("return configure, %d \n", adc_sensors.configure(ANALOG_VAC_SENSOR, ADC_PIN)); + adc_sensors.configure(ANALOG_VAC_SENSOR, ADC_PIN); printf("VAC test application\n"); leds_on(LEDS_PERIODIC); diff --git a/platform/zoul/dev/pm10-sensor.c b/platform/zoul/dev/pm10-sensor.c index 8f94eb04f..3ec10de62 100644 --- a/platform/zoul/dev/pm10-sensor.c +++ b/platform/zoul/dev/pm10-sensor.c @@ -1,4 +1,4 @@ - /* +/* * Copyright (c) 2016, Zolertia * All rights reserved. * @@ -43,6 +43,8 @@ #include #include "contiki.h" #include "adc-sensors.h" +#include "adc-zoul.h" +#include "zoul-sensors.h" #include "dev/pm10-sensor.h" #include "dev/sys-ctrl.h" #include "lib/sensors.h" @@ -52,7 +54,7 @@ #define PM10_SENSOR_PORT_BASE GPIO_PORT_TO_BASE(PM10_SENSOR_CTRL_PORT) #define PM10_SENSOR_PIN_MASK GPIO_PIN_MASK(PM10_SENSOR_CTRL_PIN) /*---------------------------------------------------------------------------*/ -static uint8_t enabled; +static int pm10_channel; /*---------------------------------------------------------------------------*/ static int configure(int type, int value) @@ -68,20 +70,20 @@ configure(int type, int value) GPIO_SET_OUTPUT(PM10_SENSOR_PORT_BASE, PM10_SENSOR_PIN_MASK); GPIO_CLR_PIN(PM10_SENSOR_PORT_BASE, PM10_SENSOR_PIN_MASK); - enabled = 1; - return adc_sensors.configure(ANALOG_PM10_SENSOR, value); + pm10_channel = (1 << value); + return adc_zoul.configure(SENSORS_HW_INIT, pm10_channel); } - enabled = 0; + pm10_channel = 0; return PM10_SUCCESS; } /*---------------------------------------------------------------------------*/ static int value(int type) { - uint16_t val; + uint32_t val; - if(!enabled) { + if(!pm10_channel) { return PM10_ERROR; } @@ -90,17 +92,30 @@ value(int type) /* Pulse wave delay */ clock_delay_usec(PM10_SENSOR_PULSE_DELAY); /* Data acquisition */ - val = adc_sensors.value(ANALOG_PM10_SENSOR); - /* Clear pulse wave pin */ - GPIO_CLR_PIN(PM10_SENSOR_PORT_BASE, PM10_SENSOR_PIN_MASK); - + val = (uint32_t)adc_zoul.value(pm10_channel); + + if(val == ZOUL_SENSORS_ERROR) { + printf("PM10 sensor: failed retrieving data\n"); + return PM10_ERROR; + } + + /* Default voltage divisor relation is 5/3 aprox, change at adc_wrapper.h, + * calculations below assume a decimation rate of 512 (12 bits ENOB) and + * AVVD5 voltage reference of 3.3V + */ + val *= PM10_EXTERNAL_VREF; + val /= PM10_EXTERNAL_VREF_CROSSVAL; + /* Applied constant conversion from UAir project * to obtain value in ppm (value in mV * 0.28) */ val *= 28; val /= 1000; - return val; + /* Clear pulse wave pin */ + GPIO_CLR_PIN(PM10_SENSOR_PORT_BASE, PM10_SENSOR_PIN_MASK); + + return (uint16_t)val; } /*---------------------------------------------------------------------------*/ SENSORS_SENSOR(pm10, PM10_SENSOR, value, configure, NULL); diff --git a/platform/zoul/dev/pm10-sensor.h b/platform/zoul/dev/pm10-sensor.h index 61057e0d1..d43256e44 100644 --- a/platform/zoul/dev/pm10-sensor.h +++ b/platform/zoul/dev/pm10-sensor.h @@ -51,6 +51,8 @@ #define PM10_SUCCESS 0 #define PM10_SENSOR "PM10 Sensor" #define PM10_SENSOR_PULSE_DELAY 280 +#define PM10_EXTERNAL_VREF 5000 +#define PM10_EXTERNAL_VREF_CROSSVAL 3300 /* -------------------------------------------------------------------------- */ #ifdef PM10_SENSOR_CONF_CTRL_PIN #define PM10_SENSOR_CTRL_PIN PM10_SENSOR_CONF_CTRL_PIN