adc.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-05-07 aozima the first version
  9. * 2018-11-16 Ernest Chen add finsh command and update adc function
  10. * 2022-05-11 Stanley Lwin add finsh voltage conversion command
  11. */
  12. #ifndef __ADC_H__
  13. #define __ADC_H__
  14. #include <rtthread.h>
  15. /**
  16. * @addtogroup group_Drivers RTTHREAD Driver
  17. * @defgroup group_ADC ADC
  18. *
  19. * @brief ADC driver api
  20. *
  21. * <b>Example</b>
  22. * @code {.c}
  23. * #define ADC_DEV_NAME "adc1"
  24. * #define ADC_DEV_CHANNEL 5
  25. * #define REFER_VOLTAGE 330
  26. * #define CONVERT_BITS (1 << 12)
  27. *
  28. * static int adc_vol_sample(int argc, char *argv[])
  29. * {
  30. * rt_adc_device_t adc_dev;
  31. * rt_uint32_t value, vol;
  32. *
  33. * rt_err_t ret = RT_EOK;
  34. *
  35. * adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
  36. * if (adc_dev == RT_NULL)
  37. * {
  38. * rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
  39. * return -RT_ERROR;
  40. * }
  41. *
  42. * ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
  43. *
  44. * value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
  45. * rt_kprintf("the value is :%d \n", value);
  46. *
  47. * vol = value * REFER_VOLTAGE / CONVERT_BITS;
  48. * rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
  49. *
  50. * ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);
  51. *
  52. * return ret;
  53. * }
  54. * MSH_CMD_EXPORT(adc_vol_sample, adc voltage convert sample);
  55. *
  56. * @endcode
  57. *
  58. * @ingroup group_Drivers
  59. */
  60. /*!
  61. * @addtogroup group_ADC
  62. * @{
  63. */
  64. #define RT_ADC_INTERN_CH_TEMPER (-1)
  65. #define RT_ADC_INTERN_CH_VREF (-2)
  66. #define RT_ADC_INTERN_CH_VBAT (-3)
  67. struct rt_adc_device;
  68. /**
  69. * @brief Configure the adc device
  70. */
  71. struct rt_adc_ops
  72. {
  73. rt_err_t (*enabled)(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled);
  74. rt_err_t (*convert)(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value);
  75. rt_uint8_t (*get_resolution)(struct rt_adc_device *device);
  76. rt_int16_t (*get_vref) (struct rt_adc_device *device);
  77. };
  78. /**
  79. * @brief adc device
  80. */
  81. struct rt_adc_device
  82. {
  83. struct rt_device parent;
  84. const struct rt_adc_ops *ops;
  85. };
  86. typedef struct rt_adc_device *rt_adc_device_t;
  87. typedef enum
  88. {
  89. RT_ADC_CMD_ENABLE = RT_DEVICE_CTRL_BASE(ADC) + 1,
  90. RT_ADC_CMD_DISABLE = RT_DEVICE_CTRL_BASE(ADC) + 2,
  91. RT_ADC_CMD_GET_RESOLUTION = RT_DEVICE_CTRL_BASE(ADC) + 3, /* get the resolution in bits */
  92. RT_ADC_CMD_GET_VREF = RT_DEVICE_CTRL_BASE(ADC) + 4, /* get reference voltage */
  93. } rt_adc_cmd_t;
  94. /**
  95. * @brief register the adc device
  96. * @param adc adc device
  97. * @param name device name
  98. * @param ops device ops
  99. * @param user_data device private data
  100. * @return rt_err_t error code
  101. * @ingroup group_ADC
  102. */
  103. rt_err_t rt_hw_adc_register(rt_adc_device_t adc,const char *name, const struct rt_adc_ops *ops, const void *user_data);
  104. /**
  105. * @brief read the adc value
  106. * @param dev adc device
  107. * @param channel adc channel
  108. * @return rt_uint32_t adc value
  109. * @ingroup group_ADC
  110. */
  111. rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_int8_t channel);
  112. /**
  113. * @brief enable the adc channel
  114. * @param dev adc device
  115. * @param channel adc channel
  116. * @return rt_err_t error code
  117. * @ingroup group_ADC
  118. */
  119. rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_int8_t channel);
  120. /**
  121. * @brief disable the adc channel
  122. * @param dev adc device
  123. * @param channel adc channel
  124. * @return rt_err_t error code
  125. * @ingroup group_ADC
  126. */
  127. rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_int8_t channel);
  128. /**
  129. * @brief get the adc resolution
  130. * @param dev adc device
  131. * @param channel adc channel
  132. * @return rt_int16_t adc resolution
  133. * @ingroup group_ADC
  134. */
  135. rt_int16_t rt_adc_voltage(rt_adc_device_t dev, rt_int8_t channel);
  136. /*! @}*/
  137. #endif /* __ADC_H__ */