adc.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. * @defgroup group_ADC ADC
  17. * @brief ADC driver api
  18. * @ingroup group_device_driver
  19. *
  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. /*!
  59. * @addtogroup group_ADC
  60. * @{
  61. */
  62. #define RT_ADC_INTERN_CH_TEMPER (-1)
  63. #define RT_ADC_INTERN_CH_VREF (-2)
  64. #define RT_ADC_INTERN_CH_VBAT (-3)
  65. struct rt_adc_device;
  66. /**
  67. * @brief Configure the adc device
  68. */
  69. struct rt_adc_ops
  70. {
  71. rt_err_t (*enabled)(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled);
  72. rt_err_t (*convert)(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value);
  73. rt_uint8_t (*get_resolution)(struct rt_adc_device *device);
  74. rt_int16_t (*get_vref) (struct rt_adc_device *device);
  75. };
  76. /**
  77. * @brief adc device
  78. */
  79. struct rt_adc_device
  80. {
  81. struct rt_device parent;
  82. const struct rt_adc_ops *ops;
  83. };
  84. typedef struct rt_adc_device *rt_adc_device_t;
  85. typedef enum
  86. {
  87. RT_ADC_CMD_ENABLE = RT_DEVICE_CTRL_BASE(ADC) + 1,
  88. RT_ADC_CMD_DISABLE = RT_DEVICE_CTRL_BASE(ADC) + 2,
  89. RT_ADC_CMD_GET_RESOLUTION = RT_DEVICE_CTRL_BASE(ADC) + 3, /* get the resolution in bits */
  90. RT_ADC_CMD_GET_VREF = RT_DEVICE_CTRL_BASE(ADC) + 4, /* get reference voltage */
  91. } rt_adc_cmd_t;
  92. /**
  93. * @brief register the adc device
  94. * @param adc adc device
  95. * @param name device name
  96. * @param ops device ops
  97. * @param user_data device private data
  98. * @return rt_err_t error code
  99. * @ingroup group_ADC
  100. */
  101. 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);
  102. /**
  103. * @brief read the adc value
  104. * @param dev adc device
  105. * @param channel adc channel
  106. * @return rt_uint32_t adc value
  107. * @ingroup group_ADC
  108. */
  109. rt_uint32_t rt_adc_read(rt_adc_device_t dev, rt_int8_t channel);
  110. /**
  111. * @brief enable the adc channel
  112. * @param dev adc device
  113. * @param channel adc channel
  114. * @return rt_err_t error code
  115. * @ingroup group_ADC
  116. */
  117. rt_err_t rt_adc_enable(rt_adc_device_t dev, rt_int8_t channel);
  118. /**
  119. * @brief disable the adc channel
  120. * @param dev adc device
  121. * @param channel adc channel
  122. * @return rt_err_t error code
  123. * @ingroup group_ADC
  124. */
  125. rt_err_t rt_adc_disable(rt_adc_device_t dev, rt_int8_t channel);
  126. /**
  127. * @brief get the adc resolution
  128. * @param dev adc device
  129. * @param channel adc channel
  130. * @return rt_int16_t adc resolution
  131. * @ingroup group_ADC
  132. */
  133. rt_int16_t rt_adc_voltage(rt_adc_device_t dev, rt_int8_t channel);
  134. /*! @}*/
  135. #endif /* __ADC_H__ */