当前位置:网站首页>STM32---ADC

STM32---ADC

2022-07-05 08:16:00 chen_ bx

ADC Read the port voltage value

Preface

routine : adopt ADC Read PA1 The port collects the voltage value Print through serial port
ADC Input range 2.4V~3.6V Connecting too much voltage will burn the port
Reference self punctual atom

10X series ADC Channel pin relationship

 Insert picture description here
 Insert picture description here

Code

//main.c  Code 
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>
#include "adc.h"
#include "delay.h"
int main(void)
{
    
	u16 adcx;
	float temp;
	Usart_Init();
	delay_init();
	Adc_Cfg();
	printf("hello,ADC!");
	delay_ms(1000);
	while(1){
    
		adcx=Get_Adc_Average(ADC_Channel_1,10);
		printf("adcx:%d",adcx);
		temp=(float)adcx*(3.3/4096);
		printf("V:%f",temp);
		}
}
//adc.c  Code 
#include "adc.h"
#include "delay.h"

static void Adc_GPIO_Cfg(void)
{
    
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// frequency division 
	
	ADC_DeInit(ADC1);


}
void Adc_Cfg(void)
{
    
	Adc_GPIO_Cfg();
	ADC_InitTypeDef ADC_InitStructure;
	
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);
	
	ADC_ResetCalibration(ADC1);
	
	while(ADC_GetResetCalibrationStatus(ADC1));
	
	ADC_StartCalibration(ADC1);
	
	while(ADC_GetCalibrationStatus(ADC1));
}	

// get ADC value 
//ch: Value channel  0~3
u16 Get_Adc(u8 ch)   
{
    
  	// Set the specified ADC The rule group channel for , A sequence , Sampling time 
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC passageway , The sampling time is 239.5 cycle  
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		// Enable to designate ADC1 Software conversion start function  
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));// Wait for the conversion to finish 

	return ADC_GetConversionValue(ADC1);	// Go back to the last time ADC1 Conversion result of rule group 
}

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 temp_val/times;
}
//adc.h  Code 
#ifndef _ADC_H
#define _ADC_H

#include "stm32f10x.h"

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

Serial port print results

 Insert picture description here
adcx:3891
V:3.134V
The port is floating input The read value is 3.134V
 Insert picture description here
PA1 Port connection GND After the ground
adcx:0
V:0V
The port read value is 0V

 Insert picture description here
PA1 Port connection 3.3V after
adcx:4095
V:3.299V
The port read value is 3.299V

ADC Read the internal temperature of the chip

Preface

routine :ADC Read the internal temperature of the chip and output the read temperature value through the serial port
Reference self punctual atom

Block diagram of internal temperature sensor

 Insert picture description here
 Insert picture description here

Precautions for use of internal temperature sensor

 Insert picture description here
 Insert picture description here
 Insert picture description here
 Insert picture description here

Code

//main.c Code 
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>
#include "adc.h"
#include "delay.h"
int main(void)
{
    
	float temp;
	Usart_Init();
	delay_init();
	Adc_Cfg();
	printf("hello,ADC!");
	delay_ms(1000);
	while(1){
    
		temp=Get_Temprate();
		printf("temp:%f\n",temp);
		}
}
//adc.c  Code 
#include "adc.h"
#include "delay.h"

static void Adc_GPIO_Cfg(void)
{
    
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);// frequency division 
	
	ADC_DeInit(ADC1);


}
void Adc_Cfg(void)
{
    
	Adc_GPIO_Cfg();
	ADC_InitTypeDef ADC_InitStructure;
	
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_TempSensorVrefintCmd(ENABLE); // Turn on the internal temperature sensor 
	
	ADC_Cmd(ADC1,ENABLE);
	
	ADC_ResetCalibration(ADC1);
	
	while(ADC_GetResetCalibrationStatus(ADC1));
	
	ADC_StartCalibration(ADC1);
	
	while(ADC_GetCalibrationStatus(ADC1));
}	

// get ADC value 
//ch: Value channel  0~3
u16 Get_Adc(u8 ch)   
{
    
  	// Set the specified ADC The rule group channel for , A sequence , Sampling time 
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC passageway , The sampling time is 239.5 cycle  
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		// Enable to designate ADC1 Software conversion start function  
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));// Wait for the conversion to finish 

	return ADC_GetConversionValue(ADC1);	// Go back to the last time ADC1 Conversion result of rule group 
}

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 temp_val/times;
} 	 

// Get the temperature value 
// Return value : Temperature value ( Expanded 100 times , Company :℃.)
double Get_Temprate(void)	// Obtain the temperature value of the internal temperature sensor 
{
    
	u32 adcx;
	double result;
 	double temperate;
	adcx=Get_Adc_Average(ADC_Channel_16,20);	// Read channel 16,20 Average the times 
	temperate=(float)adcx*(3.3/4096);		// Voltage value  
	result=(1.43-temperate)/0.0043+25;	// Convert to temperature value  
	return result;
}
//adc.h  Code 
#ifndef _ADC_H
#define _ADC_H

#include "stm32f10x.h"

void Adc_Cfg(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
double Get_Temprate(void);
#endif

Serial port print results

 Insert picture description here

原网站

版权声明
本文为[chen_ bx]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140545026286.html