STM32F103RCT6 控制 A3982 步进电机 PWM 调速 - 代码示例
#ifndef __STEPPER_H #define __STEPPER_H
#include "stm32f10x.h"
#define STEPPER_PWM_TIM TIM2
void Stepper_Init(void); void Stepper_SetSpeed(uint16_t speed); void Stepper_SetDirection(uint8_t dir); void Stepper_Stop(void);
#endif
#include "stepper.h"
static uint8_t Stepper_Direction = 0;
void Stepper_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能GPIO和TIM时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置PA0和PA1为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// TIM2初始化
TIM_TimeBaseStructure.TIM_Period = 999; // PWM周期为1ms
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // TIM2时钟频率为72MHz,分频系数为72,计数频率为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(STEPPER_PWM_TIM, &TIM_TimeBaseStructure);
// TIM2通道1初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(STEPPER_PWM_TIM, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(STEPPER_PWM_TIM, TIM_OCPreload_Enable);
// TIM2通道2初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(STEPPER_PWM_TIM, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(STEPPER_PWM_TIM, TIM_OCPreload_Enable);
// 启动TIM2
TIM_Cmd(STEPPER_PWM_TIM, ENABLE);
}
void Stepper_SetSpeed(uint16_t speed) { uint16_t pulse = 999 - (999 * speed / 100); // speed为0-100,pulse为0-999,速度越快,占空比越小 TIM_SetCompare1(STEPPER_PWM_TIM, pulse); TIM_SetCompare2(STEPPER_PWM_TIM, pulse); }
void Stepper_SetDirection(uint8_t dir) { Stepper_Direction = dir; if (Stepper_Direction) { GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1); } else { GPIO_SetBits(GPIOA, GPIO_Pin_1); GPIO_ResetBits(GPIOA, GPIO_Pin_0); } }
void Stepper_Stop(void) { TIM_SetCompare1(STEPPER_PWM_TIM, 0); TIM_SetCompare2(STEPPER_PWM_TIM, 0); }
// 使用说明: // 1. 调用Stepper_Init()初始化 // 2. 使用Stepper_SetSpeed()设置速度 (0-100) // 3. 使用Stepper_SetDirection()设置方向 (0或1) // 4. 使用Stepper_Stop()停止电机
原文地址: http://www.cveoy.top/t/topic/naUo 著作权归作者所有。请勿转载和采集!