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

STM32cube库配置双ADC的同步规则采样

[复制链接]
penghao 提问时间:2016-2-24 10:35 /
阅读主题, 点击返回1楼
收藏 4 评论22 发布时间:2016-2-24 10:35
22个回答
Paderboy 回答时间:2016-10-12 08:38:37
Ysheng169 发表于 2016-10-11 22:00
我也是这样配置的,但是遇到问题:电压增大时,读出来的数据是变小的,电压调小,读出来的却是变大。
我 ...

stm32 你上5v?不怕烧了啊。。。 没遇到你3.3v能读出2.8v。。最好能把工程弄上来。。看看什么问题。。
Ysheng169 回答时间:2016-10-12 09:55:28
Paderboy 发表于 2016-10-12 08:38
stm32 你上5v?不怕烧了啊。。。 没遇到你3.3v能读出2.8v。。最好能把工程弄上来。。看看什么问题。。 ...

运算的时候出错了,现在解决了,但是发现精确度不高啊,外部给2.4V, ad转换后是2.543V,请问这怎样解决
小学痞 回答时间:2017-5-1 22:45:33
楼主,你那个问题解决了吗,能把你cubemx代码发下嘛,
你最后的问题,可以通过标定adc来解决。比如把adc的输出电压和给定电压一一对应,然后通过数值分析,标定
小学痞 回答时间:2017-5-1 22:51:11
叫最小二乘法,可以手动分段标定,提高精确度
清竹雨仙 回答时间:2017-11-14 22:58:42
Ysheng169 发表于 2016-10-12 09:55
运算的时候出错了,现在解决了,但是发现精确度不高啊,外部给2.4V, ad转换后是2.543V,请问这怎样解决 ...

估计你没校验
vanaua 回答时间:2020-3-5 17:08:14
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...

兄弟,你好,最近我也在做h7系列的adc同步采样问题,但跟你不同的是,我的是两路adc,每路adc下面还各有两个通道,这我就不明白该怎么设置了,可以把你这个工程代码让我参考一下吗?万分感谢了。邮箱:vanaua@163.com
vanaua 回答时间:2020-3-5 17:11:55
Paderboy 发表于 2016-2-25 15:21
我这个测试好了。直接用CubeMx 4.13 配置好直接生成后,
HAL_ADC_Start(&hadc2); 初始化好后先启动ADC2 工 ...
  1. static void MX_ADC1_Init(void)
  2. {

  3.   /* USER CODE BEGIN ADC1_Init 0 */

  4.   /* USER CODE END ADC1_Init 0 */

  5.   ADC_MultiModeTypeDef multimode = {0};
  6.   ADC_ChannelConfTypeDef sConfig = {0};

  7.   /* USER CODE BEGIN ADC1_Init 1 */

  8.   /* USER CODE END ADC1_Init 1 */
  9.   /** Common config
  10.   */
  11.   hadc1.Instance = ADC1;
  12.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; ////4分频,ADCCLK=PER_CK/4=64/4=16MHZ
  13.   hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  14.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  15.   // hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  16.         hadc1.Init.EOCSelection = DISABLE;
  17.   hadc1.Init.LowPowerAutoWait = DISABLE;
  18.   hadc1.Init.ContinuousConvMode = ENABLE;
  19.   hadc1.Init.NbrOfConversion = 2;
  20.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  21.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  22.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  23.   hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  24.   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  25.   hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  26.   hadc1.Init.OversamplingMode = DISABLE;
  27.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   /** Configure the ADC multi-mode
  32.   */
  33.   multimode.Mode = ADC_DUALMODE_REGSIMULT;
  34.   multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
  35.   multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  36.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  37.   {
  38.     Error_Handler();
  39.   }
  40.   /** Configure Regular Channel
  41.   */
  42.   sConfig.Channel = ADC_CHANNEL_16;
  43.   sConfig.Rank = ADC_REGULAR_RANK_1;
  44.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  45.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  46.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  47.   sConfig.Offset = 0;
  48.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  49.   {
  50.     Error_Handler();
  51.   }
  52.   /** Configure Regular Channel
  53.   */
  54.   sConfig.Channel = ADC_CHANNEL_17;
  55.   sConfig.Rank = ADC_REGULAR_RANK_2;
  56.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  57.   {
  58.     Error_Handler();
  59.   }
  60.   /* USER CODE BEGIN ADC1_Init 2 */

  61. //        if(HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED) != HAL_OK)
  62. //        {
  63. //                Error_Handler();
  64. //        }

  65.   /* USER CODE END ADC1_Init 2 */

  66. }

  67. /**
  68.   * @brief ADC2 Initialization Function
  69.   * @param None
  70.   * @retval None
  71.   */
  72. static void MX_ADC2_Init(void)
  73. {

  74.   /* USER CODE BEGIN ADC2_Init 0 */

  75.   /* USER CODE END ADC2_Init 0 */

  76.   ADC_ChannelConfTypeDef sConfig = {0};

  77.   /* USER CODE BEGIN ADC2_Init 1 */
  78.         ADC_MultiModeTypeDef multimode = {0};
  79.   /* USER CODE END ADC2_Init 1 */
  80.   /** Common config
  81.   */
  82.   hadc2.Instance = ADC2;
  83.   hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  84.   hadc2.Init.Resolution = ADC_RESOLUTION_16B;
  85.   hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  86.         // hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  87.   hadc2.Init.EOCSelection = DISABLE;
  88.   hadc2.Init.LowPowerAutoWait = DISABLE;
  89.   hadc2.Init.ContinuousConvMode = ENABLE;
  90.   hadc2.Init.NbrOfConversion = 2;
  91.   hadc2.Init.DiscontinuousConvMode = DISABLE;
  92.   hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
  93.   hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  94.   hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  95.   hadc2.Init.OversamplingMode = DISABLE;
  96.   if (HAL_ADC_Init(&hadc2) != HAL_OK)
  97.   {
  98.     Error_Handler();
  99.   }
  100.         HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
  101.         multimode.Mode = ADC_DUALMODE_REGSIMULT;
  102.   multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
  103.   multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  104.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  105.   {
  106.     Error_Handler();
  107.   }
  108.   /** Configure Regular Channel
  109.   */
  110.   sConfig.Channel = ADC_CHANNEL_4;
  111.   sConfig.Rank = ADC_REGULAR_RANK_1;
  112.   sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  113.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  114.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  115.   sConfig.Offset = 0;
  116.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  117.   {
  118.     Error_Handler();
  119.   }
  120.   /** Configure Regular Channel
  121.   */
  122.   sConfig.Channel = ADC_CHANNEL_8;
  123.   sConfig.Rank = ADC_REGULAR_RANK_2;
  124.   if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  125.   {
  126.     Error_Handler();
  127.   }
  128.   /* USER CODE BEGIN ADC2_Init 2 */
  129. //        if(HAL_ADCEx_Calibration_Start(&hadc2,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED) != HAL_OK)
  130. //        {
  131. //                Error_Handler();
  132. //        }
  133.   /* USER CODE END ADC2_Init 2 */

  134. }

  135. /**
  136.   * Enable DMA controller clock
  137.   */
  138. static void MX_DMA_Init(void)
  139. {

  140.   /* DMA controller clock enable */
  141.   __HAL_RCC_DMA1_CLK_ENABLE();
  142.   __HAL_RCC_DMA2_CLK_ENABLE();

  143.   /* DMA interrupt init */
  144.   /* DMA1_Stream1_IRQn interrupt configuration */
  145.   HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
  146.   HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
  147.   /* DMA2_Stream0_IRQn interrupt configuration */
  148.   HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 1);
  149.   HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

  150. }
复制代码

  1. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   if(hadc->Instance==ADC1)
  5.   {
  6.   /* USER CODE BEGIN ADC1_MspInit 0 */

  7.   /* USER CODE END ADC1_MspInit 0 */
  8.     /* Peripheral clock enable */
  9.     HAL_RCC_ADC12_CLK_ENABLED++;
  10.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  11.       __HAL_RCC_ADC12_CLK_ENABLE();
  12.     }
  13.   
  14.     __HAL_RCC_GPIOA_CLK_ENABLE();
  15.     /**ADC1 GPIO Configuration   
  16.     PA1     ------> ADC1_INP17
  17.     PA0     ------> ADC1_INP16
  18.     */
  19.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0;
  20.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  21.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  22.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  23.     /* ADC1 DMA Init */
  24.     /* ADC1 Init */
  25.     hdma_adc1.Instance = DMA1_Stream1;
  26.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
  27.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  28.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  29.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  30.     hdma_adc1.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD;
  31.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  32.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
  33.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
  34.     hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  35.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  36.     {
  37.       Error_Handler();
  38.     }

  39.     __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);

  40.   /* USER CODE BEGIN ADC1_MspInit 1 */

  41.   /* USER CODE END ADC1_MspInit 1 */
  42.   }
  43.   else if(hadc->Instance==ADC2)
  44.   {
  45.   /* USER CODE BEGIN ADC2_MspInit 0 */

  46.   /* USER CODE END ADC2_MspInit 0 */
  47.     /* Peripheral clock enable */
  48.     HAL_RCC_ADC12_CLK_ENABLED++;
  49.     if(HAL_RCC_ADC12_CLK_ENABLED==1){
  50.       __HAL_RCC_ADC12_CLK_ENABLE();
  51.     }
  52.   
  53.     __HAL_RCC_GPIOC_CLK_ENABLE();
  54.     /**ADC2 GPIO Configuration   
  55.     PC4     ------> ADC2_INP4
  56.     PC5     ------> ADC2_INP8
  57.     */
  58.     GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  59.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  60.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  61.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  62.     /* ADC2 DMA Init */
  63.     /* ADC2 Init */
  64.     hdma_adc2.Instance = DMA2_Stream0;
  65.     hdma_adc2.Init.Request = DMA_REQUEST_ADC2;
  66.     hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
  67.     hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
  68.     hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
  69.     hdma_adc2.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD;
  70.     hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  71.     hdma_adc2.Init.Mode = DMA_CIRCULAR;
  72.     hdma_adc2.Init.Priority = DMA_PRIORITY_HIGH;
  73.     hdma_adc2.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  74.     if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)
  75.     {
  76.       Error_Handler();
  77.     }

  78.     __HAL_LINKDMA(hadc,DMA_Handle,hdma_adc2);

  79.   /* USER CODE BEGIN ADC2_MspInit 1 */

  80.   /* USER CODE END ADC2_MspInit 1 */
  81.   }

  82. }
复制代码

  1. void DMA1_Stream1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN DMA1_Stream1_IRQn 0 */

  4.   /* USER CODE END DMA1_Stream1_IRQn 0 */
  5.   HAL_DMA_IRQHandler(&hdma_adc1);
  6.   /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
  7.   /* USER CODE END DMA1_Stream1_IRQn 1 */
  8. }
复制代码

  1. //dma中断adc进行取数据,该函数会被DMA1_Stream1_IRQHandler调用
  2. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  3. {
  4.         uint16_t i,j=0;
  5.         //SCB_DisableDCache();
  6.         //对于F7带Cache需要注意,读取DMA前先关闭

  7.         flag=1;
  8.         if(flag)
  9.         {
  10.                 /* USER CODE END WHILE */
  11.                  //SCB_InvalidateDCache_by_Addr((uint32_t *)g_usADC1_Data,  sizeof(g_usADC1_Data));
  12.                  SCB_DisableDCache();
  13.                  for(i=0;i<200;)
  14.                  {
  15.                                 adc1_rx1[j] = g_usADC1_Data[i]&0xffff;     
  16.                                 adc1_rx2[j] = g_usADC1_Data[i+1]&0xffff;
  17.                                 adc2_rx1[j] = g_usADC1_Data[i]>>16;
  18.                                 adc2_rx2[j] = g_usADC1_Data[i+1]>>16;
  19.                                 j++;
  20.                                 i+=2;
  21.                  }
  22.         }
  23.         flag =0;
  24.                 SCB_EnableDCache();       
  25.          //对于F7带Cache需要注意,读取DMA完成后再打开
  26. }
复制代码
vanaua 回答时间:2020-3-5 17:13:06
最后在main函数中,使用
  1.         //HAL_ADC_Start(&hadc2);
  2.         ADC_Enable(&hadc2);
  3.         ADC12_COMMON->CCR|=0x10<<14;
  4.         HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t *)g_usADC1_Data, 200);
复制代码


但是,我在接收数据的时候总是失败,这是怎么回事呀
12

所属标签

相似问题

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