OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2306|回复: 15

STM32 18个通道全部采集怎么才能做到

[复制链接]

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
发表于 2019-4-3 18:52:16 | 显示全部楼层 |阅读模式
20金钱
1.   16个基本通道+  内部基准电压和温湿度
2. 使用DMA
3.使用HAL库
4.cubemx配置
我这里的问题是 Rank只有16个 导致我用了14个外部ADC绑定后  内部的没办法绑定

想一次性配置好那种 而不是动态切换配置

求助 在cubemx中该怎么配置啊  求配置图

最佳答案

查看完整内容[请看2#楼]

rank啥意思,随机数种子?还是通道数,扫描通道数?你设置多少就多少呀 你用16个通道adc1正好16个外部通道刚好呀,高于16个adc1 adc3一起用就可以了,因为规则最多16个 ADC1 16通道[/backcolor] 高于16个 分几个给adc3 F 6 7 8 9 10 adc1内部的就可以用了[/backcolor]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-3 18:52:17 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-4-3 20:41 编辑
Jyen 发表于 2019-4-3 20:13
另外ADC物理通道是固定的 你adc1+2 和用1有区别吗?

rank啥意思,随机数种子?还是通道数,扫描通道数?你设置多少就多少呀
你用16个通道adc1正好16个外部通道刚好呀,高于16个adc1 adc3一起用就可以了,因为规则最多16个
ADC1 16通道 adc dma 为每个通道开辟好滤波空间.rar (285.33 KB, 下载次数: 8)
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-3 19:03:19 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-4-3 19:11 编辑

ADC1--16+2   ADC3--5 两个adc一起工作最多 21+2内部肯定可以
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-3 20:11:54 | 显示全部楼层
nashui_sx 发表于 2019-4-3 19:03
ADC1--16+2   ADC3--5 两个adc一起工作最多 21+2内部肯定可以

什么意思  麻烦说清楚谢谢     adc1  16+2  但是rank  只有16个没办法绑定到DMA轮询啊  要重动态配置才行  但那样效率就低了  还可能破坏adc采样的连续性
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-3 20:13:05 | 显示全部楼层
nashui_sx 发表于 2019-4-3 19:03
ADC1--16+2   ADC3--5 两个adc一起工作最多 21+2内部肯定可以

另外ADC物理通道是固定的 你adc1+2 和用1有区别吗?
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 07:59:22 | 显示全部楼层
Jyen 发表于 2019-4-3 20:13
另外ADC物理通道是固定的 你adc1+2 和用1有区别吗?

一个adc最多16个规则通道,adc1内部外部一共18个,你要想全用上 那就adc1 16个 adc2 2个呀
用两个adc可以同时采样吧,比如俩通道你不想有一点时间误差,那就一个adc1 一个adc2 同时转换
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-4 09:30:52 | 显示全部楼层
nashui_sx 发表于 2019-4-3 18:52
rank啥意思,随机数种子?还是通道数,扫描通道数?你设置多少就多少呀
你用16个通道adc1正好16个外部通 ...

你看下把  这是ADC16个通道的初始化代码   再加上内部两个通道我就不会了   或者这时候必须要去除两个IO通道了



/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /**Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 16;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_3;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_3;
  sConfig.Rank = ADC_REGULAR_RANK_4;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = ADC_REGULAR_RANK_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_5;
  sConfig.Rank = ADC_REGULAR_RANK_6;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_6;
  sConfig.Rank = ADC_REGULAR_RANK_7;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_7;
  sConfig.Rank = ADC_REGULAR_RANK_8;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = ADC_REGULAR_RANK_9;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = ADC_REGULAR_RANK_10;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_10;
  sConfig.Rank = ADC_REGULAR_RANK_11;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_11;
  sConfig.Rank = ADC_REGULAR_RANK_12;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_12;
  sConfig.Rank = ADC_REGULAR_RANK_13;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_13;
  sConfig.Rank = ADC_REGULAR_RANK_14;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_14;
  sConfig.Rank = ADC_REGULAR_RANK_15;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_15;
  sConfig.Rank = ADC_REGULAR_RANK_16;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 09:32:41 | 显示全部楼层
Jyen 发表于 2019-4-4 09:30
你看下把  这是ADC16个通道的初始化代码   再加上内部两个通道我就不会了   或者这时候必须要去除两个IO ...

没用过hal库
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-4 09:32:56 | 显示全部楼层
nashui_sx 发表于 2019-4-3 18:52
rank啥意思,随机数种子?还是通道数,扫描通道数?你设置多少就多少呀
你用16个通道adc1正好16个外部通 ...

另外 也看了你的代码  你的也就是16个通道的  并没有读内部通道
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 11:43:05 | 显示全部楼层
Jyen 发表于 2019-4-4 09:32
另外 也看了你的代码  你的也就是16个通道的  并没有读内部通道

你把后俩注释了,吧注释的那俩打开不就可以了,只是给你测试下16个通道
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-4 12:24:56 | 显示全部楼层
nashui_sx 发表于 2019-4-4 11:43
你把后俩注释了,吧注释的那俩打开不就可以了,只是给你测试下16个通道

但是你这个不是DMA模式啊    我要使用DMA  就得绑定Rank啊  但是Rank只有16个
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-4 12:28:21 | 显示全部楼层
Jyen 发表于 2019-4-4 12:24
但是你这个不是DMA模式啊    我要使用DMA  就得绑定Rank啊  但是Rank只有16个

或者说  你这个dma  通道没看到你绑定   用的默认的?  默认的应该是按顺序的  但是你18个都开启  后面两个不也会被抛跳么
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-4 12:34:53 | 显示全部楼层
Jyen 发表于 2019-4-4 12:28
或者说  你这个dma  通道没看到你绑定   用的默认的?  默认的应该是按顺序的  但是你18个都开启  后面两 ...

我有说错了  贴你代码说吧   你看 你的第2和3个参数  ADC_Channel_1-ADC_Channel_15   是1-16   同样你注释掉的内部通道也是绑定15和16    这就意味着你全部开启(取消注释后)你gpio上的ADC_Channel_14,ADC_Channel_14  将不会实现dma的连续转换  因为你下面的内部通道绑定把它挤出去了   我不知道我这样描述您懂了没

                        ADC_RegularChannelConfig(ADC1, ADC_Channel_14,15, ADC_SampleTime_239Cycles5 );
                  ADC_RegularChannelConfig(ADC1, ADC_Channel_15,16, ADC_SampleTime_239Cycles5 );
//                        ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器,参考电压通道
//                        ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint,15, ADC_SampleTime_239Cycles5 );
//      ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor,16, ADC_SampleTime_239Cycles5 );
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 15:20:25 | 显示全部楼层
Jyen 发表于 2019-4-4 12:34
我有说错了  贴你代码说吧   你看 你的第2和3个参数  ADC_Channel_1-ADC_Channel_15   是1-16   同样你注 ...

我说的就是这意思呀,一个adc最多16个通道,挤出去的那俩放到adc2呀,有问题?
回复

使用道具 举报

7

主题

40

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-7-24
在线时间
13 小时
 楼主| 发表于 2019-4-8 10:41:24 | 显示全部楼层
nashui_sx 发表于 2019-4-4 15:20
我说的就是这意思呀,一个adc最多16个通道,挤出去的那俩放到adc2呀,有问题?

ADC2  区别不大2  ADC2只是通道切换过去  但是它只是切换绑定     物理通道只有16个   你把内部两个绑到adc2上面  adc1的就会失效对应两个  
算了  我不纠结这个了  直接做外部基准了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-8 19:08:31 | 显示全部楼层
Jyen 发表于 2019-4-8 10:41
ADC2  区别不大2  ADC2只是通道切换过去  但是它只是切换绑定     物理通道只有16个   你把内部两个绑到a ...

你还是没明白,内部通道只能用adc1,这样adc1就只有14个了,所以两个放到adc2
假如你超过16个外部,就adc3,不带adc3的无解
外挂也可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 22:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表