AD-STM32
ADC (Analog-Digital Converter) 模拟-数字转换器A
DC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间
输入电压范围: 0-3.3V,转换结果范围: 0~409518个输入通道,
可测量16个外部和2个内部信号源
规则组和注入组两个转换单元模拟看门狗自动监测输入电压范围
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
第一步,开启RCC时钟,包括ADC和GPIO的时钟。另外这里ADCCLK的分频器,也需要配置一下
第二步,配置GPIO,把需要用的GPIO配置成模拟输入的模式。
第三步,配置这里的多路开关,把左边的通道接入到右边的规则组列表里。
第四步,就是配置ADC转换器了。
那接下来,就是开关控制,调用一下ADC Cmd函数,开启ADC。
可以对APB2的72MHz时钟选择2、4、6、8分频,输入到ADCCLK。(在RCC.h文件中)
PPT里的开关控制
是PPT的里,用于控制某个中断,能不能通往NVIC
ADC_GetsoftwarestartConvstatus(ADC_TypeDef* ADCx)函数一般没啥用
重点
第一个是是否启动模拟看门狗
第二个是配置高低闻值
第三个是配置看门的通道
#include "stm32f10x.h" // Device header
void AD_Init(void)
{
//第一步,开启RCC时钟,包括ADC和GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟
//接着不要忘了,还有一个ADCCLK需要配置
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频之后,ADCCLK=72MHz/6=12MHz
//第二步,配置GPIO,把需要用的GPIO配置成模拟输入的模式。
GPIO_InitTypeDef GPIO_InitStruct;
//所以AIN模式就是ADC的专属模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//选择AIN,模拟输入,在AIN模式下,GPIO口是无效的
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//第三步,配置这里的多路开关,把左边的通道接入到右边的规则组列表里。
//在规则组菜单列表的第一个位置,写入通道0这个通道,采样时间就是55.5个ADCCLK的周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
//如果需要在规则组菜单列表的第二个位置,写入通道3这个通道,采样时间就是55.5个ADCCLK的周期
//ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_55Cycles5);
//第四步,就是配置ADC转换器了。
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续转换模式;选择单次转换
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//选择右对齐
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发选择,软件触发
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//配置为独立模式
ADC_InitStruct.ADC_NbrOfChannel = 1;//在指定扫描模式下,会使用几个通道;选择1个通道
ADC_InitStruct.ADC_ScanConvMode = DISABLE;//扫描模式,选择非扫描的模式
ADC_Init(ADC1,&ADC_InitStruct);
//开启ADC
ADC_Cmd(ADC1,ENABLE);
//对ADC进行校准
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);//软件触发
//等待转换完成
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);//规则组转换完成标志位
return ADC_GetConversionValue(ADC1);//获取转换值
}
#ifndef _AD_H
#define _AD_H
void AD_Init(void);
uint16_t AD_GetValue(void);
#endif
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "AD.h"
uint16_t ADValue;
float Voltage;
int main(void)
{
AD_Init();
while(1)
{
ADValue = AD_GetValue();//获取AD值
Voltage = (float)ADValue/4095*3.3;//获取电压值
}
}