adc.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /******************** (C) COPYRIGHT 2013 CEPARK多功能开发学习板********************
  2. * 文件名 :adc.c
  3. * 描述 :ADC值应用函数库
  4. * 实验平台:CEPARK多功能开发学习板
  5. * 硬件连接:----------------------------------------------------
  6. * | |
  7. * | PA0 - JP25 连接外部电压(通过一个滑动变阻器分压而来)|
  8. * | J1需短接 |
  9. * | |
  10. * ----------------------------------------------------
  11. * 库版本 :ST3.5.0
  12. **********************************************************************************/
  13. #include "adc.h"
  14. #define ADC1_DR_Address ((u32)0x4001244C)
  15. __IO u16 ADC_ConvertedValue;
  16. /*
  17. * 函数名:ADC1_GPIO_Config
  18. * 描述 :使能ADC1的时钟,初始化PA.01
  19. * 输入 : 无
  20. * 输出 :无
  21. * 调用 :内部调用
  22. */
  23. static void ADC1_GPIO_Config(void)
  24. {
  25. GPIO_InitTypeDef GPIO_InitStructure;
  26. /* Enable ADC1 and GPIOC clock */
  27. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
  28. RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M,尚未找到出处?最低二分频
  29. /* Configure PA.01 as analog input */
  30. //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  31. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  32. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  33. GPIO_Init(GPIOA, &GPIO_InitStructure); // PA0,输入时不用设置速率
  34. }
  35. /* 函数名:ADC1_Mode_Config
  36. * 描述 :配置ADC1的工作模式
  37. * 输入 : 无
  38. * 输出 :无
  39. * 调用 :内部调用
  40. */
  41. static void ADC1_Mode_Config(void)
  42. {
  43. ADC_InitTypeDef ADC_InitStructure;
  44. /* Resets ADC1 */
  45. ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
  46. /* ADC1 configuration ------------------------------------------------------*/
  47. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
  48. ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
  49. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
  50. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
  51. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
  52. ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
  53. ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
  54. ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
  55. /* Enable ADC1 reset calibaration register */
  56. ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
  57. /* Check the end of ADC1 reset calibration register */
  58. while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
  59. /* Start ADC1 calibaration */
  60. ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
  61. /* Check the end of ADC1 calibration */
  62. while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
  63. /* Start ADC1 Software Conversion */
  64. ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
  65. }
  66. /*
  67. * 函数名:ADC1_Init
  68. * 描述 :无
  69. * 输入 :无
  70. * 输出 :无
  71. * 调用 :外部调用
  72. */
  73. void ADC1_Init(void)
  74. {
  75. ADC1_GPIO_Config();
  76. ADC1_Mode_Config();
  77. }
  78. //获得ADC值
  79. //ch:通道值 0~3
  80. u16 Get_Adc(u8 ch)
  81. {
  82. //设置指定ADC的规则组通道,一个序列,采样时间
  83. ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
  84. ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
  85. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
  86. return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
  87. }
  88. /******************* (C) COPYRIGHT 2013 CEPARK多功能开发学习板*****END OF FILE****/