OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4718|回复: 4

新手请教,关于ADC的问题

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-7-30
在线时间
3 小时
发表于 2013-5-28 23:47:46 | 显示全部楼层 |阅读模式

最近在学习使用ADC,根据原子哥在论坛发的库函数版的ADC实验,改了以下程序,主要就是从原来的PA0改成了PC4,对应的是通道14,代码修改如下:

void  Adc_Init(void)
{  
 ADC_InitTypeDef ADC_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟
 
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //72M/6=12,ADC最大时间不能超过14M
 //PC4/5 作为模拟通道输入引脚                         
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入引脚
 GPIO_Init(GPIOC, &GPIO_InitStructure); 

 ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值

 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
 
 ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
 
 while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
 
 ADC_StartCalibration(ADC1);  //开始指定ADC1的校准状态
 
 while(ADC_GetCalibrationStatus(ADC1));  //获取指定ADC1的校准程序,设置状态则等待
 
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能指定的ADC1的软件转换启动功能

}     
//获得ADC值
u16 Get_Adc(u8 ch)  
{
   //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道14,规则采样顺序值为1,采样时间为239.5周期         
 
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能指定的ADC1的软件转换启动功能 
 
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}

在主程序里用 adcx=Get_Adc(ADC_Channel_14),就是获取不到在PC4上加载的2V电压(基准电压选取的是2.5V),请帮忙看看我哪里设置的有问题?我花了差不多整个晚上在这里找好多帖子,也有和我一样的问题,后来解决了的,请指点一二!十分感谢!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-29 00:06:09 | 显示全部楼层
PC口时钟,貌似没事能吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-7-30
在线时间
3 小时
 楼主| 发表于 2013-5-29 00:11:13 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟,这个同时也使能了PC口了吧
回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-7-30
在线时间
3 小时
 楼主| 发表于 2013-5-29 00:14:00 | 显示全部楼层
看到有人的帖子里说,要把ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 )函数的第3个参数“1”改成和所选通道对应的15,貌似跟函数的解释也不符啊.....
回复 支持 反对

使用道具 举报

2

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-5-24
在线时间
9 小时
发表于 2013-6-1 17:36:35 | 显示全部楼层
IO复用功能时钟木有打开RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO  , ENABLE );
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 07:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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