STM32—ADC

最近学习完了STM32系列单片机,所以准备对所学习的知识进行总结,以便以后查阅。
文章的单片机以
MCU:STM32F103C8T6
标准准库:V3.5.0
开发环境:Keil5

一、ADC介绍

  1. STM32内部集成ADC转换器,分辨率最高为12位,一种逐次逼近型模拟数字转换器。各通道的A/D转换可以单次、连续、扫描或间断模式执行。
  2. ADC通道分组,STM32有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。
    我一般情况下使用规则组,STM32的引脚只能输入0~3.3V的电压,所以在采样高电压时要做好高低压的隔离。ADC的时钟频率最高为14MHZ。

二、ADC使用

在使用ADC之前除了初始化ADC所对应的IO口以外,还需要配置ADC结构体的相关参数。下面是对ADC初始化结构体的成员描述。

typedef struct
{
  uint32_t ADC_Mode;                        //设置 ADC 工作在独立或者双 ADC 模式     
  FunctionalState ADC_ScanConvMode;         //规定了模数转换工作在扫描模式(多通道)还是单次(单通道)模式
  FunctionalState ADC_ContinuousConvMode;   //规定了模数转换工作在连续还是单次模式
  uint32_t ADC_ExternalTrigConv;            //定义了使用外部触发来启动规则通道的模数转换
  uint32_t ADC_DataAlign;                   //规定了 ADC 数据向左边对齐还是向右边对齐         
  uint8_t ADC_NbrOfChannel;                 //规定了顺序进行规则转换的 ADC 通道的数目          
}ADC_InitTypeDef;

初始化流程

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//六分频 72/6 = 12MHZ
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  // 右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 扫描模式
	ADC_InitStructure.ADC_NbrOfChannel = 1; 
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE); // 开启adc1
	// 校准adc
	ADC_ResetCalibration(ADC1); // 复位校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1); // 开始校准
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}
/* 获取ADC的值*/
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始转换
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 规则组 转换标志位获取
	return ADC_GetConversionValue(ADC1); //获取转换结果
}
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值