📄 stm32_adc.c
字号:
#include"stm32_adc.h"
#define u8 unsigned char
#define u16 unsigned int
void stm_adc_rcc_cnf(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure); //默认速度为两兆
}
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
stm_adc_rcc_cnf();
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_RegularChannelConfig(ADC1,ADC_Channel_9,1,ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
//规则组 此时会根据规矩组里的顺序进行切换测,不过准确度下降了很多!!!!!!!
/* ADC_RegularChannelConfig(ADC1,ADC_Channel_0,2,ADC_SampleTime_239Cycles5);
ADC_DiscModeChannelCountConfig(ADC1,1);
ADC_DiscModeCmd(ADC1,ENABLE); */
// ADC_InjectedSequencerLengthConfig(ADC1,2); //注入组
// ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,1);
// ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE); //试验
// ADC_ExternalTrigConvCmd(ADC1,ENABLE);
ADC_Cmd (ADC1,ENABLE); //使能或者失能指定的ADC
ADC_ResetCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
// ADC_SoftwareStartConvCmd(ADC1,ENABLE); //此即为软件触发,进入一次扫描一次
}
u16 TestAdc_averege(u8 ch) //10次取平均
{
u8 i;
u16 adc=0,adc_num1;
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期
for(i=0;i<10;i++)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //试验
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位
adc_num1=ADC_GetConversionValue(ADC1);
// adc_num1=1234;
// adc_num2=(330*(adc_num1/4096));
adc_num1=(u16)((3300*adc_num1)/4096);//(u16)adc_num2;
adc=adc+adc_num1;
}
return (u16)(adc/10);//返回最近一次ADCx规则组的转换结果 不知为啥测的值偏小
}
u16 TestAdc(u8 ch) //单次
{
u16 adc=0;
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //试验
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位
adc=ADC_GetConversionValue(ADC1);
// adc_num1=1234;
// adc_num2=(330*(adc_num1/4096));
adc=(u16)((3300*adc)/4096);//(u16)adc_num2;
return adc;//返回最近一次ADCx规则组的转换结果 不知为啥测的值偏小
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -