STM32 HAL ADC多通道

stm32F103c8系列的ADC ,本次选用PA2,PA3

 

Scan Conversion Mode( 扫描模式 ) 使用了多个通道ENABLE就是开启扫描模式,否则DISABLE

Continuous Conversion Mode(连续转换模式) 连续转换ENABLE,不连续则DISABLE开一次转换一次

Discontinuous Conversion Mode(间断模式) 多个通道则需使能ENABLE

number of Discontinous Conversions间断模式可以让扫描的2个通道进行分成四2个组,此为配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。

 

Enable Regular Conversions (启用常规转换模式)  

Number OF Conversion(转换通道数)    用了两个

Extenal Trigger Conversion Source (外部触发转换源) 选软件触发 

Rank 配置两个通道为哪个,且设置转换时间 

用print函数输出串口,则在usart.c中加入以下函数且勾选Use MicroLIB

/* USER CODE BEGIN 0 */ 
#include<stdio.h>
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/* USER CODE END 0 */

ADC函数

  /* USER CODE BEGIN 1 */
	uint8_t i;
	uint16_t adcBuf[2];
  /* USER CODE END 1 */

  /* USER CODE BEGIN 2 */
	HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准
  /* USER CODE END 2 */

HAL_ADC_Start(&hadc1);函数必须放入for,若不是则采集第一次的ADC通道,即PA2 

  while (1)
  {
    /* USER CODE END WHILE */		
		for(i=2;i<4;i++)
		{
				HAL_ADC_Start(&hadc1); //此开始函数必须放入for,若不是则采集第一次的ADC通道,即PA2
				HAL_ADC_PollForConversion(&hadc1,0xffff);
				adcBuf[i]=HAL_ADC_GetValue(&hadc1);
				printf("PA%d:  %.4fV\r\n",i,adcBuf[i]*3.3/4096);
		}
		HAL_ADC_Stop(&hadc1);
		HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

 

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
stm32hal库提供了多通道ADC的源码实现。下面是一个简要的示例代码,用于配置和读取STM32微控制器的ADC通道输入。 首先,我们需要在主函数中初始化ADC模块。假设我们使用的是STM32F4系列的微控制器,并且要使用ADC1和ADC2两个通道: ```c #include "stm32f4xx.h" void ADC_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2, ENABLE); ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = ENABLE; ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfConversion = 2; ADC_Init(ADC1, &ADC_InitStruct); ADC_Init(ADC2, &ADC_InitStruct); ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_84Cycles); ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_84Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_Cmd(ADC2, ENABLE); ADC_SoftwareStartConv(ADC1); } ``` 接下来,我们可以编写一个ADC读取函数,以获取ADC转换结果: ```c uint16_t ADC_Read(uint8_t channel) { ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_84Cycles); ADC_SoftwareStartConv(ADC1); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } ``` 通过调用ADC_Init()函数进行初始化,我们可以开始对ADC通道进行读取了。例如,我们希望读取ADC1的通道0和ADC2的通道1两个通道: ```c int main(void) { ADC_Init(); uint16_t result1 = ADC_Read(ADC_Channel_0); uint16_t result2 = ADC_Read(ADC_Channel_1); // result1为ADC1的通道0的转换结果 // result2为ADC2的通道1的转换结果 while(1); } ``` 这样,我们就可以使用stm32hal库来实现ADC的多通道读取。注意,以上代码只是一个示例,实际应用中可能需要根据具体需求进行更多的配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值