OpenEdv-开源电子网

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

【求助】ADC采集无数据

[复制链接]

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-4-19
在线时间
3 小时
发表于 2013-7-5 22:56:03 | 显示全部楼层 |阅读模式
今天研读原子的书ADC这章节

ADC读不到数据,找了很久,郁闷,求大家给给点下

下图是硬件电路,CPU是STM32103VBH6  代码按照原子书库函数上面给的写的,其中修改了  GPIO口 和ADC通道

PC4我看原子书上写的是通道14


代码如下:大大们有空给指点下吧小弟新手。。。
void AdcInit(void)
{
    GPIO_InitTypeDef tGPIO_InitStruct;
    ADC_InitTypeDef  tADC_InitStruct;
    /*1. 开启GPIOC口时钟和ADC1的时钟,设置PC4为模拟输入*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE);
    /* 设置PC4为输入, */
    tGPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AIN;/* 模拟输入 */
    tGPIO_InitStruct.GPIO_Pin   = GPIO_Pin_4;
    //tGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;/* 最高输速率所以这里不用设置*/
    GPIO_Init(GPIOC, &tGPIO_InitStruct);

    /*2.复位ADC1,同时设置ADC1分频因子 */
    //RCC_ADCCLKConfig(RCC_PCLK2_Div6);/* 设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M */
    RCC_ADCCLKConfig(RCC_PCLK2_Div4);
    ADC_DeInit(ADC1);
    /*3.初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息  */
    tADC_InitStruct.ADC_Mode = ADC_Mode_Independent;/* ADC工作模式:ADC1和ADC2工作在独立模式 */
    tADC_InitStruct.ADC_ScanConvMode = DISABLE;/* 模数转换工作在单通道模式 */
    tADC_InitStruct.ADC_ContinuousConvMode = DISABLE;/* 模数转换工作在单次转换模式 */
    tADC_InitStruct.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None ;/* 转换由软件而不是外部触发启动 */       
    tADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;/* ADC数据右对齐 */
    tADC_InitStruct.ADC_NbrOfChannel =1;/* 顺序进行规则转换的ADC通道的数目 */   
    ADC_Init(ADC1, &tADC_InitStruct);/* 根据tADC_InitStructz指定的参数初始化外设ADC的寄存器*/

    /* 使能ADC并校准 设置完上面的信息后,就能使用AD转换器了,执行复位和AD校准,注意这两部是必须的
    不校准将导致结果很不准确*/

    /*下面是固定的模式直接写就行*/
    ADC_Cmd(ADC1, ENABLE);/* 使能指定的ADC */
    ADC_ResetCalibration(ADC1);/*执行复位校准 */

    while(ADC_GetResetCalibrationStatus(ADC1));/* 等待复位校准结束 */
    ADC_StartCalibration(ADC1);/* 开启AD校准 */
    while(ADC_GetCalibrationStatus(ADC1));/* 等待校准结束*/


    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC的软件转换启动功能    
}

/* 获得ADC值 */
//iCh 通道值0~3

static int GetAdc(int iCh)
{
    /* Configures ADC1 Channel2 as: first converted channel with an 7.5 
    cycles sample time */ 
    //ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_7Cycles5); 
    /* Configures ADC1 Channel8 as: second converted channel with an 1.5 
    cycles sample time */ 
    //ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_1Cycles5); 
    ADC_RegularChannelConfig(ADC1, iCh, 1, ADC_SampleTime_55Cycles5);

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);/* 使能指定的ADC1的软件转换启动功能 */
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));/*等待转换结束 */
    return ADC_GetConversionValue(ADC1);/* 返回最后一次ADC1规则组的转换结果 */
}
/*
获取times次的平均值
iCh:通道号
iTimes:需要取多少次的(平均值)
*/
int GetAdcAverage(int iCh, int iTimes)
{
    int iSum;
    int i;
    iSum = 0;
    for(i= 0; i < iTimes; i++)
    {
        iSum = iSum + GetAdc(iCh); 
        delay_ms(5);
    }
    
    return (iSum /iTimes);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-5-24
在线时间
9 小时
发表于 2013-7-6 14:25:07 | 显示全部楼层
没有启动功能复用IO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);目前就发现了这个问题,楼主加上试试先。
回复 支持 反对

使用道具 举报

15

主题

204

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-8-24 23:00:14 | 显示全部楼层
回复【2楼】dll_epdc:
---------------------------------
为何要开AFIO时钟?
有生之年,只诉温暖不言殇,花味渐浓,茶味渐醇,倾心相遇,安暖相陪。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-25 23:01:50 | 显示全部楼层
PC4是通道14没错。
你的配置看上去也没问题哦。
你测试结果都是0?还是怎么样?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 15:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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