你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F4 ADC使用交流

[复制链接]
阿松松 发布时间:2015-1-5 14:51
嗯,最近做ADC采样,牛牛们勿喷,我知道,这个可能没什么技术含量,不过,菜鸟的我们迈出了第一步,和大家分享的那种感觉,牛牛们要鼓励支持啊
单通道采样,使用了一个ADC。
嗯,废话少说,第一种方式,使用了DMA,略脑残,哈哈

直接上代码了
  1. /*******************************************************************************
  2.   * Copyright(C),2014,
  3.   * @file Name  main.c   
  4.   * @author  chansane
  5.   * @version V2.0.0
  6.   * @date   09-12-2014  
  7.   * @brief
  8.   * @History
  9. *******************************************************************************/
  10. #include "adc.h"

  11. __IO uint16_t ADC3ConvertedValue;
  12. float ADC3ConvertedVoltage;

  13. /* 函数名:ADC1_Mode_Config
  14. * 描述  :配置ADC1的工作模式为DMA模式
  15. * 输入  : 无
  16. * 输出  :无
  17. * 调用  :内部调用
  18. */
  19. void ADC3_CH2_DMA_Config(void)
  20. {
  21.   ADC_InitTypeDef       ADC_InitStructure;
  22.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  23.   DMA_InitTypeDef       DMA_InitStructure;
  24.   GPIO_InitTypeDef      GPIO_InitStructure;

  25.   /* Enable ADC3, DMA2 and GPIO clocks ****************************************/
  26.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);
  27.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  28.   /* DMA2 Stream0 channel2 configuration **************************************/
  29.   DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
  30.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  31.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
  32.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  33.   DMA_InitStructure.DMA_BufferSize = 1;
  34.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  35.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  36.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  37.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  38.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  39.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  40.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  41.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  42.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  43.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  44.   DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  45.   DMA_Cmd(DMA2_Stream0, ENABLE);

  46.   /* Configure ADC3 Channel2 pin as analog input ******************************/
  47.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  48.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  49.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  50.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  51.   /* ADC Common Init **********************************************************/
  52.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  53.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  54.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  55.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  56.   ADC_CommonInit(&ADC_CommonInitStructure);

  57.   /* ADC3 Init ****************************************************************/
  58.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  59.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  60.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  61.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  62.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  63.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  64.   ADC_InitStructure.ADC_NbrOfConversion = 1;
  65.   ADC_Init(ADC3, &ADC_InitStructure);

  66.   /* ADC3 regular channel2 configuration *************************************/
  67.   ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_3Cycles);

  68. /* Enable DMA request after last transfer (Single-ADC mode) */
  69.   ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

  70.   /* Enable ADC3 DMA */
  71.   ADC_DMACmd(ADC3, ENABLE);

  72.   /* Enable ADC3 */
  73.   ADC_Cmd(ADC3, ENABLE);
  74.   
  75.   ADC_SoftwareStartConv(ADC3);
  76. }

  77. /****************************************************
  78.   * @functionName  Delay
  79.   * @brief  We use this function to delay an sure time periond
  80.   * @param  nCount
  81.   * @retval None
  82. ****************************************************/
  83. void Delay(__IO uint32_t nCount)
  84. {
  85.   while(nCount--)
  86.   {
  87.   }
  88. }

  89. //Read ADC result,converted to real voltage
  90. float ADC_READ(void)
  91. {
  92.   ADC3ConvertedVoltage = ADC3ConvertedValue*3.3/0xFFF;
  93.   return ADC3ConvertedVoltage;
  94. }
  95. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码
嗯,他们说DMA没必要,嗯,那咱就换种查询方式,你需要数据的时候我才给你数据,你不需要的时候我就关闭ADC,节能减排

上代码
  1. /**
  2.   * @brief  ADC3 channel07 with DMA configuration
  3.   * @param  None
  4.   * @retval None
  5.   */

  6. /* Private macro -------------------------------------------------------------*/
  7. /* Private variables ---------------------------------------------------------*/
  8. #include "stm32f4xx.h"
  9. __IO float ADC3ConvertedVoltage = 0;

  10. /* 函数名:ADC1_Mode_Config
  11. * 描述  :配置ADC1的工作模式为DMA模式
  12. * 输入  : 无
  13. * 输出  :无
  14. * 调用  :内部调用
  15. */
  16. void ADC3_CH2_Polling_Config(void)
  17. {
  18.   ADC_InitTypeDef       ADC_InitStructure;
  19.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  20.   GPIO_InitTypeDef      GPIO_InitStructure;

  21.   /* Enable ADC3 and GPIO clocks ****************************************/
  22.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  23.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  24.   /* Configure ADC3 Channel2 pin as analog input ******************************/
  25.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  26.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  27.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  28.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  29.   /* ADC Common Init **********************************************************/
  30.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  31.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  32.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  33.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  34.   ADC_CommonInit(&ADC_CommonInitStructure);

  35.   /* ADC3 Init ****************************************************************/
  36.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  37.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  38.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  39.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  40.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  41.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  42.   ADC_InitStructure.ADC_NbrOfConversion = 1;
  43.   ADC_Init(ADC3, &ADC_InitStructure);
  44.   
  45.   /* ADC3 regular channel2 configuration *************************************/
  46.   ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 1, ADC_SampleTime_28Cycles);
  47.   


  48. }

  49. /****************************************************
  50.   * @functionName  Delay
  51.   * @brief  We use this function to delay an sure time periond
  52.   * @param  nCount
  53.   * @retval None
  54. ****************************************************/
  55. void Delay(__IO uint32_t nCount)
  56. {
  57.   while(nCount--)
  58.   {
  59.   }
  60. }

  61. //Read ADC result,converted to real voltage
  62. float ADC_READ(void)
  63. {
  64.   uint32_t adc_timeout = 10000000;//adc 转换硬件超时时长
  65.   
  66.   ADC_ClearFlag(ADC3,ADC_FLAG_EOC);

  67.   ADC_Cmd(ADC3, ENABLE);
  68.   
  69.   //通过软件将该位置 1 可开始转换,而硬件会在转换开始后将该位清零
  70.   ADC_SoftwareStartConv(ADC3);
  71.   
  72.   while((!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC)) && (adc_timeout--));//为避免硬件错误导致整个系统瘫痪所以得加上硬件超时
  73.   
  74.   ADC3ConvertedVoltage = ADC_GetConversionValue(ADC3)*3.3/0xFFF;
  75.   
  76. //ADC_ClearFlag(ADC3,ADC_FLAG_EOC);//规则组通道转换结束后,硬件将该位置 1。通过软件或通过读取 ADC_DR 寄存器将该位清零,上一语句已经读取ADC_DR,本语句可以取消
  77.   
  78.   ADC_Cmd(ADC3, DISABLE);   
  79.   
  80.   return ADC3ConvertedVoltage;
  81. }
复制代码



楼主虽然成功了采集到了数据,但是对一个参数的设置有些疑惑。
关于采样时间的设置ADC_SampleTime_3Cycles,实测,数据测不准,或许是采样保持时间不够?
如果设置为ADC_SampleTime_15Cycles或者ADC_SampleTime_28Cycles,是完全可以的。

那么问题来了,实际应用的时候我用什么最合适呢,有人讲这是采样效率和精度的平衡(心法口诀),可是实际的时候,怎么去找这个平衡点?
各路大神支招
收藏 评论1 发布时间:2015-1-5 14:51

举报

1个回答
zhaojunlin123 回答时间:2015-1-5 15:03:37
学习下··········

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版