打印
[STM32F0]

STM32F030 ADC1采样问题请教

[复制链接]
10723|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanjackg2003|  楼主 | 2014-11-28 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,
    我在使用ADC1对AIN8/9/2通道进行采样,取值使用的是DMA方式.初始化代码,我参考了网络上好多**及官方的FW实例,但是仍然无**确获取三个通道的数值,读取的数值为g_uADC_ConVal[0]--> 0x3c00 g_uADC_ConVal[1]-->0x00,g_uADC_ConVal[2]-->0x00
    以下是我初始化的代码,

#define  ADC1_DR_Address                           (0x40012440)
volatile u16 g_uADC_ConVal[3] = {0};                // ADC转换值

void Adc_Init(void)
{
        ADC_DeInit(ADC1);   
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

        //打开DMA1的时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //打开ADC1的时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

        RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);

        //初始化IO口
        GPIO_InitTypeDef        GPIO_InitStruct;
        GPIO_StructInit(&GPIO_InitStruct);
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource1;
        GPIO_Init(GPIOB,&GPIO_InitStruct);                               
        GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource0;
        GPIO_Init(GPIOB,&GPIO_InitStruct);                               
        GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource2;
        GPIO_Init(GPIOA,&GPIO_InitStruct);;                       

        //配置ADC1的DMA模式
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);                                                //定义DMA外设基地址,即为存放转换结果的寄存器
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_uADC_ConVal;                                        //定义内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                                                        //定义AD外设作为数据传输的来源
        DMA_InitStructure.DMA_BufferSize = 3;                                                                        //指定DMA通道的DMA缓存的大小,即需要开辟几个内存空间,本实验有两个转换通道,所以开辟两个
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                                //设定寄存器地址固定
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                        //设定内存地址递加,即每次DMA都是将该外设寄存器中的值传到三个内存空间中
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;                //设定外设数据宽度
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                        //设定内存的的宽度
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                        //设定DMA工作再循环缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                                                //设定DMA选定的通道软件优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1,&DMA_InitStructure);
        DMA_Cmd(DMA1_Channel1,ENABLE);

        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                                                                        //设定AD转化在连续模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;                        //不使用外部促发转换
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;                                                                        //采集的数据在寄存器中以左对齐的方式存放
        ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
          ADC_Init(ADC1, &ADC_InitStructure);

        ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_ChannelConfig(ADC1, ADC_Channel_8 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_ChannelConfig(ADC1, ADC_Channel_9 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间

        //ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
       
        /* ADC Calibration */
        ADC_GetCalibrationFactor(ADC1);                                                                                                                        //校准ADC


        ADC_DMACmd(ADC1,ENABLE);                                                                                                                                //开启ADC的DMA支持
        ADC_Cmd(ADC1,ENABLE);                                                                                                                                        //使能指定的ADC1
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));                                                                        //等待ADC准备好

        ADC_StartOfConversion(ADC1);                                                                                                                        //启动转换
}
请大家帮忙支招。谢谢。
沙发
lanjackg2003|  楼主 | 2014-11-28 16:13 | 只看该作者
没人回答,顶起!!

使用特权

评论回复
板凳
airwill| | 2014-11-28 16:35 | 只看该作者
我从头看了一下你的代码, 还有个规则通道的设置还没有做呢

使用特权

评论回复
地板
lanjackg2003|  楼主 | 2014-11-28 17:48 | 只看该作者
airwill 发表于 2014-11-28 16:35
我从头看了一下你的代码, 还有个规则通道的设置还没有做呢

非常感谢,你说的规则通道指的是如下代码吗
  /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
  ADC_TempSensorCmd(ENABLE);
  
  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
  ADC_VrefintCmd(ENABLE);

使用特权

评论回复
5
airwill| | 2014-11-28 18:24 | 只看该作者
哦, 抱歉, F0 不用这么多设置:
52.        ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
53.        ADC_ChannelConfig(ADC1, ADC_Channel_8 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
54.        ADC_ChannelConfig(ADC1, ADC_Channel_9 , ADC_SampleTime_55_5Cycles);         //设置指定ADC的规则组通道,
这样设置就可以了, 我用这样的代码在 F051 上进行过测试, 完全通过. 不过我用了 DMA 中断来告诉主程序 ADC 已经结束. 你的问题, 要不输入就是地信号, 要不还没有等它转换结束, 可以判断一下 DMA 有没有完成.

使用特权

评论回复
6
mmuuss586| | 2014-11-28 20:23 | 只看该作者

楼主可以按照楼上的试试看;
有空我也试试;

使用特权

评论回复
7
lanjackg2003|  楼主 | 2014-11-29 01:27 | 只看该作者
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

//blog.csdn.net/lan120576664

使用特权

评论回复
8
lanjackg2003|  楼主 | 2014-11-29 01:28 | 只看该作者
请将地址复制到地址栏,本人没有权限发布url地址

使用特权

评论回复
9
第七类解簇| | 2015-5-25 14:35 | 只看该作者
lanjackg2003 发表于 2014-11-29 01:27
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

//blog.csdn.net/lan ...

在不 你好  我在21ic上看到你关于STM32F030的ADC 的帖子  我也遇到同样的问题  可不可以加你QQ   想跟你请教一点问题  谢谢  QQ:2417845927

使用特权

评论回复
10
luolang1991| | 2015-5-25 16:08 | 只看该作者
我觉得你这个跟F1系列的配置C:\Users\dell\Desktop\QQ图片20150525160551差别好大啊,不需要单独配置通道个数?

使用特权

评论回复
11
周董| | 2015-5-25 20:30 | 只看该作者
很好的学习资料 感谢分享

使用特权

评论回复
12
无帝老三| | 2015-9-10 17:30 | 只看该作者
airwill 发表于 2014-11-28 18:24
哦, 抱歉, F0 不用这么多设置:
52.        ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_55_5C ...

我也是f0 配置完三个通道后,在其中一个上面接电压1.5v
然后用一个3个元素数组保存,dma方式,结果这个1.5v电压
会在三个数组元素中变化,一会是a[0]
一会 是a[1] 没有规律,愁人,不知什么错误啊

使用特权

评论回复
13
zhaokanghui| | 2016-4-13 16:41 | 只看该作者
feihu11 发表于 2015-12-9 18:05
更新下之前的回答,可能误导了别人。:L

hi,你有没有遇到这样一个问题;在用030这个芯片多路ADC的时候,发现外界使某个通道发生变话的时候会导致另外一个通道的ADC采样值也会产生变换

使用特权

评论回复
14
爱老婆的小狼| | 2016-4-17 22:00 | 只看该作者
lanjackg2003 发表于 2014-11-29 01:27
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

//blog.csdn.net/lan ...

你好,你那个STM32的ADC用DMA传输是怎样解决的?方便告诉我吗?谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

440

帖子

7

粉丝