STM32片上资源:TIM功能实现之编码器接口

1.ADC简介

(1)ADC是英文Analog—Digital Convener英文简称,意为模拟—数字转换器。

(2)ADC可以将引脚上连续变化的模拟电压转化 为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。(ADC读取引脚上一个模拟电压,转化为一个数据,存在寄存器里)

(3)12为逐次逼近型ADC,1us转化时间。

(4)输入电压范围:0~3.3v,转化结果范围:0~4095。

(5)18个输入通道,可测量16个外部和2个内部信号源。(内部温度传感器和内部参考电压)

(6)规则组和注入组两个转化单元。

(7)模拟看门狗自动检测输入电压范围。(模拟看门狗课检测指定通道,当AD值高于或低于阈值时,看门狗会申请中断)

(8)STM32F103C8T6的ADC资源:ADC1和ADC2,10个外部输入通道(无16个)。

2.在了解ADC之前,先了解ADC的原理——逐次逼近型ADC

注:该芯片只能8个通道,STM32有18个通道,STM32F103C8T6有12位

原理解析:输入信号的未知电压,通过“通道选择开关”到达比较器,与DAC输出已知电压进行比较,通过二分法寻找已知电压和未知电压的相等点,此时未知电压就是已知电压,在把已知电压的值传到三位锁存缓冲器中。

注:因为ADC转换速度快,如果你相转化多路信号,那不必设计多个AD转化器,只需一个转化器,然后加个多路选择开关,想换哪一路,就先拨到哪一个通道。

3.ADC框图

原理理解:信号通过ADCx_IN0,ADCx_IN1........ADCx_IN5口输入数据到GPIO口,然后GPIO口与温度传感器和内部参考电压一起接入到模拟多开关,模拟数据通过模拟多开关输出两路到注入通道和规则通道,规则通道最多处理16个通道,注入组最多处理4个通道,但是规则组同一时间只能处理一路通道,注入组同一时间可以处理4路通道。模拟信号在注入和规则通道中,被转化成数字信号。通过注入组通道产生的数字信号通过注入通道到注入通道数据寄存器,通过规则组通道产生的数字信号通过规则组到规则组通道数据寄存器。当我们想要知道转换后的信息时,只需要读取数据寄存器即可。

注:规则组可同时进行16路数据,但是因为对应的寄存器一次只能存放一个转换后的结果,所以转化一个数据之后,需要即时把转化的结果移出去,不然下一个数据的转化结果会覆盖上一个转化结果。

4.ADC基本结构

注:

(1)AD转化器中,规则组一共可选择16个通道,注入组一共可选择4通道,转化后的结果存放在AD数据寄存器中,如果想要知道转化后的结果,则调用ADC_GetConversionValue()。

(2)AD数据寄存器中,规则组只有一共数据寄存器,而注入组有4个。

(3)触发控制,提供了开始转化START信号,可选择软件触发和硬件触发。

(4)CLOCK来自RCC。

(5)模拟看门狗,用于监测转化结果的范围,如果超出设定范围阈值,就通过中断输出控制,向NVIC中申请中断。

(6)规则组和注入组完成后,会产生一个EOC信号,它会置一个标志位,可通向NVIC。

(7)开关控制(ADC_Cmd()函数),用于给ADC上电。

4.1 ADC基本流程

(1)开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK的分频器也要配置(给ADC)

(2)配置GPIO,把需要用的GPIO配置成模拟输入模式。

(3)配置多路开关,把左边通道接入到右边的规则组列表里。(4)配置ADC转化器,库函数中结构体来配置,包括单次转化还是连续转化,扫描还是非扫描,通道数目,触发源,数据对齐方式(左对齐或右对齐),若需要模拟模拟看门狗,会有几个函数配置

阈值和检配通道,若想开启中断,就在中断输出控制里用ITConfig函数开启对应的中断输出,然后在NVIC中,配置一下优先级,就可以触发中断了。

(5)调用ADC_Cmd函数,开启ADC。

(6)开启ADC后,建议进行矫准,减小误差。

4.2 ADC的输入通道

通道ADC1ADC2ADC2
通道0PA0PA0PA0
通道1PA1PA1PA1
通道2PA2PA2PA2
通道3PA3PA3PA3
通道4PA4PA4PF6
通道5PA5PA5PF7
通道6PA6PA6PF8
通道7PA7PA7PF9
通道8PB0PB0PF10
通道9PB1PB1
通道10PC0PC0PC0
通道11PC1PC1PC1
通道12PC2PC2PC2
通道13PC3PC3PC3
通道14PC4PC4
通道15PC5PC5
通道16温度传感器
通道17内部参考电压

注:

(1)ADC1与ADC2引脚全都相同,作用:双ADC模式,ADC1和ADC2一起工作,它俩可配合组成同步模式,交叉等模式。

(2)STM32F103C8T6无ADC3.

(3)由于STM32F103C8T6只有GPIOA和GPIOB。所以STM32F103C8T6只有通道0到通道9和通道16,17,共12通道。

5.规则组的工作模式

模式一单次转化,非扫描模式
模式二连续转化,非扫描模式
模式三单次转化,扫描模式
模式四连续转化,扫描模式

5.1 模式一:单次转化,非扫描模式

(1)在非扫描模式下,这个“菜单”只要第一个序列1的位置有效,这时菜单同时选中一组的方式就退化为简单地选中一个的方式了。

(2)在这里我们可在序列1的位置指定我们想转换的通道,比如通道2写在这个位置,然后我们可以触发转换,ADC就会对这个通道2进行模数转换,转换完成后,转化结果放在数据寄存器中,通时给EOC标志位置1.自此,整个过程结束。

(3)我们判断这个EOC标志位,如果转化完了,那我们就可直接在数据寄存器里读取结果了。

5.2 模式三:单次转换,扫描模式

(1)单次转换:每触发一次,转化结束后,会停下来,下次转化需在触发。

(2)扫描模式:用到“菜单”,可进行“点菜”,可选多个通道,每个位置是通道几可以任意指定,并且也可以重复。

(3)扫描模式需要告诉通道数目:因为16个通道数目可以不用完,只用前几个,所以要给一个通道数目的参数,告诉它,我有几个通道,那它就会只看前几个位置。

(4)每次触发后,它就依次对这前几个位置进行AD转换,转化结果都放在数据寄存器里,这是为了防止数据被覆盖i,就需要用DMA及时将数据挪出来,这几个通道转化完成后,产生EOC信号,转换结束。

5.3 模式二:连续转换,非扫描模式

(1)非扫描模式:所以菜单就只用第一个。

(2)连续转换:与单次转换不同的是,它在一次转换结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去。(好处:开始转化之后不需要等待一段时间的,因为它一直都在转换的,也不用判断是否结束的,想要读AD值时,直接从数据寄存器中取就是了)

5.4 模式四:连续转换,扫描模式

与模式三不同时,一次转化后,立刻开始下一次转化。

5.5 补充:间断模式(在扫描模式中)

作用:在扫描过程中,每隔几个转换,就暂停一次,需再次触发,才能继续。

6.ADC的触发控制

用于ADC1,ADC2规则通道的外部触发

触发源有:

(1)TIM1_CC1事件

(2)TIM1_CC2事件

(3)TIM1_CC3事件

(4)TIM2_CC2事件

(5)TIM3_TRGO事件

(6)TIM4_CC4事件

(7)EXTI线11 / TIM8_TRGO事件

(8)SWSTART

注:

(1)TIM1_CC1事件,TIM1_CC2事件,TIM1_CC3事件,TIM2_CC2事件,TIM3_TRGO事件,TIM4_CC4事件——来自片上定时器的内部信号。

(2)EXTI线11 / TIM8_TRGO事件——外部引脚 / 来自片上定时器的内部信号。(具体是引脚还是定时器,需要用AFIO重映射来确定)

(3)SWSTART——软件控制位。(软件触发)

7.ADC数据对齐

STM32F103C8T6是12位,它的转换结果,是一个12位数据,但数据寄存器是16位的,所以存在一个数据对齐问题

7.1 数据右对齐

规则组:

0000D11D10D9D8D7D6D5D4D3D2D1D0

7.2 数据左对齐

规则组:

D11D10D9D8D7D6D5D4D3D2D1D00000

注:

(1)一般使用第一种右对齐,因为这样读取这个16位寄存器直接就是转换结果。

(2)若选左对齐,读出值比右对齐16倍。

(3)左对齐作用:0~4095值太高,选择左对齐,取出高8位读,舍弃第四位的精度。

8.转换时间(一般敏感,因为AD转换很快)

(1)AD转换步骤:采样,保持,量化,编码。

(2)STM32ADC的总转换时间为:

        Tconv = 采样时间 + 12.5个ADC周期

采用时间越长,越可避免毛刺信号。

12为ADC,需要2个周期,多出0.5个周期,可能是做其他一些东西。

示例:当ADCCLK = 14MHZ时,采样时间为1.5ADC周期,Tconv =1.5+12.5=14个ADC周期=1us

9.校准(Calibration)

(1)ADC有个内置自矫准模式。校准可大幅减少因为内部电容器组的变化而造成的精准误差。校准期间,在每个电容器上部都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。

(2)建议每次上电后执行一次校准。(函数调用)

(3)启动校准前,ADC必须处于关电状态超过两个ADC周期。

10.ADC相关函数

10.1 标配函数

void ADC_DeInit();

void ADC_Init();

void ADC_StructureInit();

void ADC_Cmd();

10.2 void ADC_DMACmd();

作用:用于开启DMAS输出信号。

10.3 void ADC_TIConfig();

作用:中断输出控制。

10.4 用于控制校准函数

void ADC_ResetCalibration();                                #复位校准

Flagstatus ADC_GetResetCalibrationStatus();      #获取复位校准状态

void ADC_StartCalibration();                                  #开始校准

Flagstatus ADC_GetCalibrationStatus()                #获取开始校准状态

10.5 void ADC_SoftwareStartConvCmd()           

作用:ADC软件触发函数

10.6 配置间断模式

void ADC_DisModeChannelCourtConfig()            #配置间断模式

void ADC_DisModeCmd()                                     #每隔几个通道配置

10.7 void ADC_RetConversionValue();           

作用:ADC规则组通道配置

10.8 void ADC_ExternalTrigConVmd()           

作用:ADC外部触发转化控制,是否允许外部触发转化。

10.9 uint ADC_GetConversionValue()                 

作用:ADC获取转换值

10.10 uint ADC_GetPualModeConversionValue()     

作用:ADC获取双模式转换值

10.11 标志位标志函数

FlagStatus ADC_GetFlagStatus();

void ADC_ClearFlag();

FlagStatus ADC_GetITStatus();

void ADC_ClearITPendingBit();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407ZET6是STMicroelectronics推出的一款基于ARM Cortex-M4内核的32位微控制器。它具有高性能和丰富的外设资源,广泛应用于各种嵌入式系统中。 TIM4是STM32F407ZET6微控制器上的一个定时器模块,它可以用于测量时间、生成定时脉冲等应用。除了定时功能外,TIM4还集成了编码器模式,可以用于读取和解析编码器信号。 编码器是一种用于测量物理量或位置的装置。它通常由一个固定部分和一个旋转部分组成,旋转部分通过旋转来改变物理量或位置。编码器根据旋转部分的变化生成一个脉冲序列,这个脉冲序列可以用来测量旋转时间、计数旋转角度等信息。 在使用STM32F407ZET6的TIM4编码器模式时,我们可以配置TIM4定时器来读取编码器信号。具体步骤如下: 1. 配置GPIO引脚:编码器通常使用两个引脚,一个用于读取脉冲信号(例如PA0引脚),另一个用于读取方向信号(例如PA1引脚)。需要将这两个引脚配置为输入模式,并使能GPIO时钟。 2. 配置TIM4定时器:配置TIM4定时器为编码器模式,设置计数方向(正向递增或递减)、计数模式(四倍计数或正常计数)等参数。 3. 启动TIM4定时器:启动TIM4定时器开始计数。 4. 读取编码器值:通过读取TIM4的计数寄存器,可以得到编码器的当前值。根据TIM4的编码器模式和计数方向,可以计算出旋转的角度或物理量。 总之,使用STM32F407ZET6的TIM4编码器模式可以很方便地读取和解析编码器信号。这为测量物理量、计数旋转角度等应用提供了便利。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值