STM32驱动步进电机

发布时间 2023-12-19 18:00:21作者: 遥远的死神

一、步进电机的介绍

17HS4401步进电机是一种步进电机,也称为双级四相混合式步进电机。它是一种旋转电机,可以控制旋转角度和速度,17HS4401步进电机通常被应用于一些需要精准控制转动的场合,例如打印机、CNC机床等。
参数:
1.步距角度: 1.8度
2.驱动方式: 双级四相混合式
3.工作电压: 12V
4.额定电流: 1.7A
5.静态转矩: 40N.cm
6.旋转方向: 正/反时针
7.立柱长度: 28mm
8.电机长度: 40mm
9.输出轴径: 5mm

 二、步进电机的原理及工作方式

原理:

步进电机是一种将电脉冲信号转换成相应角位移线位移的电动机。每输入一个脉冲信号转子就转动一个角度或前进一步,其输出的角位移线位移与输入的脉冲数成正比,转速脉冲频率成正比。

三、电机驱动板

在实验中电机不需要多高的电流 建议调到最小否则电机发烫严重

 

 

四、接线方式

PC0 ENA

PC1 DIR

PUL PUL 

 

 四、代码驱动

1.配置GPIO

void Driver_Init(void)  //pc0 ena pc1 dir 
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    //使能PC端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2;    //PC0.2 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
    GPIO_Init(GPIOC, &GPIO_InitStructure);                    //根据设定参数初始化GPIOC
    GPIO_SetBits(GPIOC,GPIO_Pin_2);                             //PC0输出高 顺时针方向  DRIVER_DIR
    GPIO_ResetBits(GPIOC,GPIO_Pin_0);                        //PC2输出低 使能输出  DRIVER_OE
}

2.定时器初始化

根据单片机的引脚复用功能找到对应的通道

 

void TIM1_PWM_Init(u16 arr,u16 psc)
{  
     GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
                                                                             

   //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值     80K
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  TIM_CtrlPWMOutputs(TIM1,ENABLE);    //MOE 主输出使能    

    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能     
    
    TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
    
    TIM_Cmd(TIM1, ENABLE);  //使能TIM8
}

3.按键初始化

系统自带 拿来直接用就好了

void KEY_Init(void)
{
    
    GPIO_InitTypeDef GPIO_InitStructure;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
    
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
    
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
     GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
 
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
    
} 
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下 
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{     
    static u8 key_up=1;//按键按松开标志
    if(mode)key_up=1;  //支持连按          
    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
    {
        delay_ms(10);//去抖动 
        key_up=0;
        if(KEY0==0)return KEY0_PRES;
        else if(KEY1==0)return KEY1_PRES;
        else if(WK_UP==1)return WKUP_PRES; 
    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;          
    return 0;// 无按键按下
}

4.主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "key.h"

//ALIENTEK Mini STM32开发板范例代码8
//PWM输出实验   
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
uint8_t KeyNum;        //定义用于接收按键键码的变量
        
 int main(void)
 {    
    

    u8 key=0 ;

    KEY_Init();
    delay_init();             //延时函数初始化      
    LED_Init();    
    Driver_Init();     //初始化与LED连接的硬件接口
    TIM1_PWM_Init(999,71);//1K频率
    TIM_SetCompare1(TIM1,500);//占空比50%
     
       while(1)
    {    
        KeyNum=KEY_Scan(1);
        if(KeyNum==KEY0_PRES)
        {
            delay_ms(20);
            while((KeyNum==KEY0_PRES)==0);
            ENA=1;
            DIR=!DIR ;
            delay_ms(1000);
        }
        if(KeyNum==KEY1_PRES)
        {
            delay_ms(20);
            while((KeyNum==KEY1_PRES)==0);
            ENA=!ENA; 
            delay_ms(1000);
        }
        
            LED1=!LED1;
            delay_ms(1000);              
    } 
}