找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3102|回复: 0
收起左侧

stm32学习之adc驱动

[复制链接]
ID:80436 发表于 2015-5-21 23:21 | 显示全部楼层 |阅读模式
  1. /*******************************************************************************************************
  2. 文件名称:ADC驱动

  3. 编写版本:V0.1
  4. 编写日期:2012.10.25
  5. ********************************************************************************************************/
  6. #include "ADC.h"

  7. char adcRunFlag=0;

  8. void AD_GPIO(void)
  9. {
  10. GPIO_InitTypeDef GPIO_InitStructure;
  11. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  14.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  17.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  18. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  19.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  20.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //PB9输出
  22.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  23.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  24. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //PE0,1输出
  25.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  27. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  28. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //PD7扩展板之舵机部分
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30. GPIO_Init(GPIOD, &GPIO_InitStructure);
  31. //所有其他悬空IO口设为下拉输入
  32. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;        //PA14
  33. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  34. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35. GPIO_Init(GPIOA, &GPIO_InitStructure);
  36. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9;        //PB8,9
  37. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  38. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  39. GPIO_Init(GPIOB, &GPIO_InitStructure);
  40. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;       
  41. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //PC10,14,15
  42. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  43. GPIO_Init(GPIOC, &GPIO_InitStructure);
  44. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  45. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //PD0~7
  46. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47. GPIO_Init(GPIOD, &GPIO_InitStructure);
  48. GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;        //PE0,1
  49. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  50. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  51. GPIO_Init(GPIOE, &GPIO_InitStructure);
  52. }

  53. void AD_Init(void)
  54. {
  55. AD_GPIO();
  56. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  57. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, DISABLE);

  58. /* ADC1 configuration ------------------------------------------------------*/
  59. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  60. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  61. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  62. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  63. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  64. ADC_InitStructure.ADC_NbrOfChannel = 1;
  65. ADC_Init(ADC1, &ADC_InitStructure);
  66. /* Enable ADC1 */
  67. ADC_Cmd(ADC1, ENABLE);
  68. /* Enable ADC1 reset calibaration register */   
  69. ADC_ResetCalibration(ADC1);
  70. /* Check the end of ADC1 reset calibration register */
  71. while(ADC_GetResetCalibrationStatus(ADC1));
  72. /* Start ADC1 calibaration */
  73. ADC_StartCalibration(ADC1);
  74. /* Check the end of ADC1 calibration */
  75. while(ADC_GetCalibrationStatus(ADC1));
  76. /* Start ADC1 Software Conversion */
  77. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  78. difCount=3;
  79. ExtendPort  = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);
  80. ExtendServo = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7);
  81. }                                                               

  82. int AD_Get(u8 channel)
  83. {
  84. int count;
  85. int ADC1ConvertedValue;
  86. GPIO_InitTypeDef GPIO_InitStructure;
  87. adcRunFlag++;
  88. if((channel==14)&&(StateEx1))
  89. {
  90. StateEx1=0;
  91. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  92. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  93. GPIO_Init(GPIOC, &GPIO_InitStructure);
  94. }
  95. if((channel==15)&&(StateEx2))
  96. {       
  97. StateEx2=0;
  98. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  99. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  100. GPIO_Init(GPIOC, &GPIO_InitStructure);
  101. }
  102. /* ADC1 regular channels configuration */     
  103. ADC_RegularChannelConfig(ADC1, ChannelArr[channel], 1, ADC_SampleTime_71Cycles5);
  104. ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
  105. ADC_Cmd(ADC1, ENABLE);
  106. count=0;
  107. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
  108. {
  109. count++;
  110. if(count==100)
  111. {
  112. adcRunFlag=0;
  113. return ADCLast;
  114. }
  115. }
  116. ADC1ConvertedValue = ADC_GetConversionValue(ADC1);
  117. ADCLast=ADC1ConvertedValue;
  118. adcRunFlag--;
  119. return ADC1ConvertedValue;
  120. }

  121. int analog(u8 port)        //1~12,13~20,21~28
  122. {
  123. if(port<1||port>36)
  124. return -1;
  125. else
  126. {       
  127. if(port<13)        //AD1-12
  128. {
  129. return AD_Get(port);
  130. }
  131. else if(port<21)        //13-20没有AD功能       
  132. {
  133. return -1;
  134. }
  135. else if(port<29)        //AD21-28
  136. {
  137. if(ExtendPort)
  138. {
  139. //4051选择
  140. Select4051(port-21);
  141. return AD_Get(15);
  142. }
  143. else
  144. {
  145. return -1;
  146. }
  147. }
  148. else if(port<37)        //AD29-36
  149. {
  150. if(ExtendPort)
  151. {
  152. //4051选择
  153. Select4051(port-29);
  154. return AD_Get(14);
  155. }
  156. else
  157. {
  158. return -1;
  159. }
  160. }
  161. else
  162. {
  163. return -1;
  164. }
  165. }
  166. }

  167. int battery(void)
  168. {
  169. return AD_Get(16);
  170. }

  171. void Select4051(u8 ch)
  172. {       
  173. switch(ch)
  174. {
  175. case 0:
  176. Set4051A();
  177. Clr4051B();
  178. Set4051C();
  179. break;
  180. case 1:
  181. Set4051A();
  182. Set4051B();
  183. Set4051C();
  184. break;
  185. case 2:
  186. Clr4051A();
  187. Clr4051B();
  188. Set4051C();
  189. break;
  190. case 3:
  191. Clr4051A();
  192. Set4051B();
  193. Set4051C();
  194. break;
  195. case 4:
  196. Clr4051A();
  197. Clr4051B();
  198. Clr4051C();
  199. break;
  200. case 5:
  201. Set4051A();
  202. Set4051B();
  203. Clr4051C();
  204. break;
  205. case 6:
  206. Set4051A();
  207. Clr4051B();
  208. Clr4051C();
  209. break;
  210. case 7:
  211. Clr4051A();
  212. Set4051B();
  213. Clr4051C();
  214. break;
  215. default:
  216. break;
  217. }
  218. }

  219. void SysTick_Handler_bat_callback(void)
  220. {
  221. if(battery()<2300)
  222. LED_R(1);
  223. else
  224. LED_R(0);
  225. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表