十七、基于标准库的ADC电压采集
1.ADC相关知识点
(1)STM32的ADC时钟不要超过14MHz,不然结果的准确率将下降
(2)ADC分为规则组和注入组,规则通道相当于正常运行的程序,注入通道相当于中断
(3)12位ADC,具有18个通道,可测量16个外部和2个内部信号源
(4)结果保存在16位数据寄存器中,可以设置数据左对齐或右对齐
(5)单次模式和连续模式,数据转化时,是否连续转化,单次模式,仅转化一次,连续模式,转化一次后从头开始重新转化
(6)扫描模式和非扫描模式,扫描模式,就是将序列中的数据从头到尾全部转化;非扫描模式,仅转化序列中的第一个
(7)规则通道只有一个,所有转化后需要立即取走,否则后续转化数据会将前边的覆盖,注入通道具有四个,可配合DMA进行数据搬移
(8)几种转化模式
1.单次、非扫描模式
2.连续、非扫描模式
3.单次、扫描模式
4.连续、扫描模式
2.ADC1的通道5事例代码(单次、非扫描模式、单通道)
2.1头文件
1 #ifndef __MYADC_H__ 2 #define __MYADC_H__ 3 #include "stm32f10x.h" 4 5 //adc初始化 6 void MADC_Init(void); 7 //获取电压值 8 float Get_ValueV(void); 9 10 #endif
2.2源文件
1 #include "my_adc.h" 2 3 void MADC_Init(void) 4 { 5 //1.使能时钟 6 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE); 7 8 //2.配置初始化GPIO 9 GPIO_InitTypeDef GPIO_InitStruct; 10 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入 11 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; 12 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 13 GPIO_Init(GPIOA,&GPIO_InitStruct); 14 15 //3.设置ADC分频因子 16 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC时钟72M/6=12M,不能超过14M 17 18 //4.初始化ADC参数 19 ADC_InitTypeDef ADC_InitStruct; 20 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐方式 21 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续转换 22 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式 23 ADC_InitStruct.ADC_ScanConvMode = DISABLE;//扫描模式 24 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发,硬件或软件触发 25 ADC_InitStruct.ADC_NbrOfChannel = 1;//扫描模式下的转换通道数 26 ADC_Init(ADC1,&ADC_InitStruct); 27 28 //5.设置ADC规则组通道 29 ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_55Cycles5); 30 31 //6.使能ADC 32 ADC_Cmd(ADC1,ENABLE); 33 34 //7.ADC校准 35 ADC_ResetCalibration(ADC1); 36 while(ADC_GetResetCalibrationStatus(ADC1) == SET); 37 ADC_StartCalibration(ADC1); 38 while(ADC_GetCalibrationStatus(ADC1)); 39 } 40 41 float Get_ValueV(void) 42 { 43 uint16_t temp=0; 44 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能软件触发转换 45 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束 46 temp=ADC_GetConversionValue(ADC1);//获取电压值 47 return 3.3*temp/4095; 48 }