adc.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "src/battery_data/battery.h"
  2. #include "src/peripherals/adc/adc.h"
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. #include "src/peripherals/adc/adc_interface.h"
  6. #include "src/interfaces/i2c_controller.h"
  7. #include "src/config.h"
  8. //static ADC_Params adc_params;
  9. static ADC_MeasurementState adc_state = ADC_STATE_CONFIGURE;
  10. uint16_t read_adc_channel(uint8_t slot, uint8_t channel) {
  11. //printf("Slot: %d, Channel: %d\n", slot, channel);
  12. ADC_Params adc_params= {0};
  13. uint16_t adc_voltage = 0;
  14. while (adc_state != ADC_STATE_DONE) {
  15. switch (adc_state) {
  16. case ADC_STATE_CONFIGURE:
  17. adc_params.channel = channel;
  18. adc_params.continuous = ADC_MEASUREMENT_IS_CONTINUOUS;
  19. adc_params.gain = 1;
  20. adc_params.resolution = 12;
  21. if (channel == 1 || channel == 2) {
  22. adc_params.factor = 1000;
  23. } else {
  24. adc_params.factor = 1;
  25. }
  26. //printf("Config: Memory address of batteries: %p\n", &batteries[0]);
  27. if (!adc_hal.configure(slot, &adc_params)) {
  28. return 0xffff;
  29. }
  30. if (adc_params.continuous != 1) {
  31. // in one shot mode we wait first to get the result
  32. adc_state = ADC_STATE_WAIT;
  33. } else {
  34. // in continuous mode we can directly read
  35. adc_state = ADC_STATE_READ;
  36. delay_cycles(ADC_CONTINUOUS_DELAY_CYCLES_VOLTAGES);
  37. }
  38. break;
  39. case ADC_STATE_WAIT:
  40. if(adc_hal.is_ready(slot, &adc_params)){
  41. adc_state = ADC_STATE_READ;
  42. }
  43. break;
  44. case ADC_STATE_READ:
  45. adc_voltage = adc_hal.read_voltage(slot, &adc_params);
  46. adc_state = ADC_STATE_DONE;
  47. break;
  48. default:
  49. channel = 0;
  50. adc_state = ADC_STATE_CONFIGURE;
  51. break;
  52. }
  53. }
  54. adc_state = ADC_STATE_CONFIGURE;
  55. return adc_voltage;
  56. }