您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > STM32-ADC电压测试实验报告
STM32ADC电压测试实验报告一、实验目的1.了解STM32的基本工作原理2.通过实践来加深对ARM芯片级程序开发的理解3.利用STM32的ADC1通道0来采样外部电压值值,并在TFTLCD模块上显示出来二、实验原理STM32拥有1~3个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32的ADC是12位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中接下来,我们介绍一下执行规则通道的单次转换,需要用到的ADC寄存器。第一个要介绍的是ADC控制寄存器(ADC_CR1和ADC_CR2)。ADC_CR1的各位描述如下:ADC_CR1的SCAN位,该位用于设置扫描模式,由软件设置和清除,如果设置为1,则使用扫描模式,如果为0,则关闭扫描模式,ADC_CR1[19:16]用于设置ADC的操作模式我们要使用的是独立模式,所以设置这几位为0就可以了。第二个寄存器ADC_CR2,该寄存器的各位描述如下:ADCON位用于开关AD转换器。而CONT位用于设置是否进行连续转换,我们使用单次转换,所以CONT位必须为0。CAL和RSTCAL用于AD校准。ALIGN用于设置数据对齐,我们使用右对齐,该位设置为0。EXTSEL[2:0]用于选择启动规则转换组转换的外部事件,我们这里使用的是软件触发(SWSTART),所以设置这3个位为111。第三个要介绍的是ADC采样事件寄存器(ADC_SMPR1和ADC_SMPR2),这两个寄存器用于设置通道0~17的采样时间,每个通道占用3个位对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。ADC的转换时间可以由下式计算:Tcovn=采样时间+12.5个周期第四个要介绍的是ADC规则序列寄存器(ADC_SQR1~3),第五个要介绍的是ADC规则数据寄存器(ADC_DR)。最后一个要介绍的ADC寄存器为ADC状态寄存器(ADC_SR),该寄存器保存了ADC转换时的各种状态。三.实验内容一.实验步骤1)开启PA口时钟,设置PA0为模拟输入。STM32F103RBT6的ADC通道0在PA0上,所以,我们先要使能PORTA的时钟,然后设置PA0为模拟输入。2)使能ADC1时钟,并设置分频因子。要使用ADC1,第一步就是要使能ADC1的时钟,在使能完时钟之后,进行一次ADC1的复位。接着我们就可以通过RCC_CFGR设置ADC1的分频因子。分频因子要确保ADC1的时钟(ADCCLK)不要超过14Mhz。3)设置ADC1的工作模式。在设置完分频因子之后,我们就可以开始ADC1的模式配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。4)设置ADC1规则序列的相关信息。接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所以设置规则序列中通道数为1,然后设置通道0的采样周期。5)开启AD转换器,并校准。在设置完了以上信息后,我们就开启AD转换器,执行复位校准和AD校准,注意这两步是必须的!不校准将导致结果很不准确。6)读取ADC值。在上面的校准完成之后,ADC就算准备好了。接下来我们要做的就是设置规则序列0里面的通道,然后启动ADC转换。在转换结束后,读取ADC1_DR里面的值就是了。通过以上几个步骤的设置,我们就可以正常的使用STM32的ADC1来执行AD转换操作了。二,程序代码voidAdc_Init(void){//先初始化IO口RCC-APB2ENR|=12;//使能PORTA口时钟GPIOA-CRL&=0XFFFF0000;//PA0123anolog输入//通道10/11设置RCC-APB2ENR|=19;//ADC1时钟使能RCC-APB2RSTR|=19;//ADC1复位RCC-APB2RSTR&=~(19);//复位结束RCC-CFGR&=~(314);//分频因子清零//SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M!//否则将导致ADC准确度下降!RCC-CFGR|=214;ADC1-CR1&=0XF0FFFF;//工作模式清零ADC1-CR1|=016;//独立工作模式ADC1-CR1&=~(18);//非扫描模式ADC1-CR2&=~(11);//单次转换模式ADC1-CR2&=~(717);ADC1-CR2|=717;//软件控制转换ADC1-CR2|=120;//使用用外部触发(SWSTART)!!!必须使用一个事件来触发ADC1-CR2&=~(111);//右对齐ADC1-SQR1&=~(0XF20);ADC1-SQR1&=020;//1个转换在规则序列中也就是只转换规则序列1//设置通道0~3的采样时间ADC1-SMPR2&=0XFFFFF000;//通道0,1,2,3采样时间清空ADC1-SMPR2|=79;//通道3239.5周期,提高采样时间可以提高精确度ADC1-SMPR2|=76;//通道2239.5周期,提高采样时间可以提高精确度ADC1-SMPR2|=73;//通道1239.5周期,提高采样时间可以提高精确度ADC1-SMPR2|=70;//通道0239.5周期,提高采样时间可以提高精确度ADC1-CR2|=10;//开启AD转换器ADC1-CR2|=13;//使能复位校准while(ADC1-CR2&13);//等待校准结束//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。ADC1-CR2|=12;//开启AD校准while(ADC1-CR2&12);//等待校准结束//该位由软件设置以开始校准,并在校准结束时由硬件清除}//获得ADC值//ch:通道值0~3u16Get_Adc(u8ch){//设置转换序列ADC1-SQR3&=0XFFFFFADC1-CR2|=122;//启动规则转换通道while(!(ADC1-SR&11));//等待转换结束returnADC1-DR;//返回adc值}。接下来在adc.h文件里面输入如下代码:#ifndef__ADC_H#define__ADC_H//MiniSTM32开发板//ADC驱动代码//正点原子@ALIENTEK#defineADC_CH00//通道0#defineADC_CH11//通道1#defineADC_CH22//通道2#defineADC_CH33//通道3voidAdc_Init(void);u16Get_Adc(u8ch);#endif该部分代码很简单,这里我们就不多说了,这里定义的4个通道的宏定义,我们在main函数将会用到ADC_CH0。接下来我们在test.c里面,修改main函数如下:intmain(void){u16adcx;floattemp;Stm32_Clock_Init(9);//系统时钟设置delay_init(72);//延时初始化uart_init(72,9600);//串口1初始化LED_Init();LCD_Init();Adc_Init();POINT_COLOR=RED;//设置字体为红色POINT_COLOR=BLUE;//设置字体为蓝色LCD_ShowString(60,150,ADC_CH0_VOL:0.000V);while(1){LCD_ShowNum(156,150,adcx,1,16);//显示电压值temp-=adcx;temp*=1000;LCD_ShowNum(172,150,temp,3,16);LED0=!LED0;delay_ms(250);}
本文标题:STM32-ADC电压测试实验报告
链接地址:https://www.777doc.com/doc-1442342 .html