ADC介绍
我们采用是STM32F10ZET6 高容量的,拥有3个ADC,ADC 位逐次逼近的模拟数字转换器
Vref+ Vref- 是芯片内部直接连接的用来接的电压值的范围就是模数转换的的范围 如果需要测量超过此范围的就自己在外部加入电压调理电路。
通过这个表格 可以得到对应的管脚和对应的通道。
注入通道: 4个 类似于中断
规则通道:16个 规规矩矩的通道
两个同时有 先执行注入通道的,因为它是包含中断的
关于ADC的时钟,14M 以下, adc的时钟需要分频到14M以下,所以我们adc 有设定的寄存器,所以我们设定的分频因子设定位6 72/6=12M
关于标号6:
其中; 两种寄存器, 左对齐还是右对齐,
规则通道,16位寄存器 1个 因此,转换好了 之后应当马上读取出来
注入通道寄存器:4个
关于标号7
各种标志位等等的结构框图
单次转换、连续转换
ADC配置步骤
step1 使能端口时钟和AD时钟
ps: 设置72M的分频因子到12M 6分频
step2 初始化ADC参数
ADC的扫描通道的方式: 两个选择使能 或 失能
ADC的扫描通道的转换方式:两个选择使能 或 失能
关于ADC的触发方式: 一般是软件启动
举例::
ADC模数实验编程
#include "adc.h"
/*******************************************************************************
* º¯ Êý Ãû : adc_init
* º¯Êý¹¦ÄÜ : IO¶Ë¿ÚʱÖÓ³õʼ»¯º¯Êý
* Êä Èë : ÎÞ
* Êä ³ö : ÎÞ
*******************************************************************************/
void adc_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure; //定义ADC的结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M 分频银子
//初始化GPIO
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//对ADC进行配置,需要调用ADC的初始化
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µÄ¹æÔò×éͨµÀ£¬ÉèÖÃËüÃǵÄת»¯Ë³ÐòºÍ²ÉÑùʱ¼ä
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE); //使能ADC1 的
ADC_ResetCalibration(ADC1);//重置指定的ADC校准器(复位校准)
while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC的校准的标志
ADC_StartCalibration(ADC1);//开始校准
while(ADC_GetCalibrationStatus(ADC1));//获取开始校准标志
ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 软件启动
}
//这个函数是用来读取我们这个AD转换的数值的
U16 Get_ADC_Value(u8 channel,u8 times,)
{
u8 t;
u32 temp_value=0;
//采用的是规则组,规则序列,四个参数,ADC1 channel1
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
for (t=0;t<times;t++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);// 软件启动
while (!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //是否转换完成
temp += ADC_GetConversionValue(ADC1); // 获取转换值
delay_ms(5);
}
return temp/(t+1)
}