Merge pull request #483 from Riksu9000/fix_adc
Fix misconfigured ADC and remove now unnecessary filtering
This commit is contained in:
		
						commit
						9fb3755088
					
				@ -23,7 +23,6 @@ void Battery::Update() {
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // Non blocking read
 | 
					  // Non blocking read
 | 
				
			||||||
  samples = 0;
 | 
					 | 
				
			||||||
  isReading = true;
 | 
					  isReading = true;
 | 
				
			||||||
  SaadcInit();
 | 
					  SaadcInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -40,9 +39,9 @@ void Battery::SaadcInit() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  nrf_saadc_channel_config_t adcChannelConfig = {.resistor_p = NRF_SAADC_RESISTOR_DISABLED,
 | 
					  nrf_saadc_channel_config_t adcChannelConfig = {.resistor_p = NRF_SAADC_RESISTOR_DISABLED,
 | 
				
			||||||
                                                 .resistor_n = NRF_SAADC_RESISTOR_DISABLED,
 | 
					                                                 .resistor_n = NRF_SAADC_RESISTOR_DISABLED,
 | 
				
			||||||
                                                 .gain = NRF_SAADC_GAIN1_5,
 | 
					                                                 .gain = NRF_SAADC_GAIN1_4,
 | 
				
			||||||
                                                 .reference = NRF_SAADC_REFERENCE_INTERNAL,
 | 
					                                                 .reference = NRF_SAADC_REFERENCE_INTERNAL,
 | 
				
			||||||
                                                 .acq_time = NRF_SAADC_ACQTIME_3US,
 | 
					                                                 .acq_time = NRF_SAADC_ACQTIME_40US,
 | 
				
			||||||
                                                 .mode = NRF_SAADC_MODE_SINGLE_ENDED,
 | 
					                                                 .mode = NRF_SAADC_MODE_SINGLE_ENDED,
 | 
				
			||||||
                                                 .burst = NRF_SAADC_BURST_ENABLED,
 | 
					                                                 .burst = NRF_SAADC_BURST_ENABLED,
 | 
				
			||||||
                                                 .pin_p = batteryVoltageAdcInput,
 | 
					                                                 .pin_p = batteryVoltageAdcInput,
 | 
				
			||||||
@ -60,22 +59,21 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) {
 | 
				
			|||||||
    APP_ERROR_CHECK(nrfx_saadc_buffer_convert(&saadc_value, 1));
 | 
					    APP_ERROR_CHECK(nrfx_saadc_buffer_convert(&saadc_value, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // A hardware voltage divider divides the battery voltage by 2
 | 
					    // A hardware voltage divider divides the battery voltage by 2
 | 
				
			||||||
    // ADC gain is 1/5
 | 
					    // ADC gain is 1/4
 | 
				
			||||||
    // thus adc_voltage = battery_voltage / 2 * gain = battery_voltage / 10
 | 
					    // thus adc_voltage = battery_voltage / 2 * gain = battery_voltage / 8
 | 
				
			||||||
    // reference_voltage is 0.6V
 | 
					    // reference_voltage is 600mV
 | 
				
			||||||
    // p_event->data.done.p_buffer[0] = (adc_voltage / reference_voltage) * 1024
 | 
					    // p_event->data.done.p_buffer[0] = (adc_voltage / reference_voltage) * 1024
 | 
				
			||||||
    voltage = p_event->data.done.p_buffer[0] * 6000 / 1024;
 | 
					    voltage = p_event->data.done.p_buffer[0] * (8 * 600) / 1024;
 | 
				
			||||||
    percentRemaining = (voltage - battery_min) * 100 / (battery_max - battery_min);
 | 
					 | 
				
			||||||
    percentRemaining = std::max(percentRemaining, 0);
 | 
					 | 
				
			||||||
    percentRemaining = std::min(percentRemaining, 100);
 | 
					 | 
				
			||||||
    percentRemainingBuffer.Insert(percentRemaining);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    samples++;
 | 
					    if (voltage > battery_max) {
 | 
				
			||||||
    if (samples > percentRemainingSamples) {
 | 
					      percentRemaining = 100;
 | 
				
			||||||
      nrfx_saadc_uninit();
 | 
					    } else if (voltage < battery_min) {
 | 
				
			||||||
      isReading = false;
 | 
					      percentRemaining = 0;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      nrfx_saadc_sample();
 | 
					      percentRemaining = (voltage - battery_min) * 100 / (battery_max - battery_min);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    nrfx_saadc_uninit();
 | 
				
			||||||
 | 
					    isReading = false;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -7,38 +7,6 @@
 | 
				
			|||||||
namespace Pinetime {
 | 
					namespace Pinetime {
 | 
				
			||||||
  namespace Controllers {
 | 
					  namespace Controllers {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** A simple circular buffer that can be used to average
 | 
					 | 
				
			||||||
     out the sensor values. The total capacity of the CircBuffer
 | 
					 | 
				
			||||||
    is given as the template parameter N.
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
    template <int N> class CircBuffer {
 | 
					 | 
				
			||||||
    public:
 | 
					 | 
				
			||||||
      CircBuffer() : arr {}, sz {}, cap {N}, head {} {
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      /**
 | 
					 | 
				
			||||||
     insert member function overwrites the next data to the current
 | 
					 | 
				
			||||||
    HEAD and moves the HEAD to the newly inserted value.
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
      void Insert(const uint8_t num) {
 | 
					 | 
				
			||||||
        head %= cap;
 | 
					 | 
				
			||||||
        arr[head++] = num;
 | 
					 | 
				
			||||||
        if (sz != cap) {
 | 
					 | 
				
			||||||
          sz++;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      uint8_t GetAverage() const {
 | 
					 | 
				
			||||||
        int sum = std::accumulate(arr.begin(), arr.end(), 0);
 | 
					 | 
				
			||||||
        return static_cast<uint8_t>(sum / sz);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private:
 | 
					 | 
				
			||||||
      std::array<uint8_t, N> arr; /**< internal array used to store the values*/
 | 
					 | 
				
			||||||
      uint8_t sz;             /**< The current size of the array.*/
 | 
					 | 
				
			||||||
      uint8_t cap;            /**< Total capacity of the CircBuffer.*/
 | 
					 | 
				
			||||||
      uint8_t head;           /**< The current head of the CircBuffer*/
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class Battery {
 | 
					    class Battery {
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
      Battery();
 | 
					      Battery();
 | 
				
			||||||
@ -47,10 +15,7 @@ namespace Pinetime {
 | 
				
			|||||||
      void Update();
 | 
					      void Update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      uint8_t PercentRemaining() const {
 | 
					      uint8_t PercentRemaining() const {
 | 
				
			||||||
        auto avg = percentRemainingBuffer.GetAverage();
 | 
					        return percentRemaining;
 | 
				
			||||||
        avg = std::min(avg, static_cast<uint8_t>(100));
 | 
					 | 
				
			||||||
        avg = std::max(avg, static_cast<uint8_t>(0));
 | 
					 | 
				
			||||||
        return avg;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      uint16_t Voltage() const {
 | 
					      uint16_t Voltage() const {
 | 
				
			||||||
@ -69,14 +34,11 @@ namespace Pinetime {
 | 
				
			|||||||
      static Battery* instance;
 | 
					      static Battery* instance;
 | 
				
			||||||
      nrf_saadc_value_t saadc_value;
 | 
					      nrf_saadc_value_t saadc_value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      static constexpr uint8_t percentRemainingSamples = 5;
 | 
					 | 
				
			||||||
      CircBuffer<percentRemainingSamples> percentRemainingBuffer {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      static constexpr uint32_t chargingPin = 12;
 | 
					      static constexpr uint32_t chargingPin = 12;
 | 
				
			||||||
      static constexpr uint32_t powerPresentPin = 19;
 | 
					      static constexpr uint32_t powerPresentPin = 19;
 | 
				
			||||||
      static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;
 | 
					      static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;
 | 
				
			||||||
      uint16_t voltage = 0;
 | 
					      uint16_t voltage = 0;
 | 
				
			||||||
      int percentRemaining = -1;
 | 
					      uint8_t percentRemaining = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      bool isCharging = false;
 | 
					      bool isCharging = false;
 | 
				
			||||||
      bool isPowerPresent = false;
 | 
					      bool isPowerPresent = false;
 | 
				
			||||||
@ -87,7 +49,6 @@ namespace Pinetime {
 | 
				
			|||||||
      static void AdcCallbackStatic(nrfx_saadc_evt_t const* event);
 | 
					      static void AdcCallbackStatic(nrfx_saadc_evt_t const* event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      bool isReading = false;
 | 
					      bool isReading = false;
 | 
				
			||||||
      uint8_t samples = 0;
 | 
					 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user