使用stm32控制步进电机
简述:根据使用正点原子教程结合csdn资源改过来的,正点原子精英版,控制器选用的是TB6600,电机随便选用的是28的。
一共包括三个文件,.h .c main文件
.h头文件主要是做函数声明一样的东西,.c源文件是主要的配置文件,main文件是主程序,调用已经配置好的资源产生相应的功能。
主要是利用.c文件中的定时器产生pwm波,通过控制器来控制步进电机,在很多的博文和资料中,已经说明,电机转速关联于pwm波的频率,具体不详述。
关于控制器与电机和板子之间的接线,采用的是共阴极接法。P+连接于板子上面的pwm波的输出IO口(A7),控制器共阴极后阴极线连接于
板子的GND。其他接线按照控制器说明书来搞
代码
主要如下:.c文件(下面的代码中文注释乱码了,不知道为啥,不影响)
#include "pwm.h"
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能AFIO和A口
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化IO口
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//重映射,这里没有用,是调试的时候搞得,注释掉了
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down;//向下计数
TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//设置TIM3
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;//pwm2或者1都可以
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;//低电平有效
TIM_OC2Init(TIM3,&TIM_OCInitStruct);//通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);//使能
}
.h文件(arr和psc是计算频率的重要参数,频率调节转速
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
main文件(下面 的代码中在TIM3__pwm_Init这句话时,就已经可以产生pwm波了,具体频率根据其他资源中的公式可以算出来,不详述,后面while(1)死循环中的是控制电机反转的和锁死的,反转只需要的D+(E+)中转换一个电平就可以了,其他注释掉的文件没用)
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
#include "pwm.h"
int main(void)
{
LED_Init();
delay_init();
LED1=0;
TIM3_PWM_Init(899,199);
while(1){
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//换向
delay_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_6);//再换向
delay_ms(500);
}
}
记住
添加相应的工程和路径和文件
2021年1月6号添加,关于在运行过程中控制电机停止转动,继续转动:
函数 TIM_SetCompare2(TIMx,y);
这个函数控制电机停止,在我自己的摸索过程中,发现为了一一对应,
需要将OC初始化 函数 中的 (TIM_OCInitStruct.TIM_OCMode)与占空比设置函数TIM_SetCompare2(TIMx,y);两者对应起来,比如采用PWM2模式(TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2),就需要用TIM_SetCompare2(TIMx,y);
相应的PWM1模式(TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1),就需要用TIM_SetCompare2(TIMx,y);
之后将TIM初始化过程中的计数模式函数:TIM_TimeBaseInitStruct.TIM_CounterMode和参数:y对应起来。比如
向下计数(TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Down)时,参数y为arr,可以让电机停转,y为0可以继续转动。
相应的采用向上计数模式(TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up),参数y为0则停止转动,为arr则继续转动。