单片机——ADC采样
创始人
2024-11-09 21:34:27
0次

1、什么是ADC采样?

        ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压,通过数值的方式表现出来。以STM32F103系列为例,它可以反应0~4095,换句话说,它采集的电压数值上表现为0~4095,也就是12位ADC(2^12)。

2、如何理解采集的数值?

        以STM32F103芯片为例,供电电压是3.3V,它能检测的电压也是0~3.3V。这就好理解了,0~3.3V电压对应的是0~4095数值。通俗理解为把3.3V分成了4096份,采集上来多少份占3.3V的比例。

        采集电压=(采集数值/4095)*3.3V

3、ADC采样具体知识和步骤

3.1、步骤

(1)使能用于ADC检测的引脚对应的GPIO口,使能ADC2通道时钟(ADC1也可以,这款芯片有俩个ADC外设)

(2)时钟分频

(3)初始化GPIO引脚并配置成输入模式

(4)配置ADC的工作模式

(5)使能指定的ADC

(6)开启复位校准

注:ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。

3.2、 ADC知识讲解

3.2.1、通道选择

         每个 ADC有 18 个通道,其中有16个外部通道(不同引脚数的STM32外部通道数可能有所差异),其余两个是内部通道。

        ADC通道和引脚对应关系如下(STM32F103C8T6为例):

  3.2.2、单次转换和连续转换

  3.2.3、独立模式和多重模式

        独立模式即所有ADC转换器(ADC1、ADC2和ADC3)均独立地工作,互不影响。

        多重模式即多个ADC(如果存在)根据通用寄存器中的设置,按照指定的方式协同工作。

3.2.4、数据对齐

        比如说AD转换后数字量保存在ADCH,ADCL两个寄存器中
        左对齐就是AD值的最高位就是ADCH的最高位了,ADCL的低位就会有的用不到,读出来为0
        右对齐就是AD值的最低位是ADCL的最低位,而ADCH的高位就会有的用不到,读出来也为0
        左对齐:11111111 11110000
        MSB LSB
        右对齐:00001111 11111111
        MSB LSB

3.2.5、注入组和规则组

注:

(1)当完成所有注入通道转换,下个触发启动第1个注入通道的转换。在上述例子中,第四个 触发重新转换第1个注入通道1。(2)不能同时使用自动注入和间断模式。(3)必须避免同时为规则和注入组设置间断模式。间断模式只能作用于一组转换。

3.2.6、 ADC校准

3.3、代码示例

3.3.1、初始化

void Adc_Init(void) {  	u8 i; 	ADC_InitTypeDef ADC_InitStructure; 	GPIO_InitTypeDef GPIO_InitStructure;  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC2, ENABLE ); //使能 ADC2 通道时钟  	RCC_ADCCLKConfig(RCC_PCLK2_Div4); 									//设置 ADC 分频因子 6  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;						//模拟输入 	GPIO_Init(GPIOA, &GPIO_InitStructure);								//初始化 GPIOA 	 	ADC_DeInit(ADC2);  	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//ADC 独立模式 	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 数据右对齐 	ADC_InitStructure.ADC_NbrOfChannel = 1;								//顺序进行规则转换的ADC通道的数目 	ADC_Init(ADC2, &ADC_InitStructure);									//根据指定的参数初始化外设 ADCx 	 	ADC_Cmd(ADC2, ENABLE);												//使能指定的 ADC2 	for(i=0;i<100;i++);  	ADC_ResetCalibration(ADC2); 											//开启复位校准 	while(ADC_GetResetCalibrationStatus(ADC2));							//等待复位校准结束 	ADC_StartCalibration(ADC2);											//开启 AD 校准 	while(ADC_GetCalibrationStatus(ADC2));								//等待校准结束 }

3.3.2、获取ADC数值

u16 Get_Adc1(void) { 	ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //通道1 	ADC_SoftwareStartConvCmd(ADC2, ENABLE);							//使能指定的 ADC2 的软件转换功能 	while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));					//等待转换结束 	return ADC_GetConversionValue(ADC2);							//返回最近一次 ADC2 规则组的转换结果 }   u16 Get_Adc2(void) { 	ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5); //通道2 	ADC_SoftwareStartConvCmd(ADC2, ENABLE);							//使能指定的 ADC2 的软件转换功能 	while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));					//等待转换结束 	return ADC_GetConversionValue(ADC2);							//返回最近一次 ADC2 规则组的转换结果 }

3.3.3、主函数

u8 Val; u8 ADC; int main(void) {     	Adc_Init();                        //ADC初始化 	while (1) 	{	         ADC = Get_Adc1();                //将1通道检测的数值传给ADC变量         Val = (ADC*3.3)/4095             //计算得到1通道检测的电压 	} 	 }

注:上述配置下, 多通道采集时,俩个通道采集之间要有一定的间隔。

相关内容

热门资讯

分享开挂内幕开挂!微信小程序微... 分享开挂内幕开挂!微信小程序微乐房间怎么开挂,微信小程序微乐房间有技巧吗-确实真的是有辅助脚本1、不...
玩家科普开挂工具!wpk辅助功... 玩家科普开挂工具!wpk辅助功能开透视工具,真是真的有挂(有挂教学)1、很好的工具软件,可以解锁游戏...
推荐一款开挂!微乐小程序辅助工... 推荐一款开挂!微乐小程序辅助工具,微乐手游微乐辅助免费-本来有辅助工具1、进入游戏-大厅左侧-新手福...
一分钟了解开挂软件!wpk辅助... 一分钟了解开挂软件!wpk辅助功能开透视工具,都是有挂(有挂解惑)wpk破解侠是真的助透视。每个模型...
必知教程开挂!微信小程序微乐辅... 必知教程开挂!微信小程序微乐辅助器,陕西微乐挖坑控制器-真是是真的有辅助教程进入游戏-大厅左侧-新手...
一分钟揭秘辅助教程!德扑之星辅... 您好,德扑之星这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在这款...
科技介绍透视挂!微乐小程序免费... 科技介绍透视挂!微乐小程序免费工具,陕西微乐小程序辅助-原来真的是有辅助方法微乐小程序免费工具透视方...
一分钟揭秘辅助插件!AAPoK... 一分钟揭秘辅助插件!AAPoKer辅助功能开透视工具,切实是有挂(竟然有挂)1、AAPoKer辅助器...
带你了解辅助!微信微乐小程序有... 带你了解辅助!微信微乐小程序有挂黑科技,微乐辅助工具哪个好用-切实真的是有辅助挂1、微信微乐小程序有...
热点推荐开挂软件!AAPoKe... 热点推荐开挂软件!AAPoKer辅助功能开透视工具,真是真的是有挂(真实有挂)一、AAPoKer游戏...