hal_adc_interface.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "driver.h"
  2. #include <linux/types.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "com_gpio.h"
  6. #include "hal_interface_api.h"
  7. #include "linux/fcntl.h"
  8. #include "time.h"
  9. #include <unistd.h>
  10. #define DEV_NAME "/dev/adc1"
  11. /*
  12. channel: 1,2,3,4,5,6,7
  13. */
  14. int stm32_adc_get_value(uint8_t channel, uint16_t *value)
  15. {
  16. int fd;
  17. int ret;
  18. adc_arg_t adc_arg;
  19. uint16_t max_val, min_val;
  20. uint32_t sum = 0;
  21. int i;
  22. if((channel < 1) || (channel > 7))
  23. {
  24. printf("Invalid adc channel %d.\n", channel);
  25. return -1;
  26. }
  27. fd = open(DEV_NAME, O_RDWR);
  28. if(fd == -1)
  29. {
  30. printf("Open %s failed!\n", DEV_NAME);
  31. }
  32. adc_arg.channel = channel;
  33. ret = ioctl(fd, ADC_GET_RESULT, &adc_arg);
  34. if(ret == -1)
  35. {
  36. printf("Adc get result failed!\n");
  37. }
  38. close(fd);
  39. //get the max value
  40. max_val = adc_arg.value[0];
  41. for(i=1;i<10;i++)
  42. {
  43. if(max_val < adc_arg.value[i])
  44. {
  45. max_val = adc_arg.value[i];
  46. }
  47. }
  48. //get the min value
  49. min_val = adc_arg.value[0];
  50. for(i=1;i<10;i++)
  51. {
  52. if(min_val > adc_arg.value[i])
  53. {
  54. min_val = adc_arg.value[i];
  55. }
  56. }
  57. //get sum
  58. sum = 0;
  59. for(i=0;i<10;i++)
  60. {
  61. sum += adc_arg.value[i];
  62. }
  63. //remove max_value and min_value
  64. sum = sum - max_val - min_val;
  65. *value = sum/8;
  66. // printf("value: ");
  67. // for(i=0;i<10;i++)
  68. // printf("%d ", adc_arg.value[i]);
  69. // printf("\nmax_value: %d, min_value: %d, sum: %d, average: %d\n", max_val, min_val, sum, *value);
  70. return ret;
  71. }