STM32F429第二十六篇之编码器功能

前言

编码器功能是F429的定时器重要的功能之一,在项目中经常要用到。本章主要介绍F429的编码器功能。

主要参考文献:

  • RM0090参考文档

编码器

编码器通常可以分成以下两类:

  • 增量式编码器:输出编码器的旋转量
  • 绝对式编码器:直接输出编码器的位置

下面简单介绍一下需要用到F429编码器模块的增量式编码器。

在这里插入图片描述
如上图所示,增量式编码器一般输出通道A和通道B两组信号。这两组信号之间有90度的相位差(即四分之一的相位差),通过判断脉冲的频率即可得到编码器的旋转速度,而通过判断通道A和通道B之间的相位关系,即可判断编码器的旋转方向。一般来说,当编码器正转时,通道A的脉冲信号相位超前通道B,而当编码器反转时,正好相反,通道B的脉冲信号相位超前通道A。

功能框图

在这里插入图片描述
如上图所示,编码器模块的功能很简单:

  1. 信号通过通道1和通道2进入计时器模块。
  2. 信号经过编码器模块的处理,形成可以让计数器增减的脉冲信号。
  3. 脉冲信号经过预分频,驱动计数器增减。

通过以上分析,可知编码器模块的最简单使用方法为:

  1. 配置完成定时器的编码器初始化。
  2. 没经过一段固定时间,读取编码器的值CNT。

功能

F429选择编码器接口模式时,共有三种计数模式,通过TIMx_SMCR位的SMS位配置:

  1. 仅在TI1处计数
  2. 仅在TI2处计数
  3. 在TI1和TI2处都计数
    在这里插入图片描述

通过编程 TIMx_CCER 寄存器的 CC1P 和 CC2P 位,选择 TI1 和 TI2 极性。如果需要,还可 对输入滤波器进行编程。CC1NP 和 CC2NP 必须保持低电平。

在 TIMx_CR1 寄 存器的 CEN 位中写入“1”,使能计数器。根据该信号转换序列,计数器相应递增或递减计数,同时硬件对 TIMx_CR1 寄存器的 DIR 位进行相应修改

因此,在启动前必须先配置 TIMx_ARR。计数器从 0 递增计数到 ARR,或从 ARR 递减计数到 0。
在这里插入图片描述
定时器配置为编码器接口模式时,会提供传感器当前位置的相关信息。使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。根据两个事件之间的时间间隔,还可定期读取计数器。如果可能,可以将计数器值锁存到第三个输入捕获寄存器来实现此目的(捕获信号必须为周期性信号,可以由另一个定时器产生);还可以通过由实时时钟生成的DMA 请求读取计数器值

<think>我们正在使用STM32CubeMX配置STM32F405RGT6的定时器以输出PWM信号来控制直流电机。直流电机通常通过PWM信号控制速度,通过改变占空比来调节电机两端的平均电压。注意:直流电机控制需要驱动电路(如H桥),STM32的PWM信号通常需要连接到电机驱动芯片(如L298N、DRV8833等)的输入引脚。步骤如下:1.在STM32CubeMX中设置时钟源和时钟树。2.配置定时器为PWM模式,选择合适的定时器(如TIM1、TIM8等高级定时器,或者TIM2、TIM3、TIM4、TIM5等通用定时器)。3.设置定时器的预分频器(PSC)和自动重载值(ARR)以确定PWM频率。通常电机控制PWM频率在10kHz~20kHz之间(可避免音频噪声且效率较高)。4.配置通道(如CH1,CH2等)为PWM模式。5.生成代码,并在生成的代码中启动PWM并设置占空比。具体步骤:第一步:打开STM32CubeMX,创建新工程,选择STM32F405RGT6。第二步:配置时钟:-在“RCC”中,设置高速外部时钟(HSE)为晶振(Crystal/CeramicResonator)。-在“ClockConfiguration”中,配置系统时钟为168MHz(最大值)。第三步:配置定时器(以TIM3为例):-在“Timers”部分找到TIM3。-设置时钟源为“InternalClock”。-然后设置通道(如Channel1)为“PWMGenerationCH1”。第四步:配置定时器参数:-在“ParameterSettings”选项卡中:-Prescaler(PSC):设置预分频值。定时器时钟为84MHz(APB1总线频率为84MHz),若要得到20kHz的PWM频率,则:计数周期=(定时器时钟频率)/(预分频系数+1)/(自动重载值+1)即:PWM频率=84,000,000/(PSC+1)/(ARR+1)设PSC=83,则定时器时钟为1MHz(84MHz/84=1MHz),再设ARR=49(周期为50),则频率=1MHz/50=20kHz。因此:PSC=83,CounterPeriod(ARR)=49。-CounterMode:向上计数(Up)。-PWM模式:模式1(PWMMode1)或模式2(PWMMode2)均可,但注意极性。通常,当占空比值为0时,输出一直为低,我们选择PWMMode1和PolarityLow(低电平有效)即可。但具体取决于你的驱动电路逻辑。-其他保持默认。第五步:配置GPIO:实际上在配置TIM3通道时会自动配置对应的GPIO(如PA6或PB4等,具体查看芯片手册)。你可以在Pinout图中检查。第六步:生成代码:-点击“Project”->“GenerateCode”。第七步:在生成的代码中启动PWM并设置占空比:-在main函数中,HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);-在需要改变占空比的地方,使用__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,duty_value);其中duty_value的取值范围是0到ARR(即0到49)。例如要设置50%占空比,则duty_value=(ARR+1)*0.5-1=50*0.5-1=24?但通常我们使用:占空比=(pulse/(ARR+1))*100%所以pulse=(占空比百分比)*(ARR+1)/100例如20%占空比:pulse=(20*50)/100=10。那么设置__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,10)即可。注意:如果使用高级定时器(如TIM1或TIM8),需要先启动定时器,并设置MOE位(主输出使能)。使用HAL库提供的宏:HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);__HAL_TIM_MOE_ENABLE(&htim1);//如果是TIM1,则调用此宏此外,如果使用两个通道控制一个电机的方向(比如H桥的两个输入),则需要配置两个PWM通道,并且可能还需要配置互补通道和死区时间(防止桥臂直通)。但是,对于简单的单向控制或者使用单通道控制电机的速度(电机驱动板有方向引脚),可以只使用一个PWM通道。问题补充:用户提到同时控制两个电机的问题,如果两个电机分别由两个定时器控制,那么可以独立设置占空比。如果两个电机由同一个定时器的不同通道控制,那么它们的PWM频率相同(因为同一个定时器),但占空比可以分别设置。同时控制两个电机出现的问题(如相互干扰、抖动)可能是由于控制策略(如采样时间、中断优先级等)引起的。需要确保两个电机的控制周期相同且同步,并且中断优先级配置合理。另外,电源供应能力也需要考虑。根据用户引用中提到的odrive做法,设置两个PWM波形90°相位差可能有助于降低干扰。这可以通过定时器的主从模式(Master-Slave)来实现相位同步。具体来说,用一个定时器作为主定时器,另一个作为从定时器,使用内部触发(ITRx)或外部触发。但是,STM32CubeMX配置主从模式相对复杂,可能需要手动配置寄存器。另一种方法是使用同一个定时器的两个通道,但使用输出比较模式产生相位差(或使用PWM模式且设置不同的捕捉比较寄存器值来模拟相位差,但这只能产生固定相位差)?不过,对于同一定时器的不同通道,其输出是同步的(计数器相同,所以相位差为0)。因此,为了产生相位差,需要使用两个定时器,并设置一个定时器相对于另一个延迟半个周期的时间(即ARR的一半)启动。这可以通过主从模式实现:主定时器启动时,通过触发输出(TRGO)触发从定时器的计数器开始。然后从定时器设置一个偏移量(例如,使用预装载寄存器在触发后延迟一定时间启动)。具体操作比较复杂,在CubeMX中设置步骤大致如下:1.配置第一个定时器(TIM_Master)为PWM模式,设置好频率(如20kHz)。2.在TIM_Master的“Master/SlaveMode”中,设置触发事件(TRGO)为“UpdateEvent”。3.配置第二个定时器(TIM_Slave)为PWM模式,设置相同的频率(相同的PSC和ARR)。4.在TIM_Slave的“TriggerSource”中选择“ITRx”(这里x由两个定时器的硬件连接决定,如TIM1可以触发TIM2,通过配置定时器的从模式触发源)。5.设置TIM_Slave的工作模式为“TriggerMode”(触发模式)或者“GatedMode”(门控模式)。使用触发模式:当检测到触发事件时,定时器启动计数。6.然后设置TIM_Slave的偏移量(即在触发事件发生后,延迟多少个时钟周期开始计数)。这可以通过设置TIM_Slave的计数寄存器(CNT)为需要延迟的计数值。但注意,因为触发发生在主定时器的更新事件(计数器溢出时),我们希望从定时器在触发后延迟半个周期(即ARR/2)开始计数。但是,在触发模式下,从定时器在触发信号来的时候复位并开始计数(从0开始),所以我们无法直接设置偏移量。另一种方法:使用从定时器的预装载寄存器(TIMx_EGR)产生更新事件来设置初始计数,但这需要直接操作寄存器,而且HAL库没有直接支持。或者,我们可以使用一个定时器的两个通道,但其中一个通道设置为翻转模式(Togglemode),但这样会使得占空比固定为50%,不能调节。因此,通常使用两个定时器并设置同步。这里不做详细展开。但是,根据引用[1]中提到的,用户的问题可能是同时控制两个电机时,如果使用同一组定时器资源,需要考虑定时器配置的独立性。在STM32F4中,多个定时器可以独立运行,因此同时控制两个电机应该没有问题。出现的抖动可能是控制算法的问题(比如采样时间不同步,或者中断优先级导致一个电机的控制周期被另一个打断),或者电源干扰。因此,建议:1.确保两个电机的PWM控制独立(使用两个定时器,互不干扰)。2.使用高优先级的中断进行电机控制(如将定时器中断优先级设置为最高),并确保中断服务函数执行时间足够短。3.注意电机的地线和电源的退耦,减小干扰。下面回归到用户问题:如何使用STM32CubeMX配置PWM模式控制直流电机。我们以上述TIM3配置为例。生成代码后,在代码中添加:在main.c的main函数中:/*启动PWM通道*/HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);/*设置占空比,例如设置50%占空比*/__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,25);//因为ARR=49,所以50%占空比对应25(50/2=25)如果需要实时改变占空比,可以在循环中修改,或者在其他函数(如按键中断)中修改。同时控制两个电机的情况,使用两个定时器分别配置,然后分别启动并设置各自的占空比。关于电源问题:如果两个电机同时运行时,其中一个电机停止时(设定占空比为0)发生抖动,可能是电源问题(电机反电动势或电源电压波动影响)或者驱动电路的问题。确保电源功率足够且电压稳定。另外,设置占空比为0时,可能是驱动电路将电机短路(即刹车),导致电机快速停止,但可能引起抖动。可以考虑设置成自由停止(即驱动电路全部关闭)来避免。由于问题比较复杂,我们只聚焦于配置PWM。更详细的控制策略需要根据具体应用调整。参考资料:[1]和[2]提供了关于STM32F405RGT6的引脚定义和示例,但不直接涉及PWM配置细节。</think> 以下是使用 STM32CubeMX 为 STM32F405RGT6 配置直流电机 PWM 模式的详细教程: ### 配置步骤 1. **创建工程** - 打开 STM32CubeMX → 新建工程 → 选择 `STM32F405RGT6` - 在 Pinout 视图中确认芯片型号正确 2. **时钟配置** - 进入 "Clock Configuration" 标签页 - 设置 HSE 为晶振源(8-26MHz) - 配置系统时钟为最大 168MHz(具体步骤见注 1) 3. **定时器配置** - 进入 "Timers" 标签页 - 选择高级定时器(TIM1/TIM8)或通用定时器(TIM2-TIM5) - 启用 PWM 通道: ```plaintext 例:TIM3 配置 → Clock Source: Internal Clock → Channel1: PWM Generation CH1 ``` - 参数设置(注 2): - Prescaler: 83(将 84MHz 分频为 1MHz) - Counter Period: 999(生成 1kHz PWM) - Pulse: 默认 0(占空比初始值) 4. **GPIO 设置** - 自动分配 PWM 输出引脚(如 PB4 对应 TIM3_CH1) - 验证引脚无冲突(注 3) 5. **工程生成** - 进入 "Project Manager": - 设置工程名/路径 - 选择 IDE(MDK-ARM/IAR/SW4STM32) - 代码生成选项:生成 .c/.h 文件 - 点击 "Generate Code" ### 应用代码示例 ```c // main.c 中添加 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动 PWM // 动态修改占空比(25% 占空比示例) __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 250); ``` ### 关键注意事项 1. **多电机控制优化** - 对每个电机使用独立定时器(例:TIM1 控制 M0,TIM3 控制 M1) - 设置相位同步(避免干扰): ```c // 在 PWM 启动前添加 HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); ``` - 参考 ODrive 方案([^1]): - 90° 相位差配置可减少干扰 - 固定采样周期读取编码器数据 2. **性能问题解决** - **速度瓶颈**:当无法达到 T300 转速时: - 验证预分频比(Prescaler)是否过大 - 检查自动重载值(ARR)是否过小 - 确保 HCLK 时钟正确配置为 168MHz 3. **抗干扰措施** - 电机驱动电源与 MCU 电源隔离 - PWM 输出引脚串联 22Ω 电阻 - 增加硬件死区时间(针对 H 桥电路) ### 调试技巧 1. 使用逻辑分析仪验证 PWM 波形 2. 在 TIMx_IRQHandler 中添加占空比监测 3. 通过 STM32CubeMonitor 实时调整参数 > **配置验证指标**: > - 频率误差:< ±1% > - 占空比分辨率:0.1% (ARR=1000 时) > - 最小死区时间:170ns (STM32F4 特性) **注**: 1. 时钟配置路径:`RCC → HSE → Crystal/Ceramic Resonator → Clock Configuration → 设置 PLL 分频至 168MHz` 2. PWM 频率计算:$$f_{PWM} = \frac{f_{TIMx}}{(Prescaler + 1) \times (Counter Period + 1)}$$ 3. 引脚冲突检查:`Pinout → Conflict` 标签页查看警告 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值