版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目七模数转换设计STM32的模数转换简介外界物理量通常都是模拟信号,如温度、湿度、压力、速度、液位、流量等都是模拟信号,需要模数转换。认识STM32的模数转换STM32拥有1~3个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32的ADC是12位逐次逼近型的模拟数字转换器。ADC有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。STM32的模数转换简介STM32的ADC主要特征12位分辨率,自校准,带内嵌数据一致的数据对齐;转换结束、注入转换结束和发生模拟看门狗事件时产生中断;单次和连续转换模式,从通道0到通道n的自动扫描模式;采样间隔可以按通道分别编程;规则转换和注入转换均有外部触发选项;间断模式,双重模式(带2个或以上ADC的器件);ADC最大的转换速率为1MHz,既最快的转换时间为1us;ADC供电要求:2.4V到3.6V,ADC输入范围:VREF-
VIN
VREF+;规则通道转换期间有DMA请求产生。STM32的A/D模数转换STM32的ADC结构STM32把ADC的转换分为规则通道组和注入通道组2个通道组,规则通道组最多包含16个通道,注入通道组最多包含4个通道。STM32的A/D模数转换STM32的ADC结构STM32把ADC的转换分为规则通道组和注入通道组2个通道组,规则通道组最多包含16个通道,注入通道组最多包含4个通道。规则通道组和注入通道组之间有什么关系呢?规则通道相当于我们正常运行的程序,注入通道相当于中断。在正常执行程序(规则通道)的时候,中断(注入通道)是可以打断正常执行的程序。既注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。在程序初始化中要设置好规则通道组和注入通道组。ADC相关的寄存器ADC控制寄存器ADC_CR1位8(SCAN)用于设置扫描模式,由软件设置和清除。1:使用扫描模式,0:关闭扫描模式。在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。ADC相关的寄存器ADC控制寄存器ADC_CR1位19:16(DUALMOD)用于设置ADC的操作模式,在这里使用的是独立模式,所以设置这几位为0就可以了。ADC相关的寄存器ADC控制寄存器ADC_CR2位0(ADON)。用于开/关AD转换器,由软件设置和清除,1:开启ADC并启动转换,0:关闭ADC转换/校准,并进入断电模式。位1(CONT)。用于设置是否进行连续转换,由软件设置和清除,1:连续转换模式,0:单次转换模式。本项目使用单次转换,CONT位必须为0。位11(ALIGN)。用于设置数据对齐,由软件设置和清除,1:左对齐,0:右对齐。本项目使用右对齐,ALIGN位必须为0。ADC相关的寄存器ADC控制寄存器ADC_CR2位19:17(EXTSEL)。用于选择启动规则转换组转换的外部事件,若使用的是软件触发(SWSTART),这3位要设置为111。位22(SWSTART)。用于开始转换规则通道,由软件设置该位以启动转换,转换开始后硬件马上清除此位。ADC相关的寄存器ADC采样事件寄存器ADC_SMPR1~2ADC采样事件寄存器1的各位描述ADC相关的寄存器ADC采样事件寄存器ADC_SMPR1~2ADC采样事件寄存器2的各位描述ADC相关的寄存器ADC采样事件寄存器ADC_SMPR1~2对于每个要转换的通道,采样时间要尽量长一点,以获得较高的准确度,这样做也会降低ADC的转换速率。ADC的转换时间可由下面公式获得:
Tcovn=采样时间+12.5个周期其中,Tcovn为总转换时间,采样时间是根据每个通道的SMP位的设置来决定的。比如,当ADCCLK=14MHz时,并设置1.5个周期的采样时间,根据公式计算,可以得到总转换时间:Tcovn=1.5+12.5=14个周期=1us。ADC相关的寄存器ADC规则序列寄存器ADC_SQR1~3(ADC_SQR1为例介绍)位23:20(L[3:0])。用于设置规则通道序列长度,这4位由软件定义在规则通道转换序列中的通道数目。本项目只用了1个,设置这4位为0。ADC相关的寄存器ADC规则序列寄存器ADC_SQR1~3SQ13~16[4:0]。用于设置规则通道序列中的第13~16个转换通道,这些位由软件定义转换序列中的第13~16个转换通道的编号(0~17)。ADC相关的寄存器ADC规则数据寄存器ADC_DR和ADC注入数据寄存器ADC_JDRx规则通道的AD转换结果,都保存在ADC规则数据寄存器ADC_DR的DATA[15:0]中;ADC相关的寄存器ADC规则数据寄存器ADC_DR和ADC注入数据寄存器ADC_JDRx注入通道的AD转换结果,保存在ADC注入数据寄存器ADC_JDRx的JDATA[15:0]中。ADC相关的寄存器ADC状态寄存器ADC_SRADC_SR保存ADC转换时的各种状态。如:可以通过EOC位来判断本次规则通道的AD转换是否完成,若完成就从ADC_DR中读取转换结果,否则等待转换完成。
任务15基于寄存器的STM32模数转换设计任务要求利用STM32的ADC相关寄存器,设计一个STM32模数转换,完成模拟电压的采集,并将采样值和电压值通过串口打印出来。要求:在STM32的单次转换模式下,使用ADC1的通道1,来进行AD转换。STM32的ADC设置设置ADC1的通道1、单次转换模式开启PA口时钟,设置PA1为模拟输入RCC->APB2ENR|=1<<2; //使能PORTA口时钟GPIOA->CRL&=0XFFFFFF0F; //PA1为模拟输入使能ADC1时钟,并设置分频因子;RCC->APB2ENR|=1<<9; //ADC1时钟使能RCC->APB2RSTR|=1<<9; //ADC1复位RCC->APB2RSTR&=~(1<<9); //复位结束RCC->CFGR&=~(3<<14); //分频因子清零RCC->CFGR|=2<<14; //ADC时钟设置为12MSTM32的ADC设置设置ADC1的通道1、单次转换模式设置ADC1的工作模式ADC1->CR1&=0XF0FFFF; //工作模式清零ADC1->CR1|=0<<16; //独立工作模式ADC1->CR1&=~(1<<8); //非扫描模式ADC1->CR2&=~(1<<1); //单次转换模式ADC1->CR2&=~(7<<17);ADC1->CR2|=7<<17; //软件控制转换ADC1->CR2|=1<<20; //使用外部触发(SWSTART)
ADC1->CR2&=~(1<<11); //右对齐STM32的ADC设置设置ADC1的通道1、单次转换模式设置ADC1规则序列的相关信息ADC1->SQR1&=~(0XF<<20);ADC1->SQR1|=0<<20;//1个转换在规则序列中,也就是只转换规则序列1ADC1->SMPR2&=~(7<<3); //通道1采样时间清空ADC1->SMPR2|=7<<3;//通道1采样时间是239.5周期开启AD转换器和校准设置;ADC1->CR2|=1<<0; //开启A/D转换器ADC1->CR2|=1<<3; //使能复位校准while(ADC1->CR2&1<<3); //等待复位校准结束ADC1->CR2|=1<<2; //开启AD校准while(ADC1->CR2&1<<2); //等待校准结束STM32的ADC设置设置ADC1的通道1、单次转换模式读取ADC值。ADC1->SQR3&=0XFFFFFFE0;ADC1->SQR3|=ch; //设置转换序列1的通道chADC1->CR2|=1<<22; //启动规则转换通道while(!(ADC1->SR&1<<1)); //等待转换结束temp=ADC1->DR; //读取adc值通过以上设置,就可以正常的使用STM32的ADC1,来完成A/D转换的操作了。基于寄存器的STM32模数转换设计STM32模数转换电路设计ADC1的通道1是在PA1上,通道1(PA1)采集的模拟电压,可以通过光敏电阻来获得模拟电压采集电路基于寄存器的STM32模数转换设计编写adc.h和adc.c编写adc.h头文件……#defineADC_CH00 //通道0#defineADC_CH11 //通道1#defineADC_CH22 //通道2#defineADC_CH33 //通道3voidAdc_Init(void);u16Get_Adc(u8ch);u16Get_Adc_Average(u8ch,u8times);……基于寄存器的STM32模数转换设计编写adc.h和adc.c编写adc.c文件……voidAdc_Init(void) //初始化ADC。采用规则通道,开启通道1{ …… //初始化PORTA口 …… //通道1设置 …… //设置ADC1的分频因子,ADC时钟设置为12M …… //设置通道1的采样时间 …… //校准设置}基于寄存器的STM32模数转换设计编写adc.h和adc.c编写adc.c文件/*获得规则序列1的通道ch的ADC值*/u16Get_Adc(u8ch){ ADC1->SQR3&=0xFFFFFFE0;//规则序列中的第1个转换清除 ADC1->SQR3|=ch; //设置转换规则序列1的通道ch ADC1->CR2|=1<<22; //启动(开始)转换规则通道 while(!(ADC1->SR&1<<1)); //等待转换结束,既等待EOC=1 returnADC1->DR; //返回adc值}基于寄存器的STM32模数转换设计编写adc.h和adc.c编写adc.c文件/*获取通道ch的times次转换结果平均值,返回平均值*/u16Get_Adc_Average(u8ch,u8times){u32temp_val=0; u8t;for(t=0;t<times;t++){ temp_val+=Get_Adc(ch); //累加通道ch每次转换的ADC
delay_ms(5);}returntemp_val/times;//返回通道ch的times次转换结果的平均值}基于寄存器的STM32模数转换设计编写主文件main.c……while(1){ adcx=Get_Adc_Average(ADC_CH1,10); //获取采样值 printf("采样值:%d\r\n",adcx); //显示采样值 temp=((float)adcx*3.3)/4096; //计算电压值 printf("电压值:%.2f\r\n",temp); //显示电压值 LED1=!LED1; //LED1指示灯闪烁,表示系统正在运行 delay_ms(1000);}基于寄存器的STM32模数转换运行与调试新建ADC_R工程建立一个“任务15基于寄存器的STM32模数转换设计”工程目录,然后在该目录下新建4个子目录,分别为USER、SYSTEM、HARDWARE和OUTPUT。把前面介绍过的delay、sys和usart文件夹复制到SYSTEM子目录下。在HARDWARE子目录下,新建ADC子目录,把adc.c和adc.h复制到ADC子目录下,最后把前面介绍过的LED文件夹复制到HARDWARE子目录下。把主文件main.c复制到USER子目录下。基于寄存器的STM32模数转换运行与调试工程搭建、编译、运行与调试在ADC_R工程中,新建USER、SYSTEM和HARDWARE这3个组,在USER组中添加main.c和startup_stm32f10x_hd.s文件,在SYSTEM组中添加delay.c、sys.c和usart.c文件,最后在HARDWARE组中添加led.c、adc.c文件。在ADC_R工程中新建组和添加文件,参考前面项目。在ADC_R工程中,添加该任务的所有头文件以及设置编译文件的路径。具体方法参考前面项目。工程编译、下载、运行与调试,参考前面项目。基于寄存器的STM32模数转换运行与调试工程搭建、编译、运行与调试基于寄存器的STM32模数转换运行结果任务16基于库函数的STM32模数转换设计任务要求利用STM32的ADC相关库函数,设计一个STM32模数转换,完成模拟电压的采集,并将采样值和电压值通过串口打印出来。要求:在STM32的单次转换模式下,使用ADC1的通道1,来进行AD转换。ADC相关的函数开启PA口时钟和ADC1时钟,设置PA1为模拟输入。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOA,&GPIO_InitStructure); //PA1作为模拟输入引脚复位ADC1,并设置分频因子。ADC_DeInit(ADC1); //ADC1复位//设置ADC分频因子为6,72MHz/6=12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC相关的函数初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息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数据右对齐//转换规则序列1的ADC通道的数目为1ADC_InitStructure.ADC_NbrOfChannel=1; //根据以上指定的参数,初始化外设ADCx的寄存器ADC_Init(ADC1,&ADC_InitStructure); ADC相关的函数使能AD转换器和校准设置ADC_Cmd(ADC1,ENABLE); //使能指定的ADC1ADC_ResetCalibration(ADC1); //使能复位校准while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束ADC相关的函数读取ADC值//ADC1的通道1采样时间是239.5周期ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//使能指定的ADC1的软件转换启动功能
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //等待转换结束
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//读取ADC1规则组的转换结果
temp=ADC_GetConversionValue(ADC1); 基于库函数的STM32模数转换程序设计编写adc.h头文件……voidAdc_Init(void);u16Get_Adc(u8ch);u16Get_Adc_Average(u8ch,u8times);……基于库函数的STM32模数转换程序设计编写adc.c文件……voidAdc_Init(void) //初始化ADC。采用规则通道,开启通道1{ ADC_InitTypeDefADC_InitStructure; GPIO_InitTypeDefGPIO_InitStructure; …… //开启PA口时钟和ADC1时钟,设置PA1为模拟输入 …… //复位ADC1,并设置分频因子 …… //初始化ADC1参数,设置ADC1的工作模式以及规则序列 …… //使能AD转换器和校准设置}基于库函数的STM32模数转换程序设计编写adc.c文件/*设置指定ADC的规则组通道,一个序列,采样时间是239.5周期*/u16Get_Adc(u8ch){ //设置指定ADC的规则组通道,一个序列,采样时间是239.5周期 ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //使能指定ADC1的软件转换启动功能 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //等待转换结束 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); returnADC_GetConversionValue(ADC1);//返回adc值}基于库函数的STM32模数转换程序设计编写adc.c文件/*获取通道ch的times次转换结果平均值,返回平均值*/u16Get_Adc_Average(u8ch,u8times){ …… //同任务15的Get_Adc_Average()函数代码一样}基于库函数的STM32模数转换程序设计编写主文件main.c……while(1){ adcx=Get_Adc_Average(ADC_Channel_1,10); //获取采样值 printf("采样值:%d\r\n",adcx); //显示采样值 temp=((float)adcx*3.3)/4096; //计算电压值 printf("电压值:%.2f\r\n",temp); //显示电压值 LED1=!LED1; //LED1指示灯闪烁,表示系统正在运行 delay_ms(1000);}基于库函数的STM32模数转换运行与调试新建ADC_R工程将“任务15基于寄存器的STM32模数转换设计”修改为“任务16基于库函数的STM32模数转换设计”。在USER子目录下,把主文件main.c复制到USER子目录下;并把ADC_R.uvprojx工程名修改为ADC_H.uvprojx。在HARDWARE子目录下,把adc.c和adc.h复制到ADC子目录下。工程搭建、编译、运行与调试运行ADC_H.uvprojx,把ProjectTargets栏下的工程名修改为ADC_H。工程编译、下载、运行与调试,参考前面项目。技能训练内部温度传感器采集监控设计STM32的ADC内部有一个通道连接着芯片的温度传感器,那么如何监控CPU及周围的温度呢?认识内部温度传感器STM32内部含有一个温度传感器,可用来测量CPU及周围的温度。内部温度传感器是与ADC1内部的输入通道相连接,连接在ADC1_IN16上,ADC1可以将传感器输出的电压转换成数字值。内部温度传感器支持的温度范围为:-40~125度,精度为±1.5℃左右。技能训练内部温度传感器采集监控设计STM32的内部温度传感器配置如何使用内部温度传感器初始化下ADC1_IN16通道,并激活其内部温度传感器通道既可。内部温度传感器相关库函数是在stm32f10x_adc.c和stm32f10x_adc.h文件中。使用库函数对内部温度传感器进行配置初始化ADC1_IN16相关参数,开启内度温度传感器
ADC_TempSensorVrefintCmd(ENABLE); //打开ADC内部温度传感器技能训练内部温度传感器采集监控设计STM32的内部温度传感器配置读取ADC1_IN16AD值,将其转换为对应的温度设置好ADC1后,读取ADC1_IN16的AD值,获得内部温度传感器返回的电压值,根据这个值既可计算出当前温度,计算公式如下:T(℃)={(V25-Vsense)/Avg_Slope}+25公式中:
V25是Vsense在25度时的数值,其典型值为1.43V;
Avg_Slope是温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃),其典型值为4.3mV/℃;
Vsense是内部温度传感器返回的电压值。通过上面公式,就可以方便的计算出当前内部温度传感器测量的温度。技能训练内部温度传感器采集监控设计内部温度传感器温度采集程序设计内部温度传感器温度采集程序,主要包括初始化内部温度传感器、温度读取函数以及主函数等编写内部温度传感器初始化函数ADC_Temp_Init()函数初
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年注册测绘师《测绘管理与法规》真题(含答案)
- 2026年中级经济师农业经济真题及答案
- 2026重庆沙坪坝区树人和平幼儿园招聘笔试参考试题及答案详解
- 2026年一级建造师《公路工程》模拟试题及答案
- 污水处理公司劳务派遣与外包人员管理制度
- java软件工程师笔试题及答案
- 化学入职笔试题及答案
- 2026浙江金华市永康市建设工程检测有限公司招聘合同制员工部分岗位核销情况笔试备考试题及答案详解
- 2026(课件)防癌知识讲座
- 广元经济技术开发区公开招聘16名编外聘用人员的笔试备考试题及答案详解
- 《羊水栓塞预防与处理指南(2025)解读》
- 荆州市事业单位请假制度
- 七年级下册《道德与法治》期末质量分析
- 2026年网络安全从入门到精通网络安全知识题库与答案解析
- 肩袖损伤3D打印个性化支具康复方案
- 2026年人教版道德与法治七年级下册期末质量检测卷(附答案解析)
- 陶粒砂生产前安全培训课件
- 实验室成果转化中的知识产权保护策略
- 肺部流域地形图+2.0+原理、技术规范及临床应用胸外科专家共识(2024版)解读
- 湖南省长沙市开福区2024-2025学年三年级上册期末学业质量测试数学试卷(含答案)
- 声屏障施工安全规范
评论
0/150
提交评论