main.c
#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
#include "adc.h"
int main()
{
u16 adc_val;
delay_init();
LCD_Init();
ADC1_Init();
while(1)
{
adc_val =get_ADC1_Average(ADC_Channel_1,5);
Draw_number(adc_val,0,0);
delay_ms(500);
}
}
adc.c
#include "stm32f10x.h"
#include "adc.h"
#include "delay.h"
void ADC1_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
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;//¹æÔòת»»Í¨µÀÊý1
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//µ¥Í¨µÀת»»
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//¸´Î»Ð£×¼¼Ä´æÆ÷
while(!ADC_GetResetCalibrationStatus(ADC1));//µÈ´ý¸´Î»Ð£×¼¼Ä´æÆ÷Íê³É
//delay(20);
ADC_StartCalibration(ADC1);
while(!ADC_GetCalibrationStatus(ADC1));
//delay(20);
}
uint16_t get_ADC1_Val(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
uint16_t get_ADC1_Average(u8 ch,u8 times)
{
uint16_t average = 0;
int i=0;
for(i=0;i<times;i++)
{
average+=get_ADC1_Val(ch);
delay_ms(5);
}
return average/times;
}
adc.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void ADC1_Init(void);
uint16_t get_ADC1_Val(u8 ch);
uint16_t get_ADC1_Average(u8 ch,u8 times);
#endif