这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 使用stm32控制驱动步进电机

共5条 1/1 1 跳转至

使用stm32控制驱动步进电机

高工
2022-02-28 09:52:21     打赏

使用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则继续转动。






关键词: stm32     步进电机    

专家
2022-02-28 10:02:27     打赏
2楼

谢谢分享


工程师
2022-03-12 23:57:10     打赏
3楼

是个不错的器件


专家
2022-03-13 01:11:36     打赏
4楼

看看


工程师
2022-03-13 08:42:19     打赏
5楼

谢谢了


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]