STM32ADC外设之应用(单通道ADC软件触发)

目录

一、实现效果概述

二、实现流程图

三、代码实现(HAL库)

(1)手敲版本

            MIC_ADC.c

main函数

(2)CubeMX配置版本

      选择具体MCU型号

配置晶振

​编辑 

配置ADC时钟

配置系统时钟树

​编辑 

 配置程序下载仿真接口

ADC外设配置

​编辑 工程存放路径配置

生成代码配置

最后一步:点击生成工程

​编辑 

最后在工程中自己写一些逻辑代码 


 

 

一、实现效果概述

使用麦克风拾音模块,采样到的模拟信号通过ADC外设转换,接着通过液晶屏显示ADC值的变化波形。

硬件环境(F103ZET6精英开发板+4.3寸液晶屏+拾音模块)

效果如图:

5eec3ca47bbe43ea8583193b9bb933d9.jpg

 

 

二、实现流程图

29c2b95276984b43a48f63dca7e44a05.png

三、代码实现(HAL库)

(1)手敲版本

            MIC_ADC.c

ADC_HandleTypeDef hadc1;    //句柄

void ADC1_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct = {0};  /* GPIO配置结构体*/
   ADC_ChannelConfTypeDef sConfig = {0};    /*ADC工作参数配置结构体*/
   RCC_PeriphCLKInitTypeDef ADC_CLK_Init={0}; /* ADC时钟配置结构体*/
   
    __HAL_RCC_ADC1_CLK_ENABLE();   
    __HAL_RCC_GPIOA_CLK_ENABLE();
   /* GPIO配置*/
  GPIO_InitStruct.Pin = GPIO_PIN_1;      
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
  /* ADC时钟配置*/
   ADC_CLK_Init.AdcClockSelection=RCC_ADCPCLK2_DIV6;//采样频率12M
   ADC_CLK_Init.PeriphClockSelection=RCC_PERIPHCLK_ADC;
   HAL_RCCEx_PeriphCLKConfig(&ADC_CLK_Init);
   /*ADC工作参数配置*/
  hadc1.Instance = ADC1;  
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; //失能扫描模式
  hadc1.Init.ContinuousConvMode = DISABLE;     //开启连续转换
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; //数据右对齐
  hadc1.Init.ExternalTrigConv=ADC_SOFTWARE_START;   //软件触发
  hadc1.Init.NbrOfConversion = 1;			 //转换通道数量
  HAL_ADC_Init(&hadc1);
   
  sConfig.Channel = ADC_CHANNEL_1;              // 18个通道之一
  sConfig.Rank = ADC_REGULAR_RANK_1;		   // 规则组系列1
  /*转换28.5个周期  即转换时间:12.5+28.5=41个周期   所需时间:41* 1/12M 约为 3.41微秒 */
  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5; 
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
  HAL_ADCEx_Calibration_Start(&hadc1);/* 校准:数据手册有具体描述*/
}
uint16_t ADC1_GetValue(void)
{
	
	HAL_ADC_Start(&hadc1);  //软件触发
	/*  函数名:HAL_ADC_PollForConversion(参数1,参数2)
	  参数2:等待超时完成时间 单位毫秒,这里根据具体情况进行调参,
	  我们这里只需要3.41微秒,具体参考程序源码介绍*/
	HAL_ADC_PollForConversion(&hadc1,5);  //等待转换完成,等待时间5毫秒
	return (uint16_t)HAL_ADC_GetValue(&hadc1);   //返回AD值
	
}

main函数

int main()
{
     
	
	HAL_Init();  
	SystemClock_Config(); //时钟配置
	ADC1_Init();   // ADC参数配置
	LCD_4_3_Init(1);	//横屏显示
	while(1)
	{
		NEW_LCD_4_3_Draw_DynamicalWave(1);  //显示波形
		LCD_Update(RED);
	}
		
}

(2)CubeMX配置版本

      选择具体MCU型号

c7fe93b20557419b8d8beb464bb40e59.png

配置晶振

cdd8cf2ee8ee4393b4438cde88ddf7e6.png

配置ADC时钟

c7e98db7992940ea9f41b4b24f62f9b4.png

配置系统时钟树

64ac5537d90848f1ad439d3083335719.png

 配置程序下载仿真接口

0ea79cdb14b94bccbc33ccf4e88b0cb0.png

ADC外设配置

802a84e91607428090012a639d6e719d.png 工程存放路径配置

8ea77421e1a5404090cb3e43f3a58774.png

生成代码配置

751039d8492749b88d1f7ef942eb6a98.png

最后一步:点击生成工程

8c8397eda829457a95ff266e37daa30d.png

最后在工程中自己写一些逻辑代码 

PS. 以上文章内容,如有错误,请大家不吝指正!

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32L051的ADC单通道采集模式下,可以通过以下步骤触发中断: 1. 配置ADC外设,包括时钟、采样时间、分辨率等参数。 2. 配置ADC转换模式为单通道模式,选择需要采集的通道,并使能ADC中断。 3. 配置NVIC中断向量表,使能ADC的中断。 4. 在主程序中开启ADC转换,等待ADC中断触发。 5. 在ADC中断服务函数中,读取转换数据寄存器,进行数据处理。 以下是代码示例: ``` // ADC配置 ADC_InitTypeDef ADC_InitStruct = {0}; ADC_InitStruct.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; ADC_InitStruct.Resolution = ADC_RESOLUTION_12B; ADC_InitStruct.ScanDirection = ADC_SCAN_DIRECTION_UPWARD; ADC_InitStruct.DataAlign = ADC_DATAALIGN_RIGHT; ADC_InitStruct.ScanMode = ADC_SCAN_DISABLE; ADC_InitStruct.ContinuousConvMode = DISABLE; ADC_InitStruct.DiscontinuousConvMode = DISABLE; ADC_InitStruct.NbrOfDiscConversion = 0; ADC_InitStruct.ExternalTrigConv = ADC_SOFTWARE_START; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } __HAL_ADC_ENABLE_IT(&hadc, ADC_IT_EOC); // ADC中断服务函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { uint32_t adc_value = HAL_ADC_GetValue(hadc); // 进行数据处理 } // 主程序 HAL_ADC_Start_IT(&hadc); while (1) { // 等待ADC中断触发 } ``` 在上述代码中,使用`HAL_ADC_Init()`和`HAL_ADC_ConfigChannel()`函数配置ADC外设和转换通道,使用`__HAL_ADC_ENABLE_IT()`函数使能ADC中断,使用`HAL_ADC_Start_IT()`函数开启ADC转换,并在主程序中等待ADC中断触发。在ADC中断服务函数中,使用`HAL_ADC_GetValue()`函数读取转换数据寄存器,并进行数据处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值