ADC转换的重要性
ADC非常重要,学会ADC单通道转换后就可以进行一些简答的小项目了,比如:温湿度检测、煤气浓度检测等等。
简单认识ADC
ADC(Analog-Digital Converter)模拟-数字转换器。
ADC是用来将输入的模拟信号转换成数字信号,对应的,也可以将数字信号转换成模拟信号,这就是DAC功能,但STM32C8T6并没有自带DAC外设。除了DAC可以将数字信号转换成模拟信号,老朋友PWM也可以将数字信号转换成模拟信号,通过占空比控制舵机旋转角度就是一个例子。
ADC 位数
因为ADC有12位,所以它最大测量范围是0~4095。
最大转化时间
1us,也就是1Mhz。
测量通道
18个输入通道,可测量16个外部和2个内部信号源。16个外部信号就是可以测量16个GPIO引脚,2个内部信号就是1个内部温度传感器信号,一个稳压信号。
ADC通道
C8T6中一共有2个ADC,分别是ADC1和ADC2,而每个ADC在C8T6里面又有10个通道。
如图为引脚分布图。
ADC12表示ADC1和ADC2都有,IN0-IN9表示对应的通道。
这里有个问题,就是ADC1和2可以使用同一个引脚,那会不会出问题呢?其实这是故意设计的,这就是ADC的双通道使用,只需要知道是这个东西就行了,不需要了解。
如下图是引脚整理图.
ADC转换步骤
抽样-保持-量化-编码
ADC的总转换时间为:
TCONV=采样时间+12.5个ADC周期
代码分析
1,配置时钟
ADC要单独一个时钟
ADC通道要单独一个时钟
ADC时钟要单独分频
2,配置GPIO引脚
引脚需要使用模拟输入,也就是ADC的专属配置:GPIO_Mode_AIN
3,选择规则组的输入通道
使用ADC_RegularChannelConfig函数进行配置
ADC_RegularChannelConfig函数结构体里面有:
第一个参数是ADCx:就是确定是哪个ADC,C8T6里面只有ADC1和ADC2。
第二个参数是ADC通道:ADC通道有18个,16个外部通道,也就是对应的16个引脚;两个内部通道,也就是内部温度和电压。
第三个参数是菜单列表序号:菜单列表一共有16位,一般选第一位就行了。
第四个参数是采样时间:数字越小表示采样速度越快,数字越大,表示采样越稳定。
4,配置ADC结构
使用函数ADC_Init
ADC_Init需要配置6个参数。
第一个是ADC的模式:选择单独模式,还是双模式
第二个是ADC的通道选择:选择单通道,还是多通道
第三个是ADC的模式选择:选择连续模式,还是单独模式
第四个是ADC的读取源选择:是外部读取,还是内部读取
第五个是ADC的数据排列方式:是右对齐,还是左对齐。一般是右对齐
第六个是ADC的读取列表有多少位:1-16
5,开启ADC电源
其实就是给STM32说,我要使用ADC了,让STM32把ADC打开。
使用函数ADC_Init(ADCx,ENABLE)
6,开始校准
这一部分的代码是死代码,只需要改ADCx就可以了。
7,ADC读取函数
- 选择软件触发转换
使用ADC_SoftwareStartConvCmd(ADCx,ENABLE)函数
- 获取标志位状态
使用ADC_GetFlagStatus函数
函数返回值为1时,表示转换完成,为0表示转换未完成。
- 返回读取值
ADC_GetConversionValue,这个函数可以直接读取ADC转换的值直接加一个return就可以了。
8,AD转换成电压值
因为AD转换的值是16位2进制数,结果显示为0-4095,所以可以根据线性关系求出自己需要得到的值数值。比如我想求电压值,就可以利用等式:
0/3.3=0/4095
这样就可以写成:所测电压=AD值/4095*3.3。
C语言小知识
浮点数不能用来取余