让电机转起来--基于STM32F1控制两相步进电机转动-新手小白入(完整代码)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、基础内容
    • 1、步进电机
    • 2、电机驱动器
    • 3、接线方法
  • 二、最简单控制电机转动程序
    • 1.定时器的输出比较功能生成PWM波
    • 2.电机方向控制
    • 3.主函数
  • 三、进阶版电机控制程序
    • 1.加入按键控制
    • 2.motor.c中添加一个函数
    • 3.主函数
  • 总结


前言

本帖分享步进电机与驱动器的接线方式、速度计算与代码分析。第一次接触电机的小白可能会面对无数的代码分析帖或者是复杂的控制程序帖无从下手(我也是这样过来的hhhh)。本帖最简单程序分享可直接拿来套用,然后在接触过程中逐步完成对控制电机的整体学习。
第一部分分享的代码最为简单,程序下载到开发板上,即可让电机转动起来,无任何对电机的调整控制
第二部分内容为控制进阶版。即在第一部分的基础上添加电机的启停、方向的控制
内容上有不当之处可探讨指出~
--------------------------------若有需要,后期可更新转速的调整以及固定角度转动代码内容----------------------------------------


一、基础内容

1、步进电机

两相步进电机一般引出四根线,四根线分为两组,分别是A组、B组(常称为A、B相)。一般电机的说明会指出哪两种颜色的线为一组。若是某个未知电机,区分不同组的方法也很简单:将其中两根线短接在一起,扭动转子,如果能扭动,则这两根线不是一组,则换一根线,同样的方法,直到某两根线短接在一起,扭动转子时有阻力,则这两根线为一组。
让电机转起来--基于STM32F1控制两相步进电机转动-新手小白入(完整代码)_第1张图片

2、电机驱动器

控制电机的转动,需要电机、控制器、驱动器缺一不可。控制器即为stm32开发板,驱动器如下图。图中靠下的那个端子上的A+,A-,B+,B-,需要连接电机所分辨出的两组线;V+,V-,连接线性电源,可咨询电机商家,建议的电压值为多少,本帖中我的建议电压值为24V;上方端子与开发板连线。驱动器上一般配备有两个指示灯,根据指示灯的亮灭情况,自行判断当前的状态是否正确。
另外驱动器中间的一排开关,可以根据驱动器的说明对应开关的ON\OFF来选择具体的功能。以图中的驱动器为例,开关SW1-SW4选定工作电流的大小,SW5-SW8是每步对应的脉冲数,数值越大,对应的电机精度就越高。

让电机转起来--基于STM32F1控制两相步进电机转动-新手小白入(完整代码)_第2张图片

3、接线方法

驱动器与stm32开发板的接线方式有两种,共阴极和共阳极接法,其实效果都一样,两种接法没有好坏之分。

这里我采用共阴极接法,PUL+接单片机的PA1,DIR+接PB2;PUL-连DIR-连到单片机的GND引脚,ENA可不接。
让电机转起来--基于STM32F1控制两相步进电机转动-新手小白入(完整代码)_第3张图片
接完线后,我们来看程序部分。

二、最简单控制电机转动程序

1.定时器的输出比较功能生成PWM波

timer.c
PWM选用定时器2的通道2对应单片机的PA1引脚。
其中,psc是时钟的预分频值,arr是计数器的值,计算PWM的频率公式为:f=系统时钟/(arr*psc).
STM32F103ZET6的系统时钟为72M,可以设置arr=625,psc=72,算得f=1600Hz,为啥要设置这个频率呢?这就说到我们上面说讲的驱动器上的开关选择脉冲,因为脉冲数我选择的是1600。这样设置电机转动一秒钟的话,电机的转子正好转动360°,方便计算。

#include "timer.h"
//TIM2是通用定时器
void TIM2_OCInit(unsigned int arr,unsigned int psc)
{
   
  //结构体:GPIO, 时钟,输出通道
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	//PA1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//引脚
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//输出模式-复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
	
	//初始化TIM2
  TIM_TimeBaseStructure.TIM_Period = arr-1;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  TIM_TimeBaseStructure.TIM_Prescaler = psc-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure

你可能感兴趣的:(stm32,嵌入式硬件,单片机)