STM32F103RCT6 PWM控制步进电机速度和方向

本项目提供使用STM32F103RCT6单片机,通过PWM控制步进电机速度和方向的完整代码,包括main.c、stepper.h和stepper.c文件。

硬件连接:

  • PWM引脚: PB0
  • DIR引脚: PB10 (控制方向,高电平为顺时针,低电平为逆时针)
  • ENABLE引脚: PB11 (控制使能,高电平使能,低电平停止)

软件实现:

  • 使用定时器TIM3的通道3 (TIM3CH3) 生成PWM信号,控制步进电机的速度。
  • 使用GPIOB的引脚PB10和PB11分别控制步进电机的方向和使能。

代码:

main.c:

#include 'stm32f10x.h'
#include 'stepper.h'

int main(void)
{
    stepper_init(); // 初始化步进电机控制引脚
    while(1)
    {
        stepper_set_speed(1000); // 设置步进电机速度为1000
        stepper_set_direction(CLOCKWISE); // 设置步进电机方向为顺时针
        stepper_start(); // 启动步进电机
        delay_ms(5000); // 延时5秒
        stepper_stop(); // 停止步进电机
        delay_ms(1000); // 延时1秒
        stepper_set_speed(500); // 设置步进电机速度为500
        stepper_set_direction(COUNTER_CLOCKWISE); // 设置步进电机方向为逆时针
        stepper_start(); // 启动步进电机
        delay_ms(5000); // 延时5秒
        stepper_stop(); // 停止步进电机
        delay_ms(1000); // 延时1秒
    }
}

void delay_ms(uint32_t ms)
{
    uint32_t i;
    for(i=0;i<ms;i++)
    {
        uint32_t j;
        for(j=0;j<72000;j++);
    }
}

stepper.h:

#ifndef __STEPPER_H
#define __STEPPER_H

#include 'stm32f10x.h'

#define CLOCKWISE 1 // 顺时针
#define COUNTER_CLOCKWISE 0 // 逆时针

void stepper_init(void); // 初始化步进电机控制引脚
void stepper_set_speed(uint16_t speed); // 设置步进电机速度
void stepper_set_direction(uint8_t direction); // 设置步进电机方向
void stepper_start(void); // 启动步进电机
void stepper_stop(void); // 停止步进电机

#endif

stepper.c:

#include 'stepper.h'

void stepper_init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_10 | GPIO_Pin_11; // PB0、PB10、PB11引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速率50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB引脚
}

void stepper_set_speed(uint16_t speed)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟

    TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // PWM周期为1000
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 分频系数为72
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割为1
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化TIM3

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
    TIM_OCInitStructure.TIM_Pulse = speed; // 占空比为speed
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高
    TIM_OC3Init(TIM3, &TIM_OCInitStructure); // 初始化TIM3_CH3

    TIM_Cmd(TIM3, ENABLE); // 启动TIM3
}

void stepper_set_direction(uint8_t direction)
{
    if(direction == CLOCKWISE)
    {
        GPIO_SetBits(GPIOB, GPIO_Pin_10); // PB10输出高电平,顺时针方向
    }
    else
    {
        GPIO_ResetBits(GPIOB, GPIO_Pin_10); // PB10输出低电平,逆时针方向
    }
}

void stepper_start(void)
{
    GPIO_SetBits(GPIOB, GPIO_Pin_11); // PB11输出高电平,使能步进电机
}

void stepper_stop(void)
{
    GPIO_ResetBits(GPIOB, GPIO_Pin_11); // PB11输出低电平,停止步进电机
}

使用方法:

  1. 将代码复制到您的STM32工程中。
  2. 根据您的硬件连接修改代码中的引脚配置。
  3. 编译并下载代码到您的STM32F103RCT6开发板。

注意:

  • 请确保您的步进电机驱动器与代码中的控制逻辑兼容。
  • 可以根据需要调整代码中的速度和延时参数。

希望以上代码对您有所帮助!

STM32F103RCT6 PWM控制步进电机速度和方向

原文地址: https://www.cveoy.top/t/topic/jv8w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录