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