#include "ADC.h"
#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "stdio.h"
#include "usart.h"
void ADCx_Init()
{
ADC_InitTypeDef ADC_InitStructure; //定義ADC結構體
GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //確定分頻
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //GPIO初始化
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //GPIO初始化
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //ADC初始化
ADC_InitStructure.ADC_ScanConvMode=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;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE); //ADC使能
ADC_ResetCalibration(ADC1); //ADC校準
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //軟件觸發
}
u16 Get_ADC_Value(u8 ch,u8 times)
{
u8 t;
u32 temp_val=0;
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
for(t=0;t<times;t++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //軟件觸發
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(5);
}
return temp_val/times;
}
u16 ADC()
{
u16 value;
value=Get_ADC_Value(ADC_Channel_1,20);
// float vol;
// i++;
// PBout(5)=0;
// delay_ms(5);
// PBout(5)=1;
// delay_ms(5);
// if(i%5==0)
// {
// value=Get_ADC_Value(ADC_Channel_1,20);
// printf("檢測AD值為:%d\r\n",value);
// vol=(float)value*(3.3/4096);
// printf("檢測電壓值為:%.2fV\r\n",vol);
// }
return value;
}
|