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

STM32F1系列实现ADC多信道采样

[复制链接]
kyhly 提问时间:2018-8-9 19:45 /
目前正在研究如何在STM32F107芯片上添加多个传感器,现在想采用单ADC实现多个信道数据采集,使用的HAL库,具体程序如下:
  1. /************ADC初始化定义*****************/
  2. #define ADCx_RCC_CLK_ENABLE()    __HAL_RCC_ADC1_CLK_ENABLE()
  3. #define ADCx_RCC_CLK_DISABLE()   __HAL_RCC_ADC1_CLK_DISABLE()
  4. #define DMAx_RCC_CLK_ENABLE()    __HAL_RCC_DMA1_CLK_ENABLE()

  5. #define ADCx                     ADC1   
  6. #define ADCx_IRQ                 ADC1_2_IRQn
  7. #define ADCx_IRQHandler          ADC1_2_IRQHandler

  8. #define ADC_DMAx_CHANNELn        DMA1_Channel1
  9. #define ADC_DMAx_CHANNELn_IRQn   DMA1_Channel1_IRQn
  10. #define ADC_DMAx_CHANNELn_IRQHANDLER  DMA1_Channel1_IRQHandler
  11. /*******ADC2******/
  12. //#define ADC2_RCC_CLK_ENABLE()    __HAL_RCC_ADC2_CLK_ENABLE()
  13. //#define ADC2_RCC_CLK_DISABLE()   __HAL_RCC_ADC2_CLK_DISABLE()
  14. //#define ADC_2                     ADC2   
  15. //#define ADCx_IRQ                 ADC1_2_IRQn
  16. //#define ADCx_IRQHandler          ADC1_2_IRQHandler
  17. /*******ADC3*****/
  18. //#define ADCx_RCC_CLK_ENABLE()    __HAL_RCC_ADC3_CLK_ENABLE()
  19. //#define ADCx_RCC_CLK_DISABLE()   __HAL_RCC_ADC3_CLK_DISABLE()
  20. //#define ADCx                     ADC3   
  21. //#define ADCx_IRQ                 ADC3_IRQn
  22. //#define ADCx_IRQHandler          ADC3_IRQHandler

  23. //PIN¿Ú¶¨Òå
  24. #define ADC_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()
  25. #define ADC_GPIO                   GPIOA
  26. #define ADC_GPIO_PIN_0             GPIO_PIN_0
  27. #define ADC_CHANNEL                ADC_CHANNEL_0
  28. #define ADC_GPIO_PIN_4             GPIO_PIN_4
  29. #define ADC_CHANNEL4               ADC_CHANNEL_4   
  30. #define ADC_GPIO_PIN_5             GPIO_PIN_5
  31. #define ADC_CHANNEL5               ADC_CHANNEL_5
  32. #define ADC_NUMOFCHANNEL            2

  33. //#define ADC_GPIO_PIN               GPIO_PIN_1
  34. //#define ADC_CHANNEL                ADC_CHANNEL_11
  35. /****À©Õ¹±äÁ¿***************************************/
  36. extern ADC_HandleTypeDef  hadcx;

  37. extern DMA_HandleTypeDef  dma_adcx;

  38. void MX_ADCx_Init(void);

  39. void ADCx_Start(void);
  40. #endif  
复制代码
bsp_adc.c代码如下:
  1. #include "bsp_adc.h"

  2. ADC_HandleTypeDef  hadcx;
  3. DMA_HandleTypeDef  hdma_adcx;

  4. void MX_ADCx_Init(void)
  5. {
  6. ADC_ChannelConfTypeDef sConfig;
  7.        
  8. //ADC初始化配置
  9. hadcx.Instance = ADCx;//Resiger base adress
  10. // ADC_InitTypeDef   Init
  11. hadcx.Init.ScanConvMode = ADC_SCAN_ENABLE;//ÊÇ·ñʹÓÃɨÃèģʽ
  12. hadcx.Init.ContinuousConvMode = ENABLE;//µ¥Ò»/Á¬Ðøת»»Ä£Ê½
  13. hadcx.Init.DiscontinuousConvMode = DISABLE;//Ö»ÔÚContinuousConvMode = DISABLEÊDzÅÓÐЧ£¬·ñÔòÅ×Æú
  14. hadcx.Init.ExternalTrigConv = ADC_SOFTWARE_START;// ²»ÓÃÍⲿ´¥·¢×ª»»£¬Èí¼þ¿ªÆô¼´¿É
  15. hadcx.Init.DataAlign = ADC_DATAALIGN_RIGHT;//ת»»½á¹ûÓÒ¶ÔÆë
  16. hadcx.Init.NbrOfConversion = ADC_NUMOFCHANNEL;//¼ä¶ÏģʽÖÐÒ»¸ö×éµÄͨµÀÊýÄ¿

  17.        
  18. if(HAL_ADC_Init(&hadcx) != HAL_OK)//¼ÓÔØADCÊôÐÔ
  19. { while(1){HAL_Delay(1000);}
  20. }


  21. //采样信道配置

  22. //PIN ->A4  Channel 4
  23. sConfig.Channel = ADC_CHANNEL4;
  24. sConfig.Rank = 1;
  25. sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;//²ÉÑùʱ¼ä
  26. if(HAL_ADC_ConfigChannel(&hadcx,&sConfig) != HAL_OK){
  27. while(1){HAL_Delay(1000);}
  28. }

  29. //PIN ->A5 Channel 5
  30. sConfig.Channel = ADC_CHANNEL_5;
  31. sConfig.Rank = 2;

  32. if(HAL_ADC_ConfigChannel(&hadcx,&sConfig) != HAL_OK){
  33. while(1){HAL_Delay(1000);}
  34. }
  35. }


  36. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  37. {
  38.   GPIO_InitTypeDef GPIO_InitStruct;
  39.          
  40.   if(hadc->Instance==ADCx)
  41.   {
  42.     /*  时钟使能*/
  43.     ADCx_RCC_CLK_ENABLE();
  44.    
  45.     /* ADC引脚始终初始化*/
  46.     ADC_GPIO_CLK_ENABLE();
  47.    
  48.     /* AD转换引脚配置 */
  49.    
  50.                 GPIO_InitStruct.Pin = ADC_GPIO_PIN_4|ADC_GPIO_PIN_5;
  51.                 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  52.                 GPIO_InitStruct.Pull = GPIO_NOPULL;
  53.                 HAL_GPIO_Init(ADC_GPIO,&GPIO_InitStruct);
  54.                
  55. //                GPIO_InitStruct.Pin = ADC_GPIO_PIN_5;
  56. //    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  57. //                GPIO_InitStruct.Pull = GPIO_NOPULL;
  58. //    HAL_GPIO_Init(ADC_GPIO, &GPIO_InitStruct);
  59.                
  60.                 /* DMA初始化 */  
  61.     hdma_adcx.Instance = ADC_DMAx_CHANNELn;
  62.     hdma_adcx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  63.     hdma_adcx.Init.PeriphInc = DMA_PINC_DISABLE;
  64.     hdma_adcx.Init.MemInc = DMA_MINC_ENABLE;
  65.                 //ÈôÏëÒªDMA»ñÈ¡µÄ½öΪADC1 µÄÖµ
  66.     hdma_adcx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;       
  67.     hdma_adcx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  68.     hdma_adcx.Init.Mode = DMA_CIRCULAR;
  69.     hdma_adcx.Init.Priority = DMA_PRIORITY_MEDIUM;

  70.     HAL_DMA_Init(&hdma_adcx);
  71.    
  72.                 /* 连接DMA */
  73.     __HAL_LINKDMA(hadc,DMA_Handle,hdma_adcx);
  74.    
  75.                 /*ÍâÉèÖжÏÓÅÏȼ¶ÅäÖúÍʹÄÜÖÐ¶Ï */
  76.    //  HAL_NVIC_SetPriority(ADCx_IRQ, 1, 0);
  77.    // HAL_NVIC_EnableIRQ(ADCx_IRQ);
  78.          
  79.          //HAL_NVIC_SetPriority(ADC_DMAx_CHANNELn_IRQn, 5, 0);
  80.    //HAL_NVIC_EnableIRQ(ADC_DMAx_CHANNELn_IRQn);
  81.                
  82. //                /*ÉèÖÃADCУ׼*/
  83. //                HAL_ADCEx_Calibration_Start(&hadcx);
  84.   }
  85. }
  86. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
  87. {
  88.   if(hadc->Instance==ADCx||hadc->Instance == ADC2)
  89.   {
  90.     /* 禁用ADC外设时钟 */
  91.     ADCx_RCC_CLK_DISABLE();
  92.   
  93.     /* ADC转换引脚反初始化 */
  94.     HAL_GPIO_DeInit(ADC_GPIO, ADC_GPIO_PIN_5|ADC_GPIO_PIN_4);
  95.    
  96.     /* ½ ½ûÓÃÍâÉèÖÐ¶Ï */
  97.     HAL_NVIC_DisableIRQ(ADCx_IRQ);
  98.                 HAL_DMA_DeInit(hadc->DMA_Handle);

  99.   }
  100. }
复制代码
mian函数代码如下:
  1. int main(void)
  2. {
  3.   /* STM32F103xB HAL library initialization:
  4.        - Configure the Flash prefetch
  5.        - Systick timer is configured by default as source of time base, but user
  6.          can eventually implement his proper time base source (a general purpose
  7.          timer for example or other time source), keeping in mind that Time base
  8.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  9.          handled in milliseconds basis.
  10.        - Set NVIC Group Priority to 4
  11.        - Low Level Initialization
  12.      */
  13.   HAL_Init();

  14.   /* Configure the system clock to 64 MHz */
  15.   SystemClock_Config();
  16.   
  17.   /* Configure LED2 */
  18. //  BSP_LED_Init(LED2);

  19.   bsp_led_init();
  20. __HAL_RCC_GPIOA_CLK_ENABLE();
  21.    __HAL_RCC_DMA1_CLK_ENABLE();
  22.          HAL_NVIC_SetPriority(ADC_DMAx_CHANNELn_IRQn, 5, 0);
  23.    HAL_NVIC_EnableIRQ(ADC_DMAx_CHANNELn_IRQn);
  24.        
  25.          MX_ADCx_Init(); //开启ADC
  26. printf("ADC - DMA ¶àÐŵÀÊý¾Ý²É¼¯\n");
  27. if( HAL_ADC_Start_DMA(&hadcx,uhADCxConvertedValue,ADC_NUMOFCHANNEL) != HAL_OK){
  28.     printf("ADC_Start_DMA() Error!\n");
  29. }

  30. while(1){
  31.          //HAL_Delay(1000);
  32.          printf("Channel 1: %d\nChannel 2:%d\n",uhADCxConvertedValue[0],uhADCxConvertedValue[1]);
  33. }
复制代码
但是现在无法获取数据,获得的数据均为0,不知道如何解决。
收藏 1 评论2 发布时间:2018-8-9 19:45

举报

2个回答
feixiang20 回答时间:2018-8-9 23:20:41
先检查下硬件连接

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

电子星辰 回答时间:2018-8-10 09:48:57
1、HAL_ADC_Start_DMA之前好像没有加校验,HAL_ADCEx_Calibration_Start(&hadc1);
2、配置是用的半字传输,uhADCxConvertedValue这个变量不知道你是定义的什么类型;最好定义16位int,然后用的时候强制转换;
3、ADC_Start_DMA()这个函数是做什么的?不知道你用uhADCxConvertedValue[0]的时候有没有取低12位有效数据?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版