adc.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /* 包含头文件-----------------------------------------------------------------*/
  2. #include "adc.h"
  3. /* 私有宏定义-----------------------------------------------------------------*/
  4. /* ADC1/2输入通道的引脚定义
  5. ADC_IN0 PA0
  6. ADC_IN1 PA1
  7. ADC_IN2 PA2
  8. ADC_IN3 PA3
  9. ADC_IN4 PA4
  10. ADC_IN5 PA5
  11. ADC_IN6 PA6
  12. ADC_IN7 PA7
  13. ADC_IN8 PB0
  14. ADC_IN9 PB1
  15. */
  16. /* 私有类型定义---------------------------------------------------------------*/
  17. /* 私有变量-------------------------------------------------------------------*/
  18. /* 全局变量-------------------------------------------------------------------*/
  19. /* 私有函数原型---------------------------------------------------------------*/
  20. /**
  21. * @brief ADC1初始化
  22. * @note io初始化部分需用户自行修改
  23. * @param None
  24. * @retval None
  25. */
  26. void adc1_config(void)
  27. {
  28. ADC_InitTypeDef ADC_InitStructure;
  29. GPIO_InitTypeDef GPIO_InitStructure;
  30. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* 打开ADC时钟 */
  31. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* 打开GPIO时钟 */
  32. /* ADC输入引脚的GPIO配置 */
  33. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* 设置引脚号 */
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 模拟输入 */
  35. GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
  36. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 设置引脚号 */
  37. // GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
  38. ADC_DeInit(ADC1);
  39. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* ADC模式 只用到ADC1时为单模式 */
  40. ADC_InitStructure.ADC_ScanConvMode = DISABLE; /* 扫描模式 是否从头到尾扫描ADC规则组内所有通道 */
  41. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* 连续转换模式 转换完组内最后一个通道时是否重头再来 */
  42. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 外部触发模式 软件触发 */
  43. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换结果对齐方式 右对齐 */
  44. ADC_InitStructure.ADC_NbrOfChannel = 1; /* 规则组内需转换的通道数目 */
  45. ADC_Init(ADC1, &ADC_InitStructure); /* 初始化ADC */
  46. ADC_Cmd(ADC1, ENABLE); /* 开启ADC */
  47. ADC_ResetCalibration(ADC1); // 初始化ADC校准寄存器
  48. while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准寄存器初始化完成
  49. ADC_StartCalibration(ADC1); // ADC开始校准
  50. while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
  51. }
  52. /**
  53. * @brief ADC2初始化
  54. * @note io初始化部分需用户自行修改
  55. * @param None
  56. * @retval None
  57. */
  58. void adc2_config(void)
  59. {
  60. ADC_InitTypeDef ADC_InitStructure;
  61. GPIO_InitTypeDef GPIO_InitStructure;
  62. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); /* 打开ADC时钟 */
  63. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* 打开GPIO时钟 */
  64. /* ADC输入引脚的GPIO配置 */
  65. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /* 设置引脚号 */
  66. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; /* 设置引脚模式 */
  67. GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化GPIO */
  68. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 设置引脚号 */
  69. // GPIO_Init(GPIOB, &GPIO_InitStructure); /* 初始化GPIO */
  70. ADC_DeInit(ADC2);
  71. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; /* ADC模式 只用到ADC1时为单模式 */
  72. ADC_InitStructure.ADC_ScanConvMode = DISABLE; /* 扫描模式 是否从头到尾扫描ADC规则组内所有通道 */
  73. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /* 连续转换模式 转换完组内最后一个通道时是否重头再来 */
  74. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 外部触发模式 软件触发 */
  75. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /* 转换结果对齐方式 右对齐 */
  76. ADC_InitStructure.ADC_NbrOfChannel = 1; /* 规则组内需转换的通道数目 */
  77. ADC_Init(ADC2, &ADC_InitStructure); /* 初始化ADC */
  78. ADC_Cmd(ADC2, ENABLE); /* 开启ADC */
  79. ADC_ResetCalibration(ADC2); // 初始化ADC校准寄存器
  80. while(ADC_GetResetCalibrationStatus(ADC2)); // 等待校准寄存器初始化完成
  81. ADC_StartCalibration(ADC2); // ADC开始校准
  82. while(ADC_GetCalibrationStatus(ADC2)); // 等待校准完成
  83. }
  84. /**
  85. * @brief 读取ADC1输入通道转换结果
  86. * @param chx : adc输入通道 @ref adc_input_chx
  87. * @arg ADC_IN0 : 输入通道0 PA0
  88. * @arg ADC_IN1 : 输入通道1 PA1
  89. * @arg ADC_IN2 : 输入通道2 PA2
  90. * @arg ADC_IN3 : 输入通道3 PA3
  91. * @arg ADC_IN4 : 输入通道4 PA4
  92. * @arg ADC_IN5 : 输入通道5 PA5
  93. * @arg ADC_IN6 : 输入通道6 PA6
  94. * @arg ADC_IN7 : 输入通道7 PA7
  95. * @arg ADC_IN8 : 输入通道8 PB0
  96. * @arg ADC_IN9 : 输入通道9 PB1
  97. * @retval 返回转换结果
  98. */
  99. uint16_t adc1_get_conv_val(uint8_t chx)
  100. {
  101. uint16_t val;
  102. /* 设置规则组通道 转换顺序和采样时间 */
  103. ADC_RegularChannelConfig(ADC1, chx, 1, ADC_SampleTime_55Cycles5);
  104. ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 使能软件启动转换 */
  105. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 等待转换完成 */
  106. val = ADC_GetConversionValue(ADC1); /* 获取转换结果 */
  107. return val;
  108. }
  109. /**
  110. * @brief 读取ADC2输入通道转换结果
  111. * @param chx : adc输入通道 @ref adc_input_chx
  112. * @arg ADC_IN0 : 输入通道0 PA0
  113. * @arg ADC_IN1 : 输入通道1 PA1
  114. * @arg ADC_IN2 : 输入通道2 PA2
  115. * @arg ADC_IN3 : 输入通道3 PA3
  116. * @arg ADC_IN4 : 输入通道4 PA4
  117. * @arg ADC_IN5 : 输入通道5 PA5
  118. * @arg ADC_IN6 : 输入通道6 PA6
  119. * @arg ADC_IN7 : 输入通道7 PA7
  120. * @arg ADC_IN8 : 输入通道8 PB0
  121. * @arg ADC_IN9 : 输入通道9 PB1
  122. * @retval 返回转换结果
  123. */
  124. uint16_t adc2_get_conv_val(uint8_t chx)
  125. {
  126. uint16_t val;
  127. /* 设置规则组通道 转换顺序和采样时间 */
  128. ADC_RegularChannelConfig(ADC2, chx, 1, ADC_SampleTime_55Cycles5);
  129. ADC_SoftwareStartConvCmd(ADC2, ENABLE); /* 使能软件启动转换 */
  130. while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)); /* 等待转换完成 */
  131. val = ADC_GetConversionValue(ADC2); /* 获取转换结果 */
  132. return val;
  133. }
  134. /**
  135. * @brief 读取ADC1输入通道转换结果的平均值
  136. * @param chx : adc输入通道 @ref adc_input_chx
  137. * @arg ADC_IN0 : 输入通道0 PA0
  138. * @arg ADC_IN1 : 输入通道1 PA1
  139. * @arg ADC_IN2 : 输入通道2 PA2
  140. * @arg ADC_IN3 : 输入通道3 PA3
  141. * @arg ADC_IN4 : 输入通道4 PA4
  142. * @arg ADC_IN5 : 输入通道5 PA5
  143. * @arg ADC_IN6 : 输入通道6 PA6
  144. * @arg ADC_IN7 : 输入通道7 PA7
  145. * @arg ADC_IN8 : 输入通道8 PB0
  146. * @arg ADC_IN9 : 输入通道9 PB1
  147. * @param num : 多少次转换结果求平均
  148. * @retval 返回转换结果的平均值
  149. */
  150. uint16_t adc1_get_average_val(uint8_t chx, uint16_t num)
  151. {
  152. uint16_t tmp = num;
  153. uint32_t val = 0;
  154. /* 设置规则组通道 转换顺序和采样时间 */
  155. ADC_RegularChannelConfig(ADC1, chx, 1, ADC_SampleTime_55Cycles5);
  156. while(tmp--)
  157. {
  158. ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 使能软件启动转换 */
  159. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 等待转换完成 */
  160. val += ADC_GetConversionValue(ADC1); /* 获取转换结果 */
  161. }
  162. val = val / num;
  163. return val;
  164. }
  165. /**
  166. * @brief 读取ADC2输入通道转换结果的平均值
  167. * @param chx : adc输入通道 @ref adc_input_chx
  168. * @arg ADC_IN0 : 输入通道0 PA0
  169. * @arg ADC_IN1 : 输入通道1 PA1
  170. * @arg ADC_IN2 : 输入通道2 PA2
  171. * @arg ADC_IN3 : 输入通道3 PA3
  172. * @arg ADC_IN4 : 输入通道4 PA4
  173. * @arg ADC_IN5 : 输入通道5 PA5
  174. * @arg ADC_IN6 : 输入通道6 PA6
  175. * @arg ADC_IN7 : 输入通道7 PA7
  176. * @arg ADC_IN8 : 输入通道8 PB0
  177. * @arg ADC_IN9 : 输入通道9 PB1
  178. * @param num : 多少次转换结果求平均
  179. * @retval 返回转换结果的平均值
  180. */
  181. uint16_t adc2_get_average_val(uint8_t chx, uint16_t num)
  182. {
  183. uint16_t tmp = num;
  184. uint32_t val = 0;
  185. /* 设置规则组通道 转换顺序和采样时间 */
  186. ADC_RegularChannelConfig(ADC2, chx, 1, ADC_SampleTime_55Cycles5);
  187. while(tmp--)
  188. {
  189. ADC_SoftwareStartConvCmd(ADC2, ENABLE); /* 使能软件启动转换 */
  190. while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)); /* 等待转换完成 */
  191. val += ADC_GetConversionValue(ADC2); /* 获取转换结果 */
  192. }
  193. val = val / num;
  194. return val;
  195. }