STM32+步进电机

2020-7-28更新

这篇最后一次更新,最后是利用 STM32 的定时器1两个通道和定时器3的一个通道驱动三个同时产生 PWM 驱动了三个电机,具体例程已经丢失,不过道理是一样的,可能 STM32 定时器1产生双通道 PWM 会有一点点麻烦,不过看看其他博文借鉴一下是可以成功的。

2020-3-1更新

五一的程序,只是一个方向转
https://blog.csdn.net/weixin_43086497/article/details/104597888

2020-2-29更新

这里有个正点原子官方资料,可以参考
http://www.openedv.com/forum.php?mod=viewthread&tid=76190

原内容

买了个没有名牌的二相四线电机,搞得头大,现在简单调通了。
我用的是STM32f103RCT6+TBB6600驱动器+42步进电机。
STM32+步进电机_第1张图片
电机有两种接法,共阳极和共阴极
STM32+步进电机_第2张图片
STM32+步进电机_第3张图片
我用的共阳极的解法。
我买的电机连个名牌都没有,问卖家也啥都没有。按照网上的方法测出来AB两相,具体可以百度一下,或者B站上面直接搜步进电机也有方法。

程序,简单正反转

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "key.h"
/*
void TIM1_PWM_Init(u16 arr,u16 psc)
Hz£ =  72000000/(arr+1)/(psc+1)
*/

 int main(void)
 {	
	u8 keysta;
	delay_init();	     
	LED_Init();	
	KEY_Init();
   
	EN = 1;
	DIR = 1;
  //	 
	TIM1_PWM_Init(719,49);//72000000/720=100000  30-150   
  while(1)
	{
		keysta = KEY_Scan(0);
		if(keysta==1)
		{
		  LED1 = ~LED1;
			EN = 0;
			//TIM_Cmd(TIM1, DISABLE);  //ʹÄÜTIM1
			
			delay_ms(1000);
			//TIM_Cmd(TIM1, ENABLE);
			//DIR = 0;
			DIR = 0;
			EN = 1;
			keysta = 0;
		}
	} 
}

正点原子的官方PWM例程改的。下面是接的3个IO口PA6PA7PA8,脉冲端找个能产生PWM的就行,其他两个普通IO即可
#define PUL PAout(8)
#define DIR PAout(7)
#define EN PAout(6)
我踩的坑:
1.由于我用的是共阳极的解法,所以我把PUL+ EN+ DIR+都接在了板子上的5V上的地方,因为驱动器上面也这样标,这样的后果是,电机时转时不转,还会发烫。后面我把这三接到了3.3V上面的地方正常了。这里我也不知道为什么,有懂的评论解释一下。
2.程序有些要用的IO我没初始化就直接用了,导致我一直不知道是什么原因,细心检查才发现。需要认真看32IO初始化的每一个步骤。
3.给的脉冲频率太高,丢步了,每个电机的特性不同,能够接受的频率也不一样,要注意。32PWM初始化频率的计算公式以上面 TIM1_PWM_Init(719,49);为例:
TIM1_PWM_Init(u16 arr,u16 psc)//arr:自动重装值 psc:时钟预分频系数
如果系统时钟是72M,那么PWM的频率就是
Frquency = 72000000/(arr+1)/(psc+1);//单位Hz
自动重装值就相当于PWM周期。
4.驱动器上面的细分要对应电机。我这里电机是1.5A的电流,所以要打开驱动器上面的S4 S5。
细分步进电机步距角按下列方法计算:步距角=电机固有步距角/ 细分数。如:一台固有步距角为1.8 °的步进电机在4细分下步距角为
1.8 °/4=0.45 °驱动板上拨码开关1、2、3分对应S1、S2、S3。
后面有空把用五一调的也一并上传了。

你可能感兴趣的:(stm32)