You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

294 lines
9.3 KiB

4 years ago
  1. /*********************************************************
  2. *Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *: lib_adc.h
  4. * : AE Team
  5. * : V1.01
  6. * : 2021/06/09
  7. * : ADC模块库函数头文件
  8. * : 使
  9. **********************************************************/
  10. #ifndef __LIBADC_H__
  11. #define __LIBADC_H__
  12. #include "ES8P5066.h"
  13. #include "type.h"
  14. /* ADC转换使能 */
  15. #define ADC_EN_MASK (0x01 << 0)
  16. /* ADC转换状态位 */
  17. #define ADC_TRIG_MASK (0x01 << 1)
  18. /* 内部参考电压选择 */
  19. typedef enum
  20. {
  21. ADC_VREF_SEL_0 = 0, /* 内部参考电压2.048v*/
  22. ADC_VREF_SEL_MAX = 1,
  23. } ADC_TYPE_VREF_SEL;
  24. /* CHOP_CLK输入选择*/
  25. typedef enum
  26. {
  27. ADC_CHOP_CLK_SEL_1K = 0, /* 1K */
  28. ADC_CHOP_CLK_SEL_2K = 1, /* 2K */
  29. ADC_CHOP_CLK_SEL_4K = 2, /* 4K */
  30. ADC_CHOP_CLK_SEL_8K = 3, /* 8K */
  31. ADC_CHOP_CLK_SEL_16K = 4, /* 16K */
  32. ADC_CHOP_CLK_SEL_32K = 5, /* 32K */
  33. ADC_CHOP_CLK_SEL_MAX = 5,
  34. } ADC_TYPE_CHOP_CLK_SEL;
  35. /* 输出滤波时钟选择 */
  36. typedef enum
  37. {
  38. ADC_FILTERCLK_SEL_32K = 0, /* 输出滤波时钟 32K*/
  39. ADC_FILTERCLK_SEL_64K = 1, /* 输出滤波时钟 64K*/
  40. ADC_FILTERCLK_SEL_128K = 2, /* 输出滤波时钟 128K*/
  41. ADC_FILTERCLK_SEL_256K = 3, /* 输出滤波时钟 256K*/
  42. ADC_FILTERCLK_SEL_MAX = 3,
  43. } ADC_TYPE_FILTERCLK_SEL;
  44. /* CHOP CLK 时钟源预分频选择*/
  45. typedef enum
  46. {
  47. ADC_CHOP_CLK_DIV_1_1 = 0, /* 关闭 */
  48. ADC_CHOP_CLK_DIV_1_4 = 1, /* 1:4 */
  49. ADC_CHOP_CLK_DIV_1_8 = 2, /* 1:8 */
  50. ADC_CHOP_CLK_DIV_1_16 = 3, /* 1:16 */
  51. ADC_CHOP_CLK_DIV_1_32 = 4, /* 1:32 */
  52. ADC_CHOP_CLK_DIV_1_64 = 5, /* 1:64 */
  53. ADC_CHOP_CLK_DIV_1_128 = 6, /* 1:128 */
  54. ADC_CHOP_CLK_DIV_1_256 = 7, /* 1:256 */
  55. ADC_CHOP_CLK_DIV_MAX = 7,
  56. } ADC_TYPE_CHOP_CLK_DIV;
  57. typedef FuncState ADC_TYPE_CHOP_EN1, ADC_TYPE_CHOP_EN;
  58. typedef FuncState ADC_TYPE_VREF_EN, ADC_TYPE_IREF_EN;
  59. typedef FuncState ADC_TYPE_EN, ADC_TYPE_ACP_EN;
  60. /* A/D时钟源预分频选择 */
  61. typedef enum
  62. {
  63. ADC_CLKDIV_1_1 = 0, /* 1:1 */
  64. ADC_CLKDIV_1_2 = 1, /* 1:2 */
  65. ADC_CLKDIV_1_4 = 2, /* 1:4 */
  66. ADC_CLKDIV_1_8 = 3, /* 1:8 */
  67. ADC_CLKDIV_1_16 = 4, /* 1:16 */
  68. ADC_CLKDIV_1_32 = 5, /* 1:32 */
  69. ADC_CLKDIV_1_64 = 6, /* 1:64 */
  70. ADC_CLKDIV_1_256 = 7, /* 1:256 */
  71. ADC_CLKDIV_MAX = 7,
  72. } ADC_TYPE_CLKDIV;
  73. /* A/D时钟源选择 */
  74. typedef enum
  75. {
  76. ADC_CLKS_PCLK = 0, /* PCLK */
  77. ADC_CLKS_LRC = 1, /* LRC(32KHz) */
  78. ADC_CLKS_MAX = 1,
  79. } ADC_TYPE_CLKS;
  80. /* A/D分辨率选择位 */
  81. typedef enum
  82. {
  83. ADC_BITSEL_6 = 0, /* 6位分辨率 */
  84. ADC_BITSEL_8 = 1, /* 8位分辨率 */
  85. ADC_BITSEL_10 = 2, /* 10位分辨率 */
  86. ADC_BITSEL_12 = 3, /* 12位分辨率 */
  87. ADC_BITSEL_MAX = 3,
  88. } ADC_TYPE_BITSEL;
  89. /* A/D正向参考电压选择 */
  90. typedef enum
  91. {
  92. ADC_VREFP_VDD = 0, /* 选择芯片的工作电压VDD */
  93. ADC_VREFP_AVREFP = 1, /* 选择外部参考电压AVREFP,电压不能高于VDD,不能低于1.0V */
  94. ADC_VREFP_IO = 2, /* 选择内部参考电压VREFP */
  95. ADC_VREFP_VREF = 3, /* 选择内部参考电压VREFP */
  96. ADC_VREFP_MAX = 3,
  97. } ADC_TYPE_VREFP;
  98. /* A/D负向参考电压选择*/
  99. typedef enum
  100. {
  101. ADC_VREFN_VSS = 1, /* 内部地电压VSS */
  102. ADC_VREFN_MAX = 2,
  103. } ADC_TYPE_VREFN;
  104. /* A/D采样模式选择*/
  105. typedef enum
  106. {
  107. ADC_SMPS_SOFT = 0, /* 软件控制 */
  108. ADC_SMPS_HARD = 1, /* 硬件控制 */
  109. ADC_SMPS_MAX = 1,
  110. } ADC_TYPE_SMPS;
  111. /* A/D采样软件控制位*/
  112. typedef enum
  113. {
  114. ADC_SMPON_STOP = 0, /* 关闭AD采样 */
  115. ADC_SMPON_START = 1, /* 启动AD采样 */
  116. ADC_SMPON_MAX = 1,
  117. } ADC_TYPE_SMPON;
  118. /* A/D采样时间选择 (硬件控制有效)*/
  119. typedef enum
  120. {
  121. ADC_ST_MAX = 31, /* 容许的最大采样时间 */
  122. } ADC_TYPE_ST;
  123. typedef FuncState ADC_TYPE_VRBUF_EN, ADC_TYPE_HS_EN, ADC_TYPE_VCMBUF_EN, ADC_TYPE_VCMBUF_HS_EN;
  124. /* 自动比较低阀值 选择*/
  125. typedef enum
  126. {
  127. ADC_ACP_MIN_MIN = 0x0, /* 容许的最小低阀值*/
  128. ADC_ACP_MIN_MAX = 0xfff, /* 容许的最大低阀值*/
  129. } ADC_TYPE_ACP_MIN;
  130. /* 自动比较高阀值 选择*/
  131. typedef enum
  132. {
  133. ADC_ACP_MAX_MIN = 0x0, /* 容许的最小高阀值*/
  134. ADC_ACP_MAX_MAX = 0xfff, /* 容许的最大高阀值*/
  135. } ADC_TYPE_ACP_MAX;
  136. #if 0
  137. /* A/D转换速度控制位 */
  138. typedef enum
  139. {
  140. ADC_SPEED_LOW = 0, /* 低速 */
  141. ADC_SPEED_HIGH = 1, /* 高速 */
  142. ADC_SPEED_MAX = 1,
  143. } ADC_TYPE_SPEED;
  144. #endif
  145. /* A/D模拟通道选择位 */
  146. typedef enum
  147. {
  148. ADC_CHS_AIN0 = 0, /* 通道 0 */
  149. ADC_CHS_AIN1 = 1, /* 通道 1 */
  150. ADC_CHS_AIN2 = 2, /* 通道 2 */
  151. ADC_CHS_AIN3 = 3, /* 通道 3 */
  152. ADC_CHS_AIN4 = 4, /* 通道 4 */
  153. ADC_CHS_AIN5 = 5, /* 通道 5 */
  154. ADC_CHS_AIN6 = 6, /* 通道 6 */
  155. ADC_CHS_AIN7 = 7, /* 通道 7 */
  156. ADC_CHS_AIN8 = 8, /* 通道 8 */
  157. ADC_CHS_AIN9 = 9, /* 通道 9 */
  158. ADC_CHS_AIN10 = 10, /* 通道 10 */
  159. ADC_CHS_AIN11 = 11, /* 通道 11 */
  160. ADC_CHS_AIN12 = 12, /* 通道 12 */
  161. ADC_CHS_AIN13 = 13, /* 通道 13 */
  162. ADC_CHS_AIN14 = 14, /* 通道 14 */
  163. ADC_CHS_AIN15 = 15, /* 通道 15 */
  164. ADC_CHS_AIN16 = 16, /* 通道 16 */
  165. ADC_CHS_AIN17 = 17, /* 通道 17 */
  166. ADC_CHS_1_4_VDD = 18, /* 通道 18(1/4VDD) */
  167. ADC_CHS_AIN19 = 19, /* 通道 19 */
  168. ADC_CHS_MAX = 19, /* 通道 19 */
  169. } ADC_TYPE_CHS;
  170. typedef FuncState ADC_TYPE_INTR_EN, ADC_TYPE_ACP_MIN_INTR_EN, ADC_TYPE_ACP_MAX_INTR_EN, ADC_TYPE_ACP_OVER_INTR_EN;
  171. /* 每次自动转换比较溢出时间选择 */
  172. typedef enum
  173. {
  174. ADC_ACPC_OVFL_TIME_MAX = 0x9c3, /* 容许的最大溢出时间 */
  175. } ADC_TYPE_ACPC_OVFL_TIME;
  176. /* 自动转换比较次数 */
  177. typedef enum
  178. {
  179. ADC_ACPC_TIMES_1 = 0, /* 1次 */
  180. ADC_ACPC_TIMES_2 = 1, /* 2次 */
  181. ADC_ACPC_TIMES_4 = 2, /* 4次 */
  182. ADC_ACPC_TIMES_8 = 3, /* 8次 */
  183. ADC_ACPC_TIMES_MAX = 3,
  184. } ADC_TYPE_ACPC_TIMES;
  185. /* ACP溢出时钟的时钟源 */
  186. typedef enum
  187. {
  188. ADC_ACPC_CLKS_PCLK = 0, /* PCLK */
  189. ADC_ACPC_CLKS_LRC = 1, /* LRC(32KHz) */
  190. ADC_ACPC_CLKS_MAX = 1,
  191. } ADC_TYPE_ACPC_CLKS;
  192. typedef enum
  193. {
  194. ADC_IF = 0x01,
  195. ADC_IF_ACPMIN = 0x02,
  196. ADC_IF_ACPMAX = 0x04,
  197. ADC_IF_ACPOVER = 0x08,
  198. } ADC_TYPE_IF;
  199. /* ADC IE 状态 */
  200. typedef enum
  201. {
  202. ADC_IE = 0x01,
  203. ADC_IE_ACPMIN = 0x02,
  204. ADC_IE_ACPMAX = 0x04,
  205. ADC_IE_ACPOVER = 0x08,
  206. } ADC_TYPE_IE;
  207. /* ADC 初始化结构体 */
  208. typedef struct
  209. {
  210. ADC_TYPE_CLKS CLKS; /* ADC时钟选择 */
  211. ADC_TYPE_CLKDIV CLKDIV; /* ADC 预分频 */
  212. ADC_TYPE_VREF_SEL VREF_SEL; /* 参考电压选择 */
  213. ADC_TYPE_VREFP VREFP; /* 参考电压类型选择 */
  214. ADC_TYPE_VREFN VREFN;
  215. ADC_TYPE_CHS CHS; /* 模拟通道选择 */
  216. ADC_TYPE_SMPS SMPS; /* 控制模式选择 */
  217. ADC_TYPE_BITSEL BITSEL; /* 分辨率选择 */
  218. uint8_t ST; /* 硬件采样时间 (当控制模式为硬件时设置) 0~31*/
  219. } ADC_InitStruType;
  220. /* 自动比较功能初始化结构体*/
  221. typedef struct
  222. {
  223. ADC_TYPE_ACP_EN ACP_EN; /* 自动比较功能使能位*/
  224. uint16_t ACPC_OVER_TIME; /* 单次自动比较溢出时间(即使不想设置请设置成0) 0~0x9c3 */
  225. ADC_TYPE_ACPC_TIMES ACPC_TIMES; /* 单次自动比较次数(优先级高于溢出时间) */
  226. uint16_t ACPC_MIN_TARGET; /* 平均值最低阀值 (设置0xfff关闭) 0~0xfff */
  227. uint16_t ACPC_MAX_TARGET; /* 平均值最高阀值 (设置0x0关闭) 0~0xfff */
  228. } ADC_ACP_TypeDef;
  229. #define ADC_Enable() (ADC->CON0.Word |= ADC_EN_MASK)
  230. #define ADC_Disable() (ADC->CON0.Word &= (~ADC_EN_MASK))
  231. #define ADC_CHOPEN_EN() (ADC->VREFCON.CHOP_EN = 0x01UL)
  232. #define ADC_CHOPEN_DIS()(ADC->VREFCON.CHOP_EN = 0x00UL)
  233. /* 自动比较功能使能*/
  234. #define ADC_ACP_Enable() (ADC->CON0.ACP_EN = 0x01UL)
  235. #define ADC_ACP_Disable() (ADC->CON0.ACP_EN = 0x00UL)
  236. #define ADC_IE_Enable() (ADC ->IE.IE = 1)
  237. #define ADC_IE_Disable() (ADC ->IE.IE = 0)
  238. #define ADC_ACPMINIE_Enable() (ADC ->IE.ACPMINIE = 1)
  239. #define ADC_ACPMINIE_Disable() (ADC ->IE.ACPMINIE = 0)
  240. #define ADC_ACPMAXIE_Enable() (ADC ->IE.ACPMAXIE = 1)
  241. #define ADC_ACPMAXIE_Disable() (ADC ->IE.ACPMAXIE = 0)
  242. #define ADC_ACPOVIE_Enable() (ADC ->IE.ACPOVIE = 1)
  243. #define ADC_ACPOVIE_Disable() (ADC ->IE.ACPOVIE = 0)
  244. /********************* ADC模块函数声明 *********************/
  245. ErrorStatus ADC_Init(ADC_InitStruType *ADC_InitStruct);
  246. ErrorStatus ADC_ACPConfig(ADC_ACP_TypeDef *ADC_ACP_InitStruct);
  247. ErrorStatus ADC_Start(void);
  248. ErrorStatus ADC_SoftStart(void);
  249. ErrorStatus ADC_SoftStop(void);
  250. uint16_t ADC_GetConvValue(void);
  251. FlagStatus ADC_GetConvStatus(void);
  252. uint16_t ADC_GetACPMeanValue(void);
  253. ITStatus ADC_GetIFStatus(ADC_TYPE_IF IFName);
  254. ITStatus ADC_GetIEStatus(ADC_TYPE_IE IEName);
  255. ErrorStatus ADC_ClearIFStatus(ADC_TYPE_IF IFName);
  256. void ADC_Reset(void);
  257. #endif