[STM32L0]

求助多通道ADC切换问题

[复制链接]
4119|27
手机看帖
扫描二维码
随时随地手机跟帖
wei816|  楼主 | 2017-7-19 11:43 | 显示全部楼层 |阅读模式
  AdcHandle.Instance = ADC1;

  AdcHandle.Init.OversamplingMode      = DISABLE;

  AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;
  AdcHandle.Init.LowPowerAutoPowerOff  = DISABLE;
  AdcHandle.Init.LowPowerFrequencyMode = ENABLE;
  AdcHandle.Init.LowPowerAutoWait      = DISABLE;

  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.SamplingTime          = ADC_SAMPLETIME_7CYCLES_5;
  AdcHandle.Init.ScanConvMode          = ADC_SCAN_DIRECTION_FORWARD;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.ContinuousConvMode    = ENABLE;
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  AdcHandle.Init.DMAContinuousRequests = DISABLE;

  /* Initialize ADC peripheral according to the passed parameters */
  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    Error_Handler();
  }

  /* ### - 2 - Start calibration ############################################ */
  if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK)
  {
    Error_Handler();
  }
while(1)
{
                sConfig.Channel = ADC_CHANNEL_3;
                sConfig.Rank = 1;
                HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
                HAL_ADC_Start(&AdcHandle);
                while(__HAL_ADC_GET_FLAG(&AdcHandle,ADC_FLAG_EOC) == RESET){;}
                ADC3 = HAL_ADC_GetValue(&AdcHandle);
               
                sConfig.Channel = ADC_CHANNEL_4;
                sConfig.Rank = 1;
                HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
                HAL_ADC_Start(&AdcHandle);
                while(__HAL_ADC_GET_FLAG(&AdcHandle,ADC_FLAG_EOC) == RESET){;}
                ADC4 = HAL_ADC_GetValue(&AdcHandle);
}

上面是ADC部分的主要代码,仿真时ADC3和ADC4读出来的数据都是adc3的值。
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);这个函数不起作用。
仿真进入该函数
  if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) != RESET)
  {
    /* Update ADC state machine to error */
    SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
    /* Process unlocked */
    __HAL_UNLOCK(hadc);
    return HAL_ERROR;
  }
由于这个返回错误,没有执行后面切换通道的赋值。
对于ADC_IS_CONVERSION_ONGOING_REGULAR(hadc)函数不是很理解。
请大神帮忙看下需要怎么修改,谢谢。


mmuuss586| | 2017-7-19 16:07 | 显示全部楼层
HAL库不熟;

你设置成多通道顺序采样好了,读不同的地址的数据就好了

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wei816 + 3
df_flying| | 2017-7-19 16:49 | 显示全部楼层
你这设置太麻烦了吧...你可以用中断,在中断里处理。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wei816 + 3
wei816|  楼主 | 2017-7-19 17:01 | 显示全部楼层
df_flying 发表于 2017-7-19 16:49
你这设置太麻烦了吧...你可以用中断,在中断里处理。

问题解决了。。。hal库不实用。。。要改库函数。。。

使用特权

评论回复
zhuotuzi| | 2017-7-19 22:56 | 显示全部楼层
官方的HAL库提供的例子啊。里面修改那个切换的地方

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wei816 + 3
zhuotuzi| | 2017-7-19 22:56 | 显示全部楼层
虽然都知道标准库好用,但是HAL更通用。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
wei816 + 3
usysm| | 2017-7-19 23:22 | 显示全部楼层
切换通道存在问题吗

使用特权

评论回复
htmlme| | 2017-7-19 23:22 | 显示全部楼层
一般都是顺序采样。

使用特权

评论回复
touser| | 2017-7-19 23:23 | 显示全部楼层
ADC_IS_CONVERSION_ONGOING_REGULAR这个有什么问题

使用特权

评论回复
wwppd| | 2017-7-19 23:24 | 显示全部楼层
使用顺序转换模式。

使用特权

评论回复
jkl21| | 2017-7-19 23:24 | 显示全部楼层
用ADC连续采集11路模拟信号

使用特权

评论回复
eefas| | 2017-7-19 23:24 | 显示全部楼层
独立单次采集不可行。

使用特权

评论回复
backlugin| | 2017-7-19 23:25 | 显示全部楼层
多通道能够采集多路的模拟信号

使用特权

评论回复
fengm| | 2017-7-19 23:25 | 显示全部楼层
用DMA实现的STM32ADC多通道采集

使用特权

评论回复
1988020566| | 2017-7-19 23:26 | 显示全部楼层
DC可以独立使用,也可以使用双重模式

使用特权

评论回复
usysm| | 2017-7-19 23:26 | 显示全部楼层
不都是顺序执行ADC吗?

使用特权

评论回复
htmlme| | 2017-7-19 23:26 | 显示全部楼层
可能切换采样通道需要一定的时间间隔吧。

使用特权

评论回复
touser| | 2017-7-19 23:26 | 显示全部楼层
这个没有执行过这个代码函数。

使用特权

评论回复
wwppd| | 2017-7-19 23:26 | 显示全部楼层
多通道采样使用DMA赋值。

使用特权

评论回复
jkl21| | 2017-7-19 23:26 | 显示全部楼层
DMA传输到内存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

495

帖子

6

粉丝