lib_adc.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /***************************************************************
  2. *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
  3. *文件名: lib_timer.c
  4. *作 者: Liut
  5. *版 本: V1.00
  6. *日 期: 2017/07/14
  7. *描 述: ADC模块库函数
  8. *备 注: 适用于 ES8P508x芯片
  9. 本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
  10. ***************************************************************/
  11. #ifndef __LIBADC_H__
  12. #define __LIBADC_H__
  13. #include "ES8P508x.h"
  14. #include "type.h"
  15. /* 内部参考电压选择 */
  16. typedef enum {
  17. ADC_VREF_SEL_2_0 = 0, /* 内部参考电压2.048v*/
  18. ADC_VREF_SEL_1_6 = 1, /* 内部参考电压1.6v*/
  19. ADC_VREF_SEL_MAX = 1,
  20. }ADC_TYPE_VREF_SEL;
  21. /* ADC时钟源选择 */
  22. typedef enum
  23. {
  24. ADC_ClkS_PCLK = 0x0 , //时钟:PCLK
  25. ADC_ClkS_PLL = 0x1 , //时钟:PLL
  26. ADC_ClkS_32K = 0x2 , //时钟:ADCCLK(32KHZ)
  27. }ADC_TYPE_CLKS;
  28. /* ADC时钟源预分频 */
  29. typedef enum
  30. {
  31. ADC_ClkDiv_1 = 0x0 , //预分频:1:1
  32. ADC_ClkDiv_2 = 0x1 , //预分频:1:2
  33. ADC_ClkDiv_4 = 0x2 , //预分频:1:4
  34. ADC_ClkDiv_8 = 0x3 , //预分频:1:8
  35. ADC_ClkDiv_16 = 0x4 , //预分频:1:16
  36. ADC_ClkDiv_32 = 0x5 , //预分频:1:32
  37. ADC_ClkDiv_64 = 0x6 , //预分频:1:64
  38. ADC_ClkDiv_256 = 0x7 , //预分频:1:256
  39. }ADC_TYPE_CLKDIV;
  40. /* 正向参考电压选择 */
  41. typedef enum
  42. {
  43. ADC_VrefP_Vcc = 0x0 , //正向参考电压:VDD电压
  44. ADC_VrefP_Exter = 0x3 , //正向参考电压:外部参考电压
  45. }ADC_TYPE_VREFP;
  46. /* 采样模式选择 */
  47. typedef enum
  48. {
  49. ADC_SMPS_SOFT = 0, /* 软件控制 */
  50. ADC_SMPS_HARD = 1, /* 硬件控制 */
  51. }ADC_TYPE_SMPS;
  52. /* 转换速度选择 */
  53. typedef enum
  54. {
  55. ADC_ConvSpeed_Low = 0x0 , //AD转换速度:低速
  56. ADC_ConvSpeed_High = 0x1 , //AD转换速度:高速
  57. }ADC_TYPE_HSEN;
  58. /* ADC通道选择 */
  59. typedef enum
  60. {
  61. ADC_CHS_AIN0 = 0, /* 通道 0 */
  62. ADC_CHS_AIN1 = 1, /* 通道 1 */
  63. ADC_CHS_AIN2 = 2, /* 通道 2 */
  64. ADC_CHS_AIN3 = 3, /* 通道 3 */
  65. ADC_CHS_AIN4 = 4, /* 通道 4 */
  66. ADC_CHS_AIN5 = 5, /* 通道 5 */
  67. ADC_CHS_AIN6 = 6, /* 通道 6 */
  68. ADC_CHS_AIN7 = 7, /* 通道 7 */
  69. ADC_CHS_AIN8 = 8, /* 通道 8 */
  70. ADC_CHS_AIN9 = 9, /* 通道 9 */
  71. ADC_CHS_AIN10 = 10, /* 通道 10 */
  72. ADC_CHS_AIN11 = 11, /* 通道 11 */
  73. ADC_CHS_AIN12 = 12, /* 通道 12 */
  74. ADC_CHS_AIN13 = 13, /* 通道 13 */
  75. ADC_CHS_AIN14 = 14, /* 通道 14 */
  76. ADC_CHS_AIN15 = 15, /* 通道 15 */
  77. }ADC_TYPE_CHS;
  78. /*ADC core功耗选择位*/
  79. typedef enum
  80. {
  81. ADC_LP_86ua = 2, //ADC Core 功耗为86,推荐使用
  82. ADC_LP_215ua = 0, //ADC Core 功耗为215uA
  83. ADC_LP_120ua = 1, //ADC Core 功耗为120uA
  84. ADC_LP_70ua = 3, //ADC Core 功耗为70uA
  85. }ADC_TYPE_BUFLP;
  86. /*ADC 输入buff功耗选择位*/
  87. typedef enum
  88. {
  89. ADC_BUFF_0ua = 0, //ADC 输入buff功耗为0uA,推荐使用
  90. ADC_BUFF_34ua = 1, //ADC 输入buff功耗为34uA
  91. ADC_BUFF_95ua = 2, //ADC 输入buff功耗为95uA
  92. }ADC_TYPE_BUFEN;
  93. /* ADC IF 状态 */
  94. typedef enum
  95. {
  96. ADC_IF = 0x01,
  97. ADC_IF_ACPMIN = 0x02,
  98. ADC_IF_ACPMAX =0x04,
  99. ADC_IF_ACPOVER = 0x08,
  100. }ADC_TYPE_IF;
  101. /* ADC IE 状态 */
  102. typedef enum
  103. {
  104. ADC_IE = 0x01,
  105. ADC_IE_ACPMIN = 0x02,
  106. ADC_IE_ACPMAX =0x04,
  107. ADC_IE_ACPOVER = 0x08,
  108. }ADC_TYPE_IE;
  109. /* ADC初始化配置结构体定义 */
  110. typedef struct
  111. {
  112. ADC_TYPE_CLKS ADC_ClkS; //ADCCON1:bit3 ADC时钟源选择
  113. ADC_TYPE_CLKDIV ADC_ClkDiv; //ADCCON1:bit2-0 ADC时钟源预分频
  114. ADC_TYPE_VREFP ADC_VrefP; //ADCCON1:bit9-8 ADC正向参考电压选择
  115. ADC_TYPE_SMPS ADC_SampS; //ADCCON1:bit12 ADC采样模式选择
  116. ADC_TYPE_CHS ADC_ChS; //ADCCHS:bit0-3 ADC模拟通道选择
  117. //ADC_TYPE_VREF_SEL VREF_SEL; //参考电压选择
  118. uint8_t ST; //硬件采样时间 (当控制模式为硬件时设置) 0~31
  119. TYPE_FUNCEN ADC_VREFN; //负向参考电压选择位
  120. TYPE_FUNCEN ADC_VRBUF_EN;
  121. }ADC_InitStruType;
  122. /* 自动比较低阀值 选择*/
  123. typedef enum
  124. {
  125. ADC_ACP_MIN_MIN = 0x0, /* 容许的最小低阀值*/
  126. ADC_ACP_MIN_MAX = 0xfff, /* 容许的最大低阀值*/
  127. }ADC_TYPE_ACP_MIN;
  128. /* 自动比较高阀值 选择*/
  129. typedef enum
  130. {
  131. ADC_ACP_MAX_MIN = 0x0, /* 容许的最小高阀值*/
  132. ADC_ACP_MAX_MAX = 0xfff, /* 容许的最大高阀值*/
  133. }ADC_TYPE_ACP_MAX;
  134. /* 每次自动转换比较溢出时间选择 */
  135. typedef enum
  136. {
  137. ADC_ACPC_OVFL_TIME_MAX = 0x9c3, /* 容许的最大溢出时间 */
  138. }ADC_TYPE_ACPC_OVFL_TIME;
  139. /* 自动转换比较次数 */
  140. typedef enum
  141. {
  142. ADC_ACPC_TIMES_1 = 0, /* 1次 */
  143. ADC_ACPC_TIMES_2 = 1, /* 2次 */
  144. ADC_ACPC_TIMES_4 = 2, /* 4次 */
  145. ADC_ACPC_TIMES_8 = 3, /* 8次 */
  146. ADC_ACPC_TIMES_MAX = 3,
  147. }ADC_TYPE_ACPC_TIMES;
  148. /* ACP溢出时钟的时钟源 */
  149. typedef enum
  150. {
  151. ADC_ACPC_CLKS_PCLK = 0, /* PCLK */
  152. ADC_ACPC_CLKS_LRC = 1, /* LRC(32KHz) */
  153. }ADC_TYPE_ACPC_CLKS;
  154. typedef FuncState ADC_TYPE_CHOP_EN1, ADC_TYPE_CHOP_EN;
  155. typedef FuncState ADC_TYPE_VREF_EN,ADC_TYPE_IREF_EN;
  156. typedef FuncState ADC_TYPE_EN,ADC_TYPE_ACP_EN;
  157. /* 自动比较功能初始化结构体*/
  158. typedef struct
  159. {
  160. ADC_TYPE_ACP_EN ACP_EN; /* 自动比较功能使能位*/
  161. uint16_t ACPC_OVER_TIME; /* 单次自动比较溢出时间(即使不想设置请设置成0) 0~0x9c3 */
  162. ADC_TYPE_ACPC_TIMES ACPC_TIMES; /* 单次自动比较次数(优先级高于溢出时间) */
  163. uint16_t ACPC_MIN_TARGET; /* 平均值最低阀值 (设置0xfff关闭) 0~0xfff */
  164. uint16_t ACPC_MAX_TARGET; /* 平均值最高阀值 (设置0x0关闭) 0~0xfff */
  165. }ADC_ACP_TypeDef;
  166. /************ADC模块宏定义***********/
  167. /* ADC使能控制 */
  168. #define ADC_Enable() (ADC->CON0.EN = 0x1)
  169. #define ADC_Disable() (ADC->CON0.EN = 0x0)
  170. /* 自动比较功能使能*/
  171. #define ADC_ACP_Enable() (ADC->CON0.ACP_EN = 1)
  172. #define ADC_ACP_Disable() (ADC->CON0.ACP_EN = 0)
  173. /* ADC开始转换 */
  174. #define ADC_Start() (ADC->CON0.TRIG = 0x1)
  175. /* ADC采样软件控制 */
  176. #define ADC_SampStart() (ADC->CON1.SMPON = 0x1)
  177. #define ADC_SampStop() (ADC->CON1.SMPON = 0x0)
  178. /* ADC VDD检测控制 */
  179. #define ADC_VDD5_FLAG_Enable() (ADC->CHS.VDD5_FLAG_EN = 0x1)
  180. #define ADC_VDD5_FLAG_Disable() (ADC->CHS.VDD5_FLAG_EN = 0x0)
  181. /* ADC中断使能控制 */
  182. #define ADC_IE_Enable() (ADC->IE.IE = 0x1)
  183. #define ADC_IE_Disable() (ADC->IE.IE = 0x0)
  184. #define ADC_ACPMINIE_Enable() (ADC->IE.ACPMINIE = 1)
  185. #define ADC_ACPMINIE_Disable() (ADC->IE.ACPMINIE = 0)
  186. #define ADC_ACPMAXIE_Enable() (ADC->IE.ACPMAXIE = 1)
  187. #define ADC_ACPMAXIE_Disable() (ADC->IE.ACPMAXIE = 0)
  188. #define ADC_ACPOVIE_Enable() (ADC->IE.ACPOVIE = 1)
  189. #define ADC_ACPOVIE_Disable() (ADC->IE.ACPOVIE = 0)
  190. /************ADC模块函数声明***********/
  191. void ADC_Init(ADC_InitStruType * ADC_InitStruct);
  192. void ADC_Set_CH(ADC_TYPE_CHS AdcCH);
  193. uint16_t ADC_GetConvValue(void);
  194. FlagStatus ADC_GetConvStatus(void);
  195. ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct);
  196. ErrorStatus ADC_SoftStart(void);
  197. ErrorStatus ADC_SoftStop(void);
  198. uint16_t ADC_GetACPMeanValue(void);
  199. uint16_t ADC_GetACPMinValue(void);
  200. uint16_t ADC_GetACPMaxValue(void);
  201. FlagStatus ADC_GetFlagStatus(ADC_TYPE_IF IFName);
  202. ITStatus ADC_GetITStatus(ADC_TYPE_IE IEName);
  203. ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName);
  204. void ADC_Reset(void);
  205. #endif
  206. /*************************END OF FILE**********************/