STM32-ADC采集实例

本文详细介绍了STM32单通道和多通道ADC采集电位器及内部温度传感器数据的方法,包括轮询和中断两种方式,并提供了Cubemx配置示例。
摘要由CSDN通过智能技术生成

STM32-单通道采集实例

实验要求:

利用ADC采集FSM4中电位器的数据

原理图分析

cubemx配置

1.轮询采集ADC的数值

  uint32_t value;

  while (1)
  {
		/*轮询采集ADC的数值*/
		HAL_ADC_Start(&hadc1);//开启ADC,ADC进行采集
		if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)//判断标志位EOC是否置一,转换是完成
		{
			value = HAL_ADC_GetValue(&hadc1);
			printf("采样值 = %d  ",value);
			printf("电压值 = %.2fV\n", value*3.3/4096);
		}
		HAL_Delay(1000);	

2.中断采集ADC数值

  主函数循环中

uint32_t value = 0;//声明一个全局变量 
 while (1)
  {	
		HAL_ADC_Start_IT(&hadc1);
		HAL_Delay(1000);
   }

 回调函数中

extern uint32_t value;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if(hadc->Instance == ADC1){
		value = HAL_ADC_GetValue(&hadc1);
			printf("采样值 = %d  ",value);
			printf("电压值 = %.2fV\n", value*3.3/4096);
	}
}

STM32-多通道采集实例

实验要求:

利用ADC采集电位器及STM32内部温度传感器的数据

原理图分析

cubemx配置

函数中使用轮询实现

	uint32_t value = 0;
	
  while (1)
  {
		HAL_ADC_Start(&hadc1);
		
		if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK){
			value = HAL_ADC_GetValue(&hadc1);
			
			printf("value:%d  ", value);
			printf("ADC:%.2fV\n", value*3.3/4096);
		}
		
		if(HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK){
			value = HAL_ADC_GetValue(&hadc1);
			
			printf("value:%d  ", value);
			printf("ADC:%.2fV  ", value*3.3/4096);
			printf("temp:%.2f℃\n", (1.43 - (value*3.3/4096))/0.043 + 25);
		}
		
		HAL_Delay(1000);
		

实验现象

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用STM32F103C8T6的ADC(模数转换器)进行采集的简单实例。 首先,我们需要在STM32CubeMX中配置ADC。在“Pinout & Configuration”选项卡中,选择ADC1并将其配置为“Regular Conversion Mode”。选择要使用的通道(例如PA0),并将采样时间设置为适当的值。然后,确保在“Clock Configuration”选项卡中启用了ADC时钟。 接下来,我们需要在代码中初始化ADC并启动采样。以下是一个示例函数,它将初始化ADC并连续采样通道0,然后返回ADC值: ``` uint16_t adc_read(void){ ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; HAL_ADC_Init(&hadc); ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5; HAL_ADC_ConfigChannel(&hadc, &sConfig); HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); uint16_t value = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); return value; } ``` 我们将使用HAL库来初始化ADC并进行采样。在这个函数中,我们首先初始化了ADC的配置结构体,并设置了采样模式为连续采样,通道为0,数据对齐方式为右对齐,转换数量为1。然后我们通过调用`HAL_ADC_Init()`函数来初始化ADC。 接下来,我们配置了通道0的采样时间和排名,并通过调用`HAL_ADC_ConfigChannel()`函数来配置ADC通道。 然后,我们启动ADC并等待转换完成,这可以通过调用`HAL_ADC_Start()`和`HAL_ADC_PollForConversion()`函数来完成。最后,我们获取ADC值并停止ADC转换。 在主函数中,我们可以调用`adc_read()`函数来读取ADC值,并将其打印到串口: ``` int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_ADC1_Init(); while (1){ uint16_t value = adc_read(); printf("ADC Value: %d\n", value); HAL_Delay(1000); } } ``` 现在,我们已经成功地使用STM32F103C8T6的ADC模块进行了采集。我们可以将该模块与其他传感器一起使用,例如光敏电阻或温度传感器,以测量环境参数并执行控制操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值