请选择 进入手机版 | 继续访问电脑版

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

stm32一个ADC,使用两个通道,可以同时采集吗?不使用DMA

[复制链接]
小乐子531 提问时间:2019-4-3 11:01 /
stm32一个ADC,使用两个通道,可以同时采集吗?不使用DMA我使用后,传输的数据全部是后一个通道的值,不知道什么原因?求大神帮忙解决。
应该是存入同一个寄存器,覆盖了才结束标志位,请问怎么解决。

1 收藏 评论8 发布时间:2019-4-3 11:01

举报

8个回答
wenyangzeng 回答时间:2019-4-3 11:49:14
2个以上ADC采样必须设置成扫描模式:

ADC_InitStructure.ADC_ScanConvMode = ENABLE;

评分

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

查看全部评分

edmundlee 回答时间:2019-4-3 12:27:27
一个ADC靠开关选择其中之一的通道采样, 能怎样同时?二个开关同时闭合?子细想想都知道这是不可能的

评分

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

查看全部评分

七哥 回答时间:2019-4-3 12:32:52
DMA很好用的。
把DMA开成循环模式,ADC用扫描+持续方式;什么时候想要ADC数据了,直接从数组往出读就可以了。除了有点浪费DMA时间和费点电之外,很省事。
  1. /**
  2.   * @brief  DMA1 channel1 configuration
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void DMA1_Configuration(void)
  7. {
  8.   /* DMA1 channel1 configuration ----------------------------------------------*/
  9.   DMA_DeInit(DMA1_Channel1);
  10.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  11.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1ConvertedValue;
  12.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  13.   DMA_InitStructure.DMA_BufferSize = 64;
  14.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  15.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  16.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  17.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  18.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  19.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  20.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  21.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
  22.   /* Enable DMA1 channel1 */
  23.   DMA_Cmd(DMA1_Channel1, ENABLE);
  24. }

  25. /**
  26.   * @brief  ADC1 configuration
  27.   * @param  None
  28.   * @retval None
  29.   */
  30. void ADC1_Configuration(void)
  31. {
  32.   /* ADC1 configuration ------------------------------------------------------*/
  33.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  34.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  35.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  36.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  37.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  38.   ADC_InitStructure.ADC_NbrOfChannel = 4;
  39.   ADC_Init(ADC1, &ADC_InitStructure);

  40.   /* ADC1 regular channels configuration */
  41.   ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5);
  42.   ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_239Cycles5);
  43.   ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_239Cycles5);
  44.   ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 4, ADC_SampleTime_239Cycles5);   
  45.   /* Enable ADC1 DMA */
  46.   ADC_DMACmd(ADC1, ENABLE);
  47.   /* Enable ADC1 */
  48.   ADC_Cmd(ADC1, ENABLE);
  49.   /* Tsensor Vref ENABLE */
  50.   ADC_TempSensorVrefintCmd(ENABLE);

  51.   /* Enable ADC1 reset calibaration register */   
  52.   ADC_ResetCalibration(ADC1);
  53.   /* Check the end of ADC1 reset calibration register */
  54.   while(ADC_GetResetCalibrationStatus(ADC1));

  55.   /* Start ADC1 calibaration */
  56.   ADC_StartCalibration(ADC1);
  57.   /* Check the end of ADC1 calibration */
  58.   while(ADC_GetCalibrationStatus(ADC1));

  59.   /* Start ADC1 Software Conversion */
  60.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  61. }
复制代码


评分

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

查看全部评分

大陶 回答时间:2019-4-3 12:59:05
可以的啊 可以双通道 规则采样 现在第一个通道 后采集第二个通道

评分

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

查看全部评分

一代睡神的崛起 回答时间:2019-4-4 13:36:46
datasheet上讲得很详细了,ADC采样存在几种不同的模式,但是同时使能通道采集是没有这种说法的

评分

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

查看全部评分

lida 回答时间:2019-4-9 16:49:09
顶下楼主,正在做这块。
yulanhao 回答时间:2019-4-9 18:58:55
我也在纠结这个问题 哈哈哈 过两天看看数据手册
shuuei 回答时间:2021-2-3 14:02:53
同问题。。。寄存器只有一个。。。目前一个ADC俩通道,发现寄存器中两个通道的值都会显示。

所属标签

相似问题

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