Stm32 ADC功能实现

2018/5/11

stm32

1.说在前面:抽空学点32的内置外设

2.ADC功能的简单实现(单个通道的x次转化)

注:ADC:将连续变换的模拟量变为可视的数字量

库函数实现ADC对外部电压的测量(注:电压需小于3.3v,否则可能烧坏ADC)

过程:

1.开启ADC1和PA口时钟,设置PA1为模拟输入(通过PA1测试外部的电压)
2.复位ADC1,同时设置ADC1分频因子(注意等待复位以及频率要小于14MHZ)
3.初始化ADC1参数,设置ADC1的工作模式和规则序列
4.使能ADC 校准

5.读取ADC的值

相关代码:

 #include"adc.h"
 #include"delay.h"
																   
//ADC 
//将连续变换的模拟量转换为可视的数字量
//实现通过ADC1测试电压
//1.开启ADC1和PA口时钟,设置PA1为模拟输入(通过PA1测试外部的电压)
//2.复位ADC1,同时设置ADC1分频因子
//3.初始化ADC1参数,设置ADC1的工作模式和规则序列
//4.使能ADC 校准
//5.读取ADC的值
void Adc_Init()
{
	ADC_InitTypeDef ADC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	//实现GPIOA口和ADC1口的时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
	//设置分频因子(不能超过14HZ)
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置分屏系数为6
	
	//设置PA1为模拟输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//设置口为P1^1
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化函数
	
	//复位PA1的值
	ADC_DeInit(ADC1);//复位ADC1,将ADC1的值设置为缺省值
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//设置为独立模式
	//ADC实现单个通道的x次转换
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;//设计ADC为单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换模式
	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
	
	//使能ADC1
	ADC_Cmd(ADC1,ENABLE);
	//开启复位校准
	ADC_ResetCalibration(ADC1); 
	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
	ADC_StartCalibration(ADC1);//开启校准
	while(ADC_GetCalibrationStatus(ADC1));//等待复位校准结束	
}

//获得值
u16 Get_Adc(u8 ch)
{
	//设置规则组通道
	//ADC1 采样时间为239.5个周期
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
	
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1软件转换(前面设置的不为硬件转换)
	
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
	
	//返回最近一次ADC1规则组的转换结果
	//实现数值的读取
	return ADC_GetConversionValue(ADC1);
	
}
	//获得数值
	u16 Get_Adc_Average(u8 ch,u8 times)
	{
		u32 temp_val=0;
		u8 t;
		for(t=0;t<times;t++)
		{
			temp_val+=Get_Adc(ch);//返回数据
			delay_ms(5);
		}
		return times;//返回时刻(数组显示)
	}

头文件:

#ifndef __ADC_H
#define __ADC_H	
#include "sys.h"

void Adc_Init(void);
u16  Get_Adc(u8 ch); 
u16 Get_Adc_Average(u8 ch,u8 times); 
 
#endif 



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值