adc.c 3.0 KB

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