编码器A、B、Z相脉冲捕捉

编码器A、B、Z相脉冲捕捉
STM32H745单片机+三菱伺服电机
此为个人笔记,如果对同道中人有帮助,欢迎借鉴;如果不喜勿喷;如果有错误欢迎指正。

1、捕获A相脉冲和B相脉冲
使用CUBEMX配置TIM1为编码器模式,这时会自动选择TIM1的channel1和channel2,这两个通道分别捕获A相脉冲和B相脉冲。这里为了捕捉到一个脉冲记一次数,不分频,且ARR=65535。

在这里插入图片描述
在这里插入图片描述
捕捉A相脉冲和B相脉冲的相关代码:
在这里插入图片描述
解释一下为什么我寄存器初始值是65535:因为伺服电机有正转和反转,我测试了我的电机,当正转时,寄存器的值是从0开始累加,反转是从65535开始减少。(这个仅限我自己的电机,我不知道其他的是不是这样)恰好我的研究就需要让他反转。

2、关于Z相脉冲的捕捉

使用的是一个GPIO引脚(PE13)的外部中断。根据外部中断的触发条件:外部信号的上升、下降或二者兼有触发中断。相关配置:
在这里插入图片描述
相关代码:
在这里插入图片描述
上面的代码是PE13引脚的中断回调函数。Z相脉冲主要就是为了伺服电机找零,所以当捕捉到Z相脉冲时停止运行驱动电机的PWM。建议在开启外部中断之前先清除一下标志位。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stm32定时器可以用于生成类光电编码器abz脉冲。光电编码器是一种用于测量角速度和位置的设备,包含A、B和Z信号。其中A和B信号是用于测量角度和方向,Z信号是用于标记一个完整的旋转圈数。下面是一个简单的代码示例,用于配置stm32的定时器生成abz脉冲信号。 首先,需要定义和初始化stm32的定时器模块和GPIO引脚。 ```c #include "stm32f4xx.h" // 定义定时器和GPIO引脚 TIM_HandleTypeDef htim1; GPIO_InitTypeDef GPIO_InitStruct; void TIM_Config(void) { // 初始化定时器模块 TIM_OC_InitTypeDef sConfigOC; __HAL_RCC_TIM1_CLK_ENABLE(); htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim1); // 配置 TIM1_CH1、TIM1_CH2 引脚为复用功能 __HAL_RCC_GPIOE_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // 配置 TIM1_CH3 引脚为普通IO输出 GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // 启动定时器 HAL_TIM_Base_Start(&htim1); // 配置定时器输出通道1和通道2 sConfigOC.OCMode = TIM_OCMODE_TOGGLE; // 切换输出 sConfigOC.Pulse = 32768; // 半周期 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2); // 配置定时器输出通道3 - 用于Z信号 TIM_OC_InitTypeDef sConfigOCZ; sConfigOCZ.OCMode = TIM_OCMODE_TOGGLE; // 切换输出 sConfigOCZ.Pulse = 100; // 半周期 sConfigOCZ.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOCZ.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOCZ, TIM_CHANNEL_3); } int main(void) { // 初始化MCU HAL_Init(); // 配置定时器生成脉冲信号 TIM_Config(); while(1) { // 主程序逻辑 } } ``` 在上述代码中,我们使用了`TIM1`定时器模块,其中A信号使用了定时器的通道1,B信号使用了通道2,Z信号使用了通道3。通过使用定时器的输出比较模式,我们可以通过配置不同的占空比和切换输出来生成应的光电编码器脉冲信号。 这只是一个简单的示例,具体的配置和使用可以根据具体的需求进行修改。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值