描述
工作需要利用了一些时间完成了定时器中断控制步进电机,这篇文章记录一下开发过程

步进电机控制


1. 基本知识


步进电机是有机座号的,又叫电机外径,一共有28、42、57、86、110、130型号。我使用的是42电机,用尺子量量就会发现它的尺寸是42mm

步进电机步距角:输入一个电脉冲信号,步进电动机转子相应的角位移。我使用的电机步距角为1.8°

细分数就是指电机运转时的真实步距角是固有步距角(整步)的几分指一。我使用时,将细分数调整为了125细分

PWM控制,这个我单独成一节来讲

2. PWM控制


具体可以自行学习:PWM是什么,它能做什么,和怎么生成它
。在控制步进电机转速时,需要设置发送脉冲频率。这里需要掌握的就是下面的公式:

时钟频率(system clk) / 预分频(psc) /想要的pwm频率 = arr(重装值)
我的设置是,时钟频率为108M=108×106, 预分频psc为108,重载值是10,因此我生成的PWM频率为100kHz(105)


3. 实际操作


根据我的电机设置,步距角为1.8°,125细分。那么我发多少个脉冲对应步进电机转一圈呢,答案是(360 / 1.8)* 125 = 25000

我的项目是,步进电机控制一个转盘,因此2者之前存在一个齿轮变速。两者的齿轮比为90:1,意思就是说步进电机转90°,转盘转1°。

因此如果想固定控制转盘移动度数为θ,需要发送的脉冲数为 (θ/360)×90×25000 个脉冲

stm32代码编写知识
首先在网上搜索stm32F7型号单片机的产品手册,找到其中的管脚配置说明,我这里贴出一个截图来说明
在这里插入图片描述

这里我懂得也不是很多,比较清楚的是这个图片是记录每个管脚的功能的(当然这不是全部截图,我只是示意)

例如PB0管脚,可以看到它是支持TIM3_CH3定时器的(定时器3的3通道)。我只了解到了这些,其实关于定时器TIM的使用还是可以继续学习的。

我使用了PB3管脚,使用了上面记录的TIM2_CH2这个定时器。我是有一个PB0管脚的定时器使用代码的,我根据PB3和PB0的区别更改了那部分代码就成功使用了,具体使用细节可以看代码。

我的代码:
这里要贴出一些我写的核心代码,涉及到如何实现定时器中断以及一些初级知识,我都会写在备注中。完整项目我会放到github上。

算了我改主意了,我在这里还是写几行备注代码吧,毕竟不是搞单片机的,水平还是有限

// 设置PB0管脚为高电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
// 设置PB0管脚为低电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);

// 开启定时器
HAL_TIM_Base_Start_IT(&TIM3_Handler);
// 关闭定时器
HAL_TIM_Base_Stop_IT(&TIM3_Handler);

除了这些,项目中还用到了串口通信的一些代码,用于上位机使用XCOM发送一个移动角度给stm32,代码中涉及到了uint8_t*的格式转换问题

总结
我把项目都放github上吧,今天上午总结了一下上周两三天的学习成果,不是搞这个的,不能再继续总结下去了,就这样吧