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
Diff: libraries/cn0216/CN0216.cpp
- Revision:
- 17:b8356808e8ad
- Parent:
- 13:66c8e4ce4ff1
diff -r b8a49ec95bad -r b8356808e8ad libraries/cn0216/CN0216.cpp
--- a/libraries/cn0216/CN0216.cpp Fri Apr 29 17:16:55 2016 +0300
+++ b/libraries/cn0216/CN0216.cpp Fri Apr 29 17:34:07 2016 +0300
@@ -50,16 +50,29 @@
#include "CN0216.h"
extern Serial pc;
- CN0216::CN0216(PinName CSAD7791, PinName MOSI, PinName MISO, PinName SCK) : ad7791(1.2, CSAD7791, MOSI, MISO, SCK)
- {
- _cal_weight = 0;
+/**
+ * CN0216 constructor
+ * @param CSAD7791 - Chipselect of the AD7791
+ * @param MOSI - MOSI line of the SPI bus
+ * @param MISO - MISO line of the SPI bus
+ * @param SCK - SCK line of the SPI bus
+ */
+CN0216::CN0216(PinName CSAD7791, PinName MOSI, PinName MISO, PinName SCK) : ad7791(1.2, CSAD7791, MOSI, MISO, SCK)
+{
+ _cal_weight = 0;
_zero_scale_value = 0;
_full_scale_value = 0;
- _grams_per_bit = 0;
+ _weight_units_per_bit = 0;
+}
- }
- void CN0216::init(float cal_weight, uint8_t mode_val, uint8_t filter_val)
- {
+/**
+ * Initializes the mode and filter values of the AD7791 and sets the weight to be used in calibration
+ * @param cal_weight - weight used in calibration
+ * @param mode_val - value of the mode register
+ * @param filter_val - value of the filter register
+ */
+void CN0216::init(float cal_weight, uint8_t mode_val, uint8_t filter_val)
+{
_cal_weight = cal_weight;
ad7791.frequency(500000);
wait_ms(50);
@@ -69,62 +82,80 @@
wait_us(2);
ad7791.write_filter_reg(filter_val);
wait_ms(50);
- }
+}
- void CN0216::calibrate(CalibrationStep_t cal)
- {
+/**
+ * Calibrates the CN0216 weigh scale
+ * @param cal - calibration step.
+ * Step CN0216::ZERO_SCALE_CALIBRATION will take CN0216::_NUMBER_OF_SAMPLES samples and use the minimum as value for the zero scale
+ * Step CN0216::FULL_SCALE_CALIBRATION will take CN0216::_NUMBER_OF_SAMPLES samples and use the average as value for the full scale
+ * Step COMPUTE_UNITS_PER_BIT will compute the grams per bit used in weight computation.
+ */
+void CN0216::calibrate(CalibrationStep_t cal)
+{
uint64_t sum = 0;
uint32_t min = 0xFFFFFFFF;
uint32_t sample = 0;
- switch(cal)
- {
- case ZERO_SCALE_CALIBRATION:
- case FULL_SCALE_CALIBRATION:
- for(int i = 0;i < _NUMBER_OF_SAMPLES;i++)
- {
- sample = ad7791.read_u32();
- min = (min<sample) ? min : sample;
- sum += ad7791.read_u32();
- wait_us(5);
- }
- if(cal == ZERO_SCALE_CALIBRATION)
- {
- // pc.printf("ZERO SCALE VALUE = %x",sum);
- _zero_scale_value = min;
- }
- else
- {
- // pc.printf("FULL SCALE VALUE = %x",sum);
- sum = sum / _NUMBER_OF_SAMPLES;
- _full_scale_value = sum;
- }
- break;
+ switch(cal) {
+ case ZERO_SCALE_CALIBRATION:
+ case FULL_SCALE_CALIBRATION:
+ for(int i = 0; i < _NUMBER_OF_SAMPLES; i++) {
+ sample = ad7791.read_u32();
+ min = (min < sample) ? min : sample;
+ sum += ad7791.read_u32();
+ wait_us(5);
+ }
+ if(cal == ZERO_SCALE_CALIBRATION) {
+ // pc.printf("ZERO SCALE VALUE = %x",sum);
+ _zero_scale_value = min;
+ } else {
+ // pc.printf("FULL SCALE VALUE = %x",sum);
+ sum = sum / _NUMBER_OF_SAMPLES;
+ _full_scale_value = sum;
+ }
+ break;
- case COMPUTE_GRAM_PER_BIT:
- _grams_per_bit = _cal_weight / (static_cast<float> (_full_scale_value - _zero_scale_value)); /* Calculate number of grams per LSB */
- // pc.printf("GRAMS/LSB = %f", _grams_per_bit);
- break;
- default:
- break;
+ case COMPUTE_UNITS_PER_BIT:
+ _weight_units_per_bit = _cal_weight / (static_cast<float> (_full_scale_value - _zero_scale_value)); /* Calculate number of grams per LSB */
+ // pc.printf("GRAMS/LSB = %f", _grams_per_bit);
+ break;
+ default:
+ break;
}
- }
+}
- float CN0216::compute_weight(uint32_t data)
- {
+/**
+ * Computes the weight based on the formula
+ * weight = (data - zeroscale) * weight_units_per_bit
+ * @param data read from the ADC
+ * @return weight based on data
+ */
+float CN0216::compute_weight(uint32_t data)
+{
// pc.printf("\r\nFULL_SCALE_VALUE = %x\r\nZERO_SCALE_VALUE = %x\r\nDATA READ = %x\r\nGRAMS/LSB = %f\r\n",_full_scale_value,data,_zero_scale_value,_grams_per_bit);
- if(data<_zero_scale_value)
- data = _zero_scale_value; // clamp data to 0
- float weight_in_grams = (static_cast<float>((data) - _zero_scale_value)) * _grams_per_bit; /* Calculate weight */
+ if(data < _zero_scale_value)
+ data = _zero_scale_value; // clamp data to 0
+ float weight_in_grams = (static_cast<float>((data) - _zero_scale_value)) * _weight_units_per_bit; /* Calculate weight */
return weight_in_grams;
- }
- uint32_t CN0216::read_u32()
- {
+}
+
+/**
+ * Reads the AD7791
+ * @return value read by the ADC
+ */
+uint32_t CN0216::read_u32()
+{
return ad7791.read_u32();
- }
- float CN0216::read_weight()
- {
- uint32_t weight = read_u32();
+}
+
+/**
+ * Reads the ADC and computes the weight based on the formula described above.
+ * @return weight
+ */
+float CN0216::read_weight()
+{
+ uint32_t weight = read_u32();
return compute_weight(weight);
- }
-
+}
+
CN0357 - Toxic gas measurement
CN0216 - Weight Scale