蓝桥杯嵌入式 ---- “空手套白狼“ 之 ADC


前言

本文是基于嵌入式开发板CT117E,stm32f103RBT6。"空手套白狼"就是直接利用官方给的库(v3.5),进行拷贝修改形成可以正常运行的代码。

一、原理图

在这里插入图片描述
在这里插入图片描述

二、由原理图得到的信息

  • 可调变阻器连接的是PB0,查芯片手册得是ADC1的8通道。

三、ADC1初始化

1.adc的采集需要初始化开发板上的可变电阻器的连接io口,PB0,连接的是开发板的ADC1,通道8。

2. 需要初始化两个结构体,一个是GPIO,一个是自身的结构体。这里不使用中断模式,我们使用软件使能获取adc数据。

3. 初始化函数: 复制拷贝库文件,不用自己敲代码记结构体名字。打开固件库的ADC目录RegSimul_DualMode,178行的GPIO初始化直接复制,修改端口;86行有ADC1的初始化结构体,到95行,修改初始化通道数为1,选择为独立模式和disable多通道扫描;最后修改95行规则通道初始化函数为通道8;最后我们需要使能ADC1,开启复位校准,等待,开启校准,等待,开启软件启动ADC1;


STM32固件库代码V3.5版\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\RegSimul_DualMode\main.c


void adc_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  	GPIO_Init(GPIOB, &GPIO_InitStructure);

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //独立模式
  	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;      //连续转换
 	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 	ADC_InitStructure.ADC_NbrOfChannel = 1;
  	ADC_Init(ADC1, &ADC_InitStructure);
 	/* ADC1 regular channels configuration */ 
 	ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5); 
	
		/* Enable ADC1 */
	ADC_Cmd(ADC1, ENABLE);
	  /* Enable Vrefint channel17 */
	//ADC_TempSensorVrefintCmd(ENABLE);
	
	  /* Enable ADC1 reset calibration register */   
	ADC_ResetCalibration(ADC1);
	  /* Check the end of ADC1 reset calibration register */
	while(ADC_GetResetCalibrationStatus(ADC1));
	
	  /* Start ADC1 calibration */
    ADC_StartCalibration(ADC1);
	  /* Check the end of ADC1 calibration */
	while(ADC_GetCalibrationStatus(ADC1));

	ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //容易忘记漏掉
   	
}

四、ADC获取数据函数

ADC_GetConversionValue(ADC1);  //获取ADC的12位数据值,库函数直接使用

五、ADC在主函数的应用方法

float adc_val;
while(1)
{
	if(adc_flag==1)        //这个标志位在滴答计时器的中断中,每100ms置1,也就是adc的刷新时间0.1s
	{
	  adc_val=ADC_GetConversionValue(ADC1);   //这里获取到的是12位的adc数据
	  sprintf((char *)adc_buff,"ADC: %0.2f" ,adc_val/0xfff*3.3);  //转换为电压值,0-3.3,然后以字符串的形式存放在adc_buff中,用于在lcd显示上。
	  adc_flag=0;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值