极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第7章 模拟外设_第1页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第7章 模拟外设_第2页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第7章 模拟外设_第3页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第7章 模拟外设_第4页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第7章 模拟外设_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章

模拟外设及其应用第7章

模拟外设【实践案例7-1】利用DAC输出锯齿波【照猫画虎7-1】利用DAC输出正弦波【实践案例7-2】单通道模拟电压采集【照猫画虎7-2】单通道模拟电压采集【实践案例7-3】多通道模拟电压采集【照猫画虎7-3】多通道模拟电压采集第7章

模拟外设第7章

模拟外设

7.1.1DAC功能框图7.1.2DAC相关HAL库驱动【实践案例7-1】利用DAC输出锯齿波【照猫画虎7-1】利用DAC输出正弦波7.1DAC及其应用STM32F407中的DAC具有如下主要特性:一个DAC转换器,有两个独立的输出通道12位模式下数据可以采用左对齐或右对齐同步更新功能可以生成噪声波、三角波等各种波形两个通道可单独或同时转换,每个通道都具有DMA功能具有DMA下溢错误检测功能可以通过外部触发信号进行转换可以外接参考电压VREF+以获得更高的转换分辨率7.1DAC及其应用7.1DAC及其应用7.1.1DAC功能框图通道1:PA4通道2:PA5数据保持寄存器数据输出寄存器触发输入DMA使能待转换数据通过DHRx间接传给DORx。数据送入DOR寄存器后,立即进行转换,输出模拟电压与DOR中数据的关系为:DAC_OUT=VREF+

×DOR/40957.1DAC及其应用

数据格式支持8位和12位模式。在8位模式下,待转换的数据是右对齐的。当DAC配置为12位模式时,数据可以设置为左对齐或右对齐。在12位模式下,如果选择左对齐,那么数据的高12位将被转换,而低4位将被忽略。如果选择12位右对齐模式,那么待转换的数据将被放置在最低12位,而高4位将被填充为0。这种模式允许直接使用一个12位的数据字进行DAC转换,而不需要担心数据对齐的问题,因此使用最频繁。7.1DAC及其应用触发方式指的是启动DAC转换的方式,可以配置为通过软件或者硬件触发转换,也可以配置为不使用触发。不使用触发方式:当向DHRx写入待转换数据后,数据会在一个APB1时钟周期后自动送到寄存器DORx,并立即转换输出。

软件触发:待转换数据输出到DHRx后,必须再启动DAC转换,才能将写入的数据送到DORx并转换输出。硬件触发:数据传输在触发发生以后3个APB1时钟周期后完成。触发源可以通过DAC控制寄存器CR中的TSEL位进行设置和选择,8个触发事件如表7-1所示。

DAC的触发方式7.1DAC及其应用7.1DAC及其应用7.1.2DAC相关HAL库驱动与其他外设一样,要使用DAC,必须调用HAL_DAC_Init()函数对DAC进行初始化配置,并启用DAC总线时钟。之后,调用HAL_DAC_Start()函数启动DAC。此外,在stm32f407xx.h头文件中,将DAC内部所有的寄存器封装为DAC结构体,在stm32f4xx.h中定义了DAC句柄结构体DAC_

HandleTypeDef、DAC通道结构体DAC_ChannelConfTypeDef和DAC状态枚举类型。注意:DAC没有初始化结构体。7.1DAC及其应用在stm32f4xx_hal_dac.c/.h文件中,实现DAC外设初始化及所用的DAC通道配置的函数是HAL_DAC_Init()和HAL_DAC_ConfigChannel()。通道配置主要包括设置通道的触发方式和指定输出缓冲器。这两项设置参数封装为DAC_ChannelConfTypeDef结构体。DAC初始化和通道配置通道触发方式DAC输出缓冲器DAC通道配置结构体7.1DAC及其应用通道触发方式DAC输出缓冲器7.1DAC及其应用7.1DAC及其应用例如,如下代码配置DAC的通道1为定时器TIM2定时触发,启用输出缓冲功能:DAC_ChannelConfTypeDefsConfig;sConfig.DAC_Trigger=DAC_TRIGGER_T2_TRGO;sConfig.DAC_OutputBuffer=DAC_OUTPUTBUFFER_ENABLE;if(HAL_DAC_ConfigChannel(&hdac,&sConfig,DAC_CHANNEL_1)!=HAL_OK)

{

Error_Handler();}7.1DAC及其应用DAC的启动如果将DAC配置为软件触发方式,必须在送出待转换的数据后,再调用HAL_DAC_Start()启动DAC转换。如果配置为不使用触发,当输出数字量后,将立即启动DAC转换,因此不需要调用上述函数。7.1DAC及其应用数字量的输出7.1DAC及其应用【实践案例7-1】利用DAC输出锯齿波本案例要求利用DAC通道1和2产生锯齿波,两个通道分别采用定时器TIM7触发和软件触发。7.1DAC及其应用图7-2

DAC配置CubeMX中的配置7.1DAC及其应用定时间隔(采样间隔):1/[84/84/5000]=5ms图7-3

TIM7参数配置7.1DAC及其应用应用程序的编写7.1DAC及其应用7.1DAC及其应用观察分析:程序中都是延时5ms输出一个点,为什么两个通道输出的锯齿波周期不同?7.1DAC及其应用【照猫画虎7-1】利用DAC输出正弦波本案例要求利用DAC通道1产生正弦波,采用定时器TIM7触发。正弦波的频率通过TIM7的参数配置进行设置,幅度在程序中设置。7.2ADC及其应用7.2.1

功能框图7.2.2ADC的初始化及相关HAL库驱动函数 【实践案例7-2】单通道模拟电压采集——中断方式【照猫画虎7-2】单通道模拟电压采集——查询方式7.2ADC及其应用STM32F4xx系列芯片拥有3个ADC外设,这些ADC可以独立使用,其中ADC1和ADC2还可以组成双重模式(提高采样率)。STM32F407的ADC具有如下主要特性:

1)可配置12位、10位、8位或6位分辨率;

2)单次/连续转换模式和间断模式

3)双重模式(带2个或以上ADC的器件)

4)采样间隔可以按通道分别编程

5)规则转换和注入转换均有外部触发选项

6)ADC转换时间:最大转换速率为2.4MHz,转换时间为0.41us7)转换结束、注入转换结束和发生模拟看门狗事件时产生中断

8)规则通道转换期间可以产生DMA请求

7.2.1功能框图7.2ADC及其应用外部触发输入模拟输入通道

中断请求APB2外设时钟PCLK2STM32的每个ADC多达19个通道,其中16个外部通道IN0~IN15来自与GPIO的模拟模式。模拟输入通道每个ADC还有内部通道。其中ADC1的通道IN16~18分别连接到内部的VSS、内部参考电压VREFINT、芯片内部的温度传感器或者备用电源VBAT。ADC2和ADC3的通道16、17、18全部连接到内部的VSS。7.2ADC及其应用7.2ADC及其应用注意:很多通道是多个ADC共用,从GPIO引脚的角度看,共24个外部通道。根据封装的不同,有些通道不能用。规则通道(RegularChannel)又称为规则组通道,其中多个通道输入的模拟电压按照事先指定的顺序进行转换。注入通道(InjectionChannel)可以理解为插入或插队的意思,是一种在规则通道转换的过程中强行插入转换的通道。如果在规则通道转换过程中,有注入通道插队,则先转换完注入通道输入的模拟电压,之后再回到规则通道的转换流程。7.2ADC及其应用每个ADC的规则组中最多允许有16个通道,这些通道构成一个转换序列,序列中各通道按照配置好的顺序依次进行转换。例如,假设规则组中包括3个通道IN0~IN2,则转换序列可以为IN0-IN1-IN2,也可以为IN0-IN2-IN1、IN1-IN0-IN2等,具体转换顺序可以由规则序列寄存器SQR进行配置。类似地,每个ADC的注入组最多允许有4个通道,各通道的转换顺序可以通过注入序列寄存器JSQR进行配置。7.2ADC及其应用转换序列与转换顺序7.2ADC及其应用规则通道组中的各通道按照规则序列寄存器中指定的顺序转换。一旦启动注入通道,则立即执行注入通道组的转换,并按照注入序列寄存器中各位确定的顺序进行转换。软件触发是通过将控制寄存器CR2中的ADON位置位来启动A/D转换,写入0时则停止转换。这种方式常用于查询方式的A/D转换。硬件触发也就是通过外部事件触发转换,可以是定时器输出触发事件(TRGO)或定时器通道输入捕获信号(CHx),也可以是GPIO引脚输入外部信号等,如图7-8所示。规则组和注入组的触发源分别由CR2中的EXTSEL[2:0]和JEXTSEL[2:0]位进行配置。对外部触发事件,还可以通过设置CR2的EXTEN[1:0]和JEXTEN[1:0]位来控制触发极性,可以是禁止触发检测、上升沿检测、下降沿检测以及上升沿和下降沿均检测。触发源7.2ADC及其应用7.2ADC及其应用注入组数据寄存器JDR注入组最多可以有4个通道,刚好注入数据寄存器也有4个,每个通道对应着自己的寄存器,不会出现数据覆盖的问题。JDR是32位的,低16位有效,数据同样分为左对齐和右对齐,具体由CR2中的D11位ALIGN进行设置。数据寄存器7.2ADC及其应用规则组数据寄存器每个ADC外设中的规则组数据寄存器DR只有一个,这是一个32位的寄存器,但只有低16位有效并且只是用于独立模式存放转换完成数据。因为ADC的最大精度是12位,而DR是16位有效,这样允许ADC存放数据时候选择左对齐或者右对齐,具体由CR2寄存器中的D11位ALIGN进行设置。假如设置ADC的转换精度为12位,如果设置数据为左对齐,那转换结果数据存放在DR寄存器中的D4~15位;如果为右对齐,则存放在D0~11位。

7.2ADC及其应用7.2ADC及其应用ADC的输入时钟ADC_CLK由PCLK2经过分频产生,分频系数可以为2、4、6和8。对于STM32F407ZGT6,一般设置PCLK2=HCLK/2=84MHz,所以程序一般使用4分频或者6分频,以保证转换速率不超过最大值36MHz。

ADC需要若干个ADC_CLK周期完成对输入的电压进行采样,每个通道可以分别用不同的时间采样。其中采样周期最小是3个ADC_CLK周期。转换时间7.2ADC及其应用ADC的总转换时间与ADC的输入时钟和采样时间有关,可以表示为:

Tconv=采样时间+12个周期假设PCLK2=84MHz,预分频系数为4分频,则ADC_CLK时钟频率为21MHz,采样时间设置为最小值3个周期,则转换时间为15个周期,即15/21≈0.71ms。7.2ADC及其应用连续转换(ContinuousConversion)模式这种模式只适用于规则组通道。当规则组中所有通道转换完毕后,立即从第一个通道开始自动启动下一轮转换。连续转换模式通常用于对单个通道进行连续不断的转换,此时规则组中只有一个通道,每次转换结束将数据存入DR后,同时将转换结束标志位EOC置位。转换模式7.2ADC及其应用扫描(ScanConversion)模式在这种模式下,每个通道转换结束后,会立即自动转换规则组或注入组中的下一个通道。每个通道转换结束,都将当前通道的转换结果存放到DR或对应的JDR中。在扫描模式下,可以配置规则组中所有通道转换结束还是在每个规则通道转换结束时将EOC置位。但是注入通道组只有在最后一个通道转换结束时才将JEOC置位。非连续转换(DisontinuousConversion)模式将规则组或注入组通道分成多个子序列,每个子序列相当于合起来相当于一个通道。每次触发,对一个子序列进行转换。对子序列内的多个通道可以进一步配置为连续转换或扫描转换模式。7.2ADC及其应用应用及配置要点——如果规则组中只有一个通道,并且配置禁用扫描模式、启用连续模式,则实现连续转换。单次触发后持续转换同一通道,结果不断更新。这种模式适用于高频信号监测(如音频采样、振动传感器数据采集)、闭环控制系统的实时反馈等。

如果配置禁用扫描和连续模式,则实现单次转换。在这种模式下,每次触发仅转换一个通道,转换完成后停止,适用于低功耗设备的偶发采样(如按键检测、电池电压监测)和单次高精度测量(如实验室仪器的单点数据采集)等场合。7.2ADC及其应用如果规则组中有多个通道,并且配置启用扫描模式、禁用连续模式,则实现扫描转换。在这种模式下,对多个通道按指定顺序转换,完成后停止,适用于多路传感器的周期性采样、设备启动时各传感器状态的自检等。

如果配置启用扫描模式和连续模式,则实现连续扫描转换。每次触发后循环扫描所有通道,各通道转换完后立即从头开始重新扫描转换。这种模式适用于实时多通道周期测量和数据记录。此时需要配合DMA传输,以避免数据覆盖。7.2ADC及其应用对多个规则组通道,配置启用扫描模式和不连续模式,并配置子序列中的通道数,则实现不连续扫描转换。在这种模式下,将规则序列分成多个子序列,每个子序列单独触发(如软件触发SWSTART),适用于按需采样和长序列分段处理(避免单次转换时间过长导致的系统阻塞)等。7.2.2ADC的初始化及相关HAL库驱动7.2ADC及其应用设置通道8为规则组中的第一个通道规则组中的通道数7.2ADC及其应用软件触发7.2ADC及其应用在CubeMX生成的MDK工程中,实现ADC及规则组初始化的操作通过调用MX_ADCx_Init()函数实现,其中x=1~3。该函数定义在ADC.c文件中,依次实现如下3项操作:调用HAL_ADC_Init()函数,配置ADC的全局特性,例如ADC时钟、转换变量、数据对齐格式、启用的通道数等。调用HAL_ADC_ConfigChannel()函数配置规则组通道的转换顺序、采样时间等。调用HAL_ADCEx_InjectedConfigChannel()函数配置注入组通道的转换顺序、采样时间等,该函数定义在stm32f4xx_hal_adc_ex.c文件中。ADC的初始化7.2ADC及其应用ADC的操作访问库函数程序的基本流程如下:调用HAL_ADC_Start()或HAL_ADCEx_InjectedStart()函数,以启动规则组或注入组通道的转换;调用HAL_ADC_PollForConversion()或HAL_ADCEx_InjectedPollForConversion()函数以查询转换是否结束;当查询返回结果为HAL_OK时,调用HAL_ADC_GetValue()或HAL_ADCEx_InjectedGetValue()函数读取转换结果。

查询方式7.2ADC及其应用__IOuint16_tbuf[1];HAL_ADCEx_InjectedStart(&hadc1); /*启动ADC*/while(HAL_ADC_PollForConversion(&hadc1,10)!=HAL_OK);/*等待转换结束*/buf=HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2); /*读取转换结果*/例如,要求以查询方式控制ADC1注入组中通道2的转换并读取转换结果,相应的语句如下:7.2ADC及其应用中断方式如果要求采用中断方式进行A/D转换,程序的基本流程如下:调用HAL_ADC_Start_IT()或HAL_ADCEx_InjectedStart_IT()函数,以启动规则组或注入组通道的转换;当转换结束时,执行ADC_IRQHandler()通用中断服务函数,最后执行相应的中断回调函数HAL_ADC_ConvCpltCallback()或HAL_ADCEx_InjectedConvCpltCallback(),在该函数中读取转换结果。7.2ADC及其应用【实践案例7-2】单通道模拟电压采集——中断方式开发板板载一个贴片滑动变阻器,电路连接如图7-10所示。当旋转滑动变阻器调节旋钮时,其动触点电压也会随之改变,电压变化范围为0~3.3V,亦是开发板默认的ADC电压采集范围。本案例采用软件触发和中断方式实现对滑动变阻器输出单个模拟电压的采集。7.2ADC及其应用CubeMX中的配置及初始化7.2ADC及其应用首先在CubeMX中配置RCC系统时钟,并启用USART1串口。此外,配置启用ADC1的通道8(IN8),并按照图7-11配置其相关参数。在NVICSettings中勾选使能ADC1中断。应用程序的编写7.2ADC及其应用7.2ADC及其应用配置ADC1的转换位数为12位,因此分辨率为1LSB≈0.806mV。7.2ADC及其应用由于程序中将模拟电压用浮点数格式显示,因此注意在工程选项中的C/C++Build/Setting/ToolsSettings/MCU/MPUSettins中勾选Usefloatwithprintffromnewlib-nano选项。【照猫画虎7-2】单通道模拟电压采集修改上述案例,要求用查询方式读取ADC的转换结果,每隔5s用TIM2触发一次A/D转换。7.2ADC及其应用7.3ADC的DMA传输7.3.1DMA控制器7.3.2DMA初始化配置7.3.3DMA的启动和数据传输【实践案例7-3】多通道模拟电压采集【照猫画虎7-3】内部温度监测STM32F407的规则通道可以有16个,但是规则数据寄存器只有一个,如果采用扫描转换模式,则前一个通道的转换结果就会被后一个通道的转换结果覆盖。如果需要用利用同一个ADC外设的多个通道实现多个外部模拟电压的采集,通常需要采用DMA传输技术,以便将转换结果及时转存到存储器中。7.3ADC的DMA传输7.3.1DMA控制器DMA(DirectMemoryAccess,直接存储器访问)传输方式是利用DMA控制器直接控制总线,在外设与存储器之间建立一条直接通道。可以实现外设(例如ADC)到存储器、存储器到外设(例如DAC)或存储器到存储器的数据传输。STM32F4有2个DMA控制器DMA1和DMA2,每个DMA控制器有8个数据流,每个数据流都与一个外设DMA请求(如ADC、DAC和定时器等)相关联,如图7-13和表7-4所示。7.3ADC的DMA传输7.3ADC的DMA传输7.3ADC的DMA传输7.3ADC的DMA传输当达到FIFO的阈值级别时,FIFO的内容移出并存储到目标中。在直接模式下,每完成一次从外设到FIFO的数据传输后,相应的数据立即就会移出并存储到目标器件中。DMA数据传输过程中,可以配置外设和存储器指针在每次传输后自动向后递增或保持不变。当通过单个寄存器访问外设源或目标数据时,一般采用禁止递增模式,即地址保持不变。如果使能了递增模式,则根据配置的数据宽度是字节Byte、半字(HalfWord)或字(Word),每次数据传输后地址递增1、2或4。对于ADC的扫描转换模式,可以配置DMA工作在循环(Circular)模式,以便处理循环缓冲区和连续数据流。当激活循环模式时,要传输的数据个数在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。7.3.2DMA初始化配置7.3ADC的DMA传输图7-15

DMA参数配置界面7.3.3DMA的启动和数据传输根据上述设置,在生成的工程中即可调用HAL_ADC_Start_DMA()函数实现ADC转换结果的DMA传输。该函数启动ADC外设,并在ADC数据传输结束时允许发出DMA请求。函数的原型声明如下:HAL_StatusTypeDefHAL_ADC_Start_DMA(ADC_HandleTypeDef*hadc,uint32_t*pData,uint32_tLength)其中,第一个参数指定所启用的ADC,第二个参数指定数据传送到存储器的地址指针,第3个参数指定传送数据的个数。7.3ADC的DMA传输例如,如下语句HAL_StatusTypeDefHAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_data,3);将启用ADC1外设及其DMA请求。其中ADC_data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论