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

求HAL+ADC+DMA多路采集完整例程。

[复制链接]
tryfly 提问时间:2018-10-7 14:13 /
我板子F407VG
在网上找教程,都是怎么配置,我按着差不多配置完了,不知道怎么获取值,怎么得到结果。
下面放上我自己配置的,给大家看看有毛病不。

  1. <p>ADC_ChannelConfTypeDef sConfig;
  2.   ADC_MultiModeTypeDef multimode;
  3.    
  4.   hadc1.Instance = ADC1;
  5.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  6.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;//精度12bit
  7.   hadc1.Init.ScanConvMode = ENABLE;
  8.   hadc1.Init.ContinuousConvMode = ENABLE;
  9.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  10.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  11.   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_CC1;
  12.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据右对齐
  13.   hadc1.Init.NbrOfConversion = 8;//顺序转换8个通道的ADC值
  14.   hadc1.Init.DMAContinuousRequests = ENABLE;
  15.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  16.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  17.   {
  18.     _Error_Handler(__FILE__, __LINE__);
  19.   }

  20. multimode.Mode = ADC_MODE_INDEPENDENT;
  21.   if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }
  25. </p><p>
  26. </p><p>sConfig.Channel = ADC_CHANNEL_0;
  27.   sConfig.Rank = 1;
  28.   sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  29.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  30.   {  _Error_Handler(__FILE__, __LINE__);}
  31.         sConfig.Channel = ADC_CHANNEL_1;
  32.   sConfig.Rank = 2;
  33.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  34.   {  _Error_Handler(__FILE__, __LINE__);}
  35.         sConfig.Channel = ADC_CHANNEL_2;
  36.   sConfig.Rank = 3;
  37.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  38.   {  _Error_Handler(__FILE__, __LINE__);}
  39.         sConfig.Channel = ADC_CHANNEL_3;
  40.   sConfig.Rank = 4;
  41.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  42.   {  _Error_Handler(__FILE__, __LINE__);}
  43.         sConfig.Channel = ADC_CHANNEL_4;
  44.   sConfig.Rank = 5;
  45.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  46.   {  _Error_Handler(__FILE__, __LINE__);}
  47.         sConfig.Channel = ADC_CHANNEL_5;
  48.   sConfig.Rank = 6;
  49.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  50.   {  _Error_Handler(__FILE__, __LINE__);}
  51.         sConfig.Channel = ADC_CHANNEL_6;
  52.   sConfig.Rank = 7;
  53.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  54.   {  _Error_Handler(__FILE__, __LINE__);}
  55.         sConfig.Channel = ADC_CHANNEL_7;
  56.   sConfig.Rank = 8;
  57.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  58.   {  _Error_Handler(__FILE__, __LINE__);}</p><p>
  59. </p><p>下面是GPIO的配置我没放。</p>
复制代码


收藏 评论13 发布时间:2018-10-7 14:13

举报

13个回答
DavidTan 回答时间:2018-10-8 09:20:30
你用的是DMA吧?那就要打开DMA的转换,函数应该是这个 HAL_ADC_Start_DMA

评分

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

查看全部评分

wenyangzeng 回答时间:2018-10-8 09:59:18
ST官方就有代码可参考:

ADC_RegularConversion_DMA.rar (5.97 MB, 下载次数: 546)

评分

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

查看全部评分

tryfly 回答时间:2018-10-9 09:04:01
tgw860910 发表于 2018-10-8 09:20
你用的是DMA吧?那就要打开DMA的转换,函数应该是这个 HAL_ADC_Start_DMA

哦,那个函数我看到了,也用了,但是返回来的是0。。。。
并且不知道多路的怎么获取,难道定义个数组?然后传入数组名和长度?我试了,也是0.
tryfly 回答时间:2018-10-9 09:04:54
wenyangzeng 发表于 2018-10-8 09:59
ST官方就有代码可参考:

那个我看了,没有帮助啊,那个函数我用了,返回0.请看楼上我的描述。
wenyangzeng 回答时间:2018-10-9 10:24:08
sos博 发表于 2018-10-9 09:04
那个我看了,没有帮助啊,那个函数我用了,返回0.请看楼上我的描述。

ST官方例程一定没问题的,楼主应该检查一下自己的硬件了。
DavidTan 回答时间:2018-10-9 13:54:35
        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)Adcc_Val, ADCC_Channel_Max);

就是这样用啊,定义一个 Adcc_Val[ADCC_Channel_Max] 的数组,你在配置ADC的时候用了多少个RANK,这些AD值就会循环地写入这个数组,还有一个要注意的是,你在初始化配置的时候用的是TIM3 CH1的触发,你还得看看TIM3 CH1有没有工作,我建议你改成 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
butterflyspring 回答时间:2018-10-9 17:14:53
多路只能一个个去获取,而且要注意间隔时间

评分

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

查看全部评分

absdjko 回答时间:2018-11-10 08:42:26
感觉407的AD用、。。。。
absdjko 回答时间:2018-11-10 08:49:00
wenyangzeng 发表于 2018-10-8 09:59
ST官方就有代码可参考:

单通道的啊,问题是多通道就有问题了
wenyangzeng 回答时间:2018-11-10 10:28:31
absdjko 发表于 2018-11-10 08:49
单通道的啊,问题是多通道就有问题了

多通道只不过设 置一个二维数组供DMA存储数据,并设定ADC需要转换通道的参数、扫描方式即可。
彩虹萝卜 回答时间:2019-8-28 19:17:14
谢谢
generalcircuits 回答时间:2019-8-31 10:42:21
很有可能硬件的问题,官方给出的例程出错的可能性不大
router-34716 回答时间:2019-9-14 12:56:57
学习学习,谢了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版