嵌入式学习:STM32之ADC

实验目的:熟悉STM32的基本操作和初始化操作
实验步骤:
1.开启PA口时钟和ADC1时钟,设置PA1为模拟输入
RCC_AHB1PeriphClockCmd
RCC_APB2PeriphClockCmd
GPIO_Init
2.复位ADC1,同时设置ADC1分频因子
ADC_DeInit
3.初始化ADC_CCR寄存器
ADC_CommonInit
4.初始化ADC1参数,设置ADC1的工作模式和规则序列的相关信息
ADC_Init
5.使能ADC
ADC_Cmd
6.配置规则通道参数
ADC_RegularChannelConfig
7.开启软件转换
ADC_SoftwareStartConv
8.等待转换完成,读取ADC值】
ADC_GetConversionValue

ADC.H代码:

#include "ADC.h"       //引入文件
#include "delay.h"
#include "sys.h"
#include "usart.h"

void Adc_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	ADC_CommonInitTypeDef  ADC_CommonInitStruct;
	ADC_InitTypeDef  ADC_InitStruct;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);    //时钟使能
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);     //GPIO口初始化
	
	ADC_DeInit();    //ADC复位
	
	ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled ;
	ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent ;
	ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div4 ;
	ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
	ADC_CommonInit(&ADC_CommonInitStruct);    //初始化ADC_CCR寄存器
	
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;
	ADC_InitStruct.ADC_NbrOfConversion=1;
	ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b;
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;
	ADC_Init(ADC1,&ADC_InitStruct);      //初始化ADC

	ADC_Cmd(ADC1,ENABLE);    //使能函数
}


u16 get_Adc(u8 ch)
{
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_480Cycles);   //配置规则通道参数
	ADC_SoftwareStartConv(ADC1);     //开启软件转换
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));  //判度是否转换完成,加入转换完成,状态值变为1,为1,则退出死循环;未转换成则为0,卡在循环
	return ADC_GetConversionValue(ADC1);      //返回一个ADC的转换值
}


u16 Get_Adc_Average(u8 ch,u8 times)      //计算多个的转换值,然后求平均值,其中times是次数,ch是每一次获得的值
{
	u32 temp_val=0;
	u8 i;
	for(i=0;i

main.c代码如下:

/*对于本实验而言,需要的部分函数初始化在网上有,可以自己查看
*/

int main(void)
{
	Adc_Init();//ADC初始化
	while(1)
	{
				adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道 5 的转换值, 取20次值求平均
		LCD_ShowxNum(134,130,adcx,4,16,0); //显示 ADCC 采样后的原始值
		temp=(float)adcx*(3.3/4096); //获取计算后的带小数的实际电压值,比如 3.1111
		adcx=temp; //赋值整数部分给 adcx 变量,因为 adcx 为 u16 整型
		LCD_ShowxNum(134,150,adcx,1,16,0); //显示电压值的整数部分
		temp-=adcx; //把已经显示的整数部分去掉,留下小数部分,比如 3.1111-3=0.1111
		temp*=1000;//小数部分乘以 1000,例如: 0.1111 就转换为 111.1,保留三位小数。
		LCD_ShowxNum(150,150,temp,3,16,0X80); //显示小数部分
		LED0=!LED0;    //LED亮,作为提示
		delay_ms(250);   
	}
}

你可能感兴趣的:(嵌入式)