
这个就是一个模数转换器,就是将模拟转化成数字
3.什么叫做十二位次,就是说指的是它的范围为0-2的12次方-1,即范围是0-4095,这个1us的转换时间的意思就是ADC转换结果所需要花的时间需要1us
4.这里的输入电压和转换结果范围是一一对应,成线性关系

我们这个芯片只有十个左右的外部信号源



这是我们的引脚对应图,我们之前说过了还记得吗,这块芯片只有这十个作为我们的ADC引脚,同时为什么是ADC12,就是可以让这两个ADC一起工作

这是其他芯片的引脚对应图,我们这里只有0-9
规则组的四种转换模式








注入组的触发控制


一些结构体中的小参数


结构体会进行选择,这里选择右对齐即可


不需要
===============================项目一=====================================

①开启RCC时钟,包括GPIO和ADC的时钟以及ADC的时钟
②配置GPIO,把GPIO配置成模拟输入的形式
③配置多路开关,把左边的通道接入到右边的规则组里
④配置ADC转换器
⑤上面哪些模拟看门狗和中断输出控制还有NVIC本节暂时不用
⑥开关控制
=======================常用函数============================================



=========================单通道ADC========================================
cpp
#include "stm32f10x.h" // Device header
void AD_init(void)
{
//①开启RCC时钟,包括GPIO和ADC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//为什么需要去配置这个时钟,由于本身APB2的时钟是72Mhz
//而对于ADC来说上限是14Hz,所以需要分频
//②配置GPIO,把GPIO配置成模拟输入的形式
GPIO_InitTypeDef GPIO_InitStruct100;
GPIO_InitStruct100.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStruct100.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct100.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct100);
//③配置多路开关,把左边的通道接入到右边的规则组里
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
//这个啥意思,参数分别是哪个ADC,ADC通道选择哪个(对应引脚),采样时间,通道排序(对应顺序)
//就是笔记里的那个单次转换,扫描模式
//当我们想要再弄一个其他的
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_239Cycles5);
//④配置ADC转换器
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//选择是单ADC模式还是双ADC模式
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
//外部触发源选择,由于我们是none,即软件触发,所以不进行选择
ADC_InitStruct.ADC_NbrOfChannel=1;//通道数目
ADC_InitStruct.ADC_ScanConvMode=DISABLE;//只看一个通道(DISABLE)
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//连续模式还是单次模式(DISABLE)
ADC_Init(ADC1,&ADC_InitStruct);
//⑥开关控制
ADC_Cmd(ADC1,ENABLE);
//校准四件套,放后面就行
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)==SET);
}
uint16_t AD_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束
return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}
cpp
#ifndef __AD_H
#define __AD_H
uint16_t AD_GetValue(void);
void AD_init(void);
#endif
cpp
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
uint16_t ADValue; //定义AD值变量
float Voltage; //定义电压变量
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
AD_init(); //AD初始化
/*显示静态字符串*/
OLED_ShowString(1, 1, "ADValue:");
OLED_ShowString(2, 1, "Voltage:0.00V");
while (1)
{
ADValue = AD_GetValue(); //获取AD转换的值
Voltage = (float)ADValue / 4095 * 3.3; //将AD值线性变换到0~3.3的范围,表示电压
OLED_ShowNum(1, 9, ADValue, 4); //显示AD值
OLED_ShowNum(2, 9, Voltage, 1); //显示电压值的整数部分
OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2); //显示电压值的小数部分
Delay_ms(100); //延时100ms,手动增加一些转换的间隔时间
}
}