蓝桥杯嵌入式学习——扩展板双路ADC

        抓紧时间备赛,冲!

目录

一. STM32CubeMX 配置

1. 配置引脚

2. 设置采样时间

二. 代码编写

1. adc.c 文件

2. adc.h 文件

3. main.c 文件

三. 注意事项

结语


一. STM32CubeMX 配置

1. 配置引脚

2. 设置采样时间

       STM32CubeMX配置完成

二. 代码编写

1. adc.c 文件

#include "adc.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

ADC_HandleTypeDef hadc2;


void MX_ADC2_Init(void)
{

  /* USER CODE BEGIN ADC2_Init 0 */

  /* USER CODE END ADC2_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC2_Init 1 */

  /* USER CODE END ADC2_Init 1 */
  /** Common config
  */
  hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc2.Init.Resolution = ADC_RESOLUTION_12B;
  hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc2.Init.GainCompensation = 0;
  hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = DISABLE;
  hadc2.Init.NbrOfConversion = 2;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc2.Init.DMAContinuousRequests = DISABLE;
  hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc2.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_17;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_13;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC2_Init 2 */

  /* USER CODE END ADC2_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC2)
  {
  /* USER CODE BEGIN ADC2_MspInit 0 */

  /* USER CODE END ADC2_MspInit 0 */
    /* ADC2 clock enable */
    __HAL_RCC_ADC12_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**ADC2 GPIO Configuration
    PA4     ------> ADC2_IN17
    PA5     ------> ADC2_IN13
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN ADC2_MspInit 1 */

  /* USER CODE END ADC2_MspInit 1 */
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{

  if(adcHandle->Instance==ADC2)
  {
  /* USER CODE BEGIN ADC2_MspDeInit 0 */

  /* USER CODE END ADC2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ADC12_CLK_DISABLE();

    /**ADC2 GPIO Configuration
    PA4     ------> ADC2_IN17
    PA5     ------> ADC2_IN13
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5);

  /* USER CODE BEGIN ADC2_MspDeInit 1 */

  /* USER CODE END ADC2_MspDeInit 1 */
  }
}


uint16_t get_adc2(void)
{
	uint16_t adc;
	HAL_ADC_Start(&hadc2);
	if(HAL_ADC_PollForConversion(&hadc2,100)==HAL_OK)
	{
		adc=HAL_ADC_GetValue(&hadc2);
	}
	return adc;
}

2. adc.h 文件

#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

extern ADC_HandleTypeDef hadc2;

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void MX_ADC2_Init(void);
uint16_t get_adc2(void);


3. main.c 文件

        放部分关键代码

#include "main.h"
#include "stdio.h"
#include "lcd.h"
#include "tim.h"
#include "adc.h"


//模块计时
__IO uint32_t Lcd_uwTick=0;


/*函数声明------------------------------------------------------------------------------*/

void lcd(void);


/*主函数------------------------------------------------------------------------------*/
int main(void)
{
  HAL_Init();
  SystemClock_Config();//系统时钟设置
  KEY_Init();//按键初始化
	
  TIM2_Init();//定时器2初始化 100ms
  HAL_TIM_Base_Start_IT(&htim2);//启动定时器2中断工作模式
  MX_ADC2_Init();//ADC2初始化 R37 PB15
	

  LCD_Init();//LCD初始化
  LCD_Clear(Black);//清屏
  LCD_SetBackColor(Black);//背景颜色
  LCD_SetTextColor(White);//文本颜色
  while (1)
  {
//		HAL_Delay(500);
  }
}
/*常用函数------------------------------------------------------------------------------*/
void lcd()//LCD显示模块
{
	if (uwTick - Lcd_uwTick < 200) return; 
	Lcd_uwTick = uwTick;
	
	//扩展板ADC电压值显示
	sprintf(a," ADC2:%5.3f V %5.3f V",get_adc2()*3.3/4096,get_adc2()*3.3/4096);
	LCD_DisplayStringLine(Line0,(unsigned char *)a);

}



//定时器中断处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM2)
	{
		lcd();//屏幕显示
		
	}
}


三. 注意事项

(1)由于是双通道,所以第一次读是一个通道(IN17),第二次是第二个通道(IN13)

(2)对应关系:PA4-AO1-RP5-IN17

结语

        没想到还比较简单,学的很快

        是没想到用sprintf函数运行是从后面的参数开始运行的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值