初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2019-4-19
- 在线时间
- 13 小时
|

楼主 |
发表于 2019-10-22 17:47:10
|
显示全部楼层
#include "adc.h"
void GPIOINIT_ADC()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void RCCINIT_ADC()
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 最大14M 设置ADC时钟(ADCCLK)
}
void ADCINIT_ADC()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
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的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}
#include "systick.h"
#include "printf.h"
#include "adc.h"
double ad1;
int main()
{
u32 ad=0;
u8 i;
RCCINIT_PRINTF(); //初始化printf的系统时钟
RCCINIT_ADC(); //初始化ADC的系统时钟
GPIOINIT_ADC(); //初始化ADC的端口配置
GPIOINIT_PRINTF();
USARTINIT_PRINTF(); //printf串口的初始化配置
NVICINIT_PRINTF(); //printf中断模式的初始化配置
ADCINIT_ADC();
while(1)
{
ad=0;
for(i=0;i<50;i++)//读取50次的AD数值取其平均数较为准确
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//转换结束标志位
ad=ad+ADC_GetConversionValue(ADC1);//返回最近一次ADCx规则组的转换结果
}
ad1=(ad/50)*3.304/4096;
// printf("ad=%f\n",ad*3.3/4096);
delay_ms(1000);
}
}
|
|