[STM32F0] STM32F030 ADC1采样问题请教

[复制链接]
11408|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
    以下是我初始化的代码,

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

  3. void Adc_Init(void)
  4. {
  5.         ADC_DeInit(ADC1);   
  6.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

  7.         //打开DMA1的时钟
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  9.         //打开ADC1的时钟
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

  11.         RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);

  12.         //初始化IO口
  13.         GPIO_InitTypeDef        GPIO_InitStruct;
  14.         GPIO_StructInit(&GPIO_InitStruct);
  15.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
  16.         GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource1;
  17.         GPIO_Init(GPIOB,&GPIO_InitStruct);                               
  18.         GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource0;
  19.         GPIO_Init(GPIOB,&GPIO_InitStruct);                               
  20.         GPIO_InitStruct.GPIO_Pin =        GPIO_PinSource2;
  21.         GPIO_Init(GPIOA,&GPIO_InitStruct);;                       

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

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

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

  48.         //ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  49.        
  50.         /* ADC Calibration */
  51.         ADC_GetCalibrationFactor(ADC1);                                                                                                                        //校准ADC


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

  55.         ADC_StartOfConversion(ADC1);                                                                                                                        //启动转换
  56. }
请大家帮忙支招。谢谢。
 楼主| lanjackg2003 发表于 2014-11-28 16:13 | 显示全部楼层
没人回答,顶起!!
airwill 发表于 2014-11-28 16:35 | 显示全部楼层
我从头看了一下你的代码, 还有个规则通道的设置还没有做呢
 楼主| lanjackg2003 发表于 2014-11-28 17:48 | 显示全部楼层
airwill 发表于 2014-11-28 16:35
我从头看了一下你的代码, 还有个规则通道的设置还没有做呢

非常感谢,你说的规则通道指的是如下代码吗
  1.   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
  2.   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
  3.   ADC_TempSensorCmd(ENABLE);
  4.   
  5.   /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  6.   ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles);
  7.   ADC_VrefintCmd(ENABLE);
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 有没有完成.
mmuuss586 发表于 2014-11-28 20:23 | 显示全部楼层

楼主可以按照楼上的试试看;
有空我也试试;
 楼主| lanjackg2003 发表于 2014-11-29 01:27 | 显示全部楼层
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

//blog.csdn.net/lan120576664
 楼主| lanjackg2003 发表于 2014-11-29 01:28 | 显示全部楼层
请将地址复制到地址栏,本人没有权限发布url地址
第七类解簇 发表于 2015-5-25 14:35 | 显示全部楼层
lanjackg2003 发表于 2014-11-29 01:27
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

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

在不 你好  我在21ic上看到你关于STM32F030的ADC 的帖子  我也遇到同样的问题  可不可以加你QQ   想跟你请教一点问题  谢谢  QQ:2417845927
luolang1991 发表于 2015-5-25 16:08 | 显示全部楼层
我觉得你这个跟F1系列的配置C:\Users\dell\Desktop\QQ图片20150525160551差别好大啊,不需要单独配置通道个数?
周董 发表于 2015-5-25 20:30 | 显示全部楼层
很好的学习资料 感谢分享
无帝老三 发表于 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] 没有规律,愁人,不知什么错误啊
zhaokanghui 发表于 2016-4-13 16:41 | 显示全部楼层
feihu11 发表于 2015-12-9 18:05
更新下之前的回答,可能误导了别人。:L

hi,你有没有遇到这样一个问题;在用030这个芯片多路ADC的时候,发现外界使某个通道发生变话的时候会导致另外一个通道的ADC采样值也会产生变换
爱老婆的小狼 发表于 2016-4-17 22:00 | 显示全部楼层
lanjackg2003 发表于 2014-11-29 01:27
谢谢大家,问题已经解决了。若有遇到相同问题的朋友,可以移步到我的博文了解一下原因.

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

你好,你那个STM32的ADC用DMA传输是怎样解决的?方便告诉我吗?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

441

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部