十七、基于标准库的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 }

 

posted @ 2023-09-03 02:56  稚终KINO  阅读(92)  评论(0编辑  收藏  举报