野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19539|回复: 4

关于ADC采集读取数据的问题

[复制链接]
发表于 2014-1-14 17:02:49 | 显示全部楼层 |阅读模式
本帖最后由 ljlucker 于 2014-1-14 17:05 编辑

    这是一个关于在不使用DMA功能的情况下,读取ADC值的问题。《STM32库开发实战指南》和光盘的ADC例程里面,都是用到DMA功能。但是我想知道在没有使用DMA功能的情况下怎样去读取ADC值,我一共有2个不明白的地方。下面是我写的一段代码:

这是ADC.C文件的程序代码
#include "stm32f10x_conf.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)

__IO uint16_t ADC_ConvertedValue;

void ADC_Config()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_Init(GPIOC,&GPIO_InitStructure);
        
        ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立ADC模式
        ADC_InitStructure.ADC_ScanConvMode=DISABLE;     //禁止扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//开启连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部中断触发
        ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel=1;//要转换通道数1
        ADC_Init(ADC1,&ADC_InitStructure);
        RCC_ADCCLKConfig(RCC_PCLK2_DiARM);//配置ADC时钟,为PCLK2的8分频
        ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);//配置ADC1通道11为55.5采集周期
        ADC_Cmd(ADC1,ENABLE);
        ADC_ResetCalibration(ADC1);//复位校准
        while(ADC_GetResetCalibrationStatus(ADC1));
        ADC_StartCalibration(ADC1);//ADC校准
        while(ADC_GetCalibrationStatus(ADC1));
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使用软件触发
}

问题1:
对于这段代码有几个疑问,程序ADC_SoftwareStartConvCmd(ADC1,ENABLE);是使用软件触发的意思,这个触发是怎么控制的,是需要写某个寄存器,还是说ADC配置成连续转换模式(即ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;)后,就表示ADC转换已经处于软件触发了?如果是软件触发,是不是通过写代码使能或暂停ADC转换,具体是写哪些代码?

问题二:
在不使用DMA的情况下,就像我上面编的那一段代码,要怎样才能获取到ADC的值,我看到有一个
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) 这样的程序。这个程序的返回值是不是就是ADC转换回来的值?
我试过写了一下的代码:
__IO uint16_t ADC_ConvertedValue;
ADC_ConvertedValue=ADC_GetConversionValue(ADC1);
但是ADC_ConvertedValue的值一直是0x0000

我想要的效果是:在不使用DMA功能的情况下,通过软件控制ADC转换一次读一次数值。
需要指导……



回复

使用道具 举报

发表于 2014-1-14 18:05:45 | 显示全部楼层
不使用DMA的时候可以直接使用库函数ADC_GetConversionValue 读取adc的转换值,或者直接读取数据寄存器
回复 支持 反对

使用道具 举报

发表于 2014-1-14 18:13:41 | 显示全部楼层
1.在你前面配置好adc的采样规则之后,就是等待触发了,可以使用定时器定时触发或者你所用的软件触发,软件触发只需要调用ADC_SoftwareStartConvCmd函数,ENABLE使能adc开始采样,想关闭的时候也是调用这个函数,把参数设置成DISABLE即可。
2.使用ADC_GetConversionValue 即可读取采样得的adc值,一直读取到是0估计是配置还有问题,导致adc还没开始转换
回复 支持 反对

使用道具 举报

发表于 2014-1-14 18:14:58 | 显示全部楼层
楼主可以看看adc那个内部温度传感器例程,这个就是没有使用DMA直接读取adc数据的例子
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-15 08:29:57 | 显示全部楼层
公孙璇娟 发表于 2014-1-14 18:13
1.在你前面配置好adc的采样规则之后,就是等待触发了,可以使用定时器定时触发或者你所用的软件触发,软件触 ...

嗯!谢啦,我今天还要继续努力把这本书学完。强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-30 15:40 , Processed in 0.047806 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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