123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- /******************** (C) COPYRIGHT 2013 CEPARK多功能开发学习板********************
- * 文件名 :adc.c
- * 描述 :ADC值应用函数库
- * 实验平台:CEPARK多功能开发学习板
- * 硬件连接:----------------------------------------------------
- * | |
- * | PA0 - JP25 连接外部电压(通过一个滑动变阻器分压而来)|
- * | J1需短接 |
- * | |
- * ----------------------------------------------------
- * 库版本 :ST3.5.0
- **********************************************************************************/
- #include "adc.h"
- #define ADC1_DR_Address ((u32)0x4001244C)
- __IO u16 ADC_ConvertedValue;
- /*
- * 函数名:ADC1_GPIO_Config
- * 描述 :使能ADC1的时钟,初始化PA.01
- * 输入 : 无
- * 输出 :无
- * 调用 :内部调用
- */
- static void ADC1_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- /* Enable ADC1 and GPIOC clock */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
-
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M,尚未找到出处?最低二分频
- /* Configure PA.01 as analog input */
- //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure); // PA0,输入时不用设置速率
- }
- /* 函数名:ADC1_Mode_Config
- * 描述 :配置ADC1的工作模式
- * 输入 : 无
- * 输出 :无
- * 调用 :内部调用
- */
- static void ADC1_Mode_Config(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- /* Resets ADC1 */
- ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
-
- /* ADC1 configuration ------------------------------------------------------*/
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
- ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
-
- ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
-
- /* Enable ADC1 reset calibaration register */
- ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
- /* Check the end of ADC1 reset calibration register */
- while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
-
- /* Start ADC1 calibaration */
- ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
- /* Check the end of ADC1 calibration */
- while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
-
- /* Start ADC1 Software Conversion */
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
- }
- /*
- * 函数名:ADC1_Init
- * 描述 :无
- * 输入 :无
- * 输出 :无
- * 调用 :外部调用
- */
- void ADC1_Init(void)
- {
- ADC1_GPIO_Config();
- ADC1_Mode_Config();
- }
- //获得ADC值
- //ch:通道值 0~3
- u16 Get_Adc(u8 ch)
- {
- //设置指定ADC的规则组通道,一个序列,采样时间
- ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
-
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
-
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
- return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
- }
- /******************* (C) COPYRIGHT 2013 CEPARK多功能开发学习板*****END OF FILE****/
|