adc.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);//读取ch通道的ad转换结果
u16 Get_Adc_Average(u8 ch,u8 times);//读取ch通道的times次ad转换的平均值
#endif
adc,c
#include "adc.h"
#include "stm32f10x.h"
void Adc_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //配置为模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC的输入时钟是由PCLK2经分频产生的,不可超过14MHz,72M/6=12M 15.2.15
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式 4.2.2
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式,单通道模式用DISABLE
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//采用软件触发的方式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//对齐方式:转换结果右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //转换通道数1
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE); //使能 4.2.4
ADC_ResetCalibration(ADC1); //ADC的校准,ADC校准要先使能 4.2.7
//while(ADC_GetResetCalibrationStatus(ADC1));//等待使能校准结束 注释:在protues中会卡死
ADC_StartCalibration(ADC1);//开始校准 4.2.9
//while( ADC_GetCalibrationStatus(ADC1)); //等待校准结束
}
u16 Get_Adc(u8 ch)//读取ch通道ad转换结果
{
ADC_RegularChannelConfig(ADC1, ch, 1,ADC_SampleTime_239Cycles5); //配置转换参数
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开启一次规则转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束, ADC_FLAG_EOC 低电平有效
return ADC_GetConversionValue(ADC1);//读取转换的结果
}
u16 Get_Adc_Average(u8 ch,u8 times)//读取ch通道的times次ad转换的平均值
{
int i;
u16 temp=0;
for(i=0;i<times;i++)
{
temp=temp+Get_Adc(ch);//转换结果累加,不能超过16次
}
return temp/times;//返回平均值
}
main.c
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "hdg12864.h"
#include "adc.h"
/*
将num(0-3.3V)显示到显示屏的第一行第一列
*/
void display(u16 num)
{
u16 num4,num3,num2;
num4=num/100;//取到十位数
Draw_word(8+num4,0,2,0,16);//显示十位数
//输出小数点
Draw_word(8+10,0,2,16,16);
num3 = (num/10)%10;
Draw_word(8+num3,0,2,32,16);
num2 = num%10;
Draw_word(8+num2,0,2,48,16);
//输出单位V
Draw_word(8+11,0,2,64,8);
}
int main()
{
u16 adc_val;
HDG12864_Init();
Adc_Init();
while(1)
{
adc_val = Get_Adc_Average(ADC_Channel_1,10);
display(adc_val/12.41819);
delay(500);
}
}