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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版