写一个stm32f103rct6做MCUA3982做步进电机驱动芯片使用PWM控制步进电机速度的驱动程序定时器TIM2 CH1PWM引脚PB0DIR引脚PB10ENABLE引脚PB11A相输出引脚1和24B相输出引脚4和21PB0PB10PB11都输出高电平
#include "stm32f10x.h"
#define PWM_PERIOD 1000 // PWM周期,单位为us #define DIR_PIN GPIO_Pin_10 // DIR引脚 #define ENABLE_PIN GPIO_Pin_11 // ENABLE引脚 #define A_PHASE_PIN1 GPIO_Pin_1 // A相输出引脚1 #define A_PHASE_PIN2 GPIO_Pin_24 // A相输出引脚24 #define B_PHASE_PIN1 GPIO_Pin_4 // B相输出引脚4 #define B_PHASE_PIN2 GPIO_Pin_21 // B相输出引脚21
void TIM2_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure;
// 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置PWM引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置DIR和ENABLE引脚
GPIO_InitStructure.GPIO_Pin = DIR_PIN | ENABLE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置A相和B相输出引脚
GPIO_InitStructure.GPIO_Pin = A_PHASE_PIN1 | A_PHASE_PIN2 | B_PHASE_PIN1 | B_PHASE_PIN2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置定时器
TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1;
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 定时器时钟为1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置PWM模式
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(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
// 启动定时器
TIM_Cmd(TIM2, ENABLE);
}
void SetDir(uint8_t dir) { if (dir == 0) { GPIO_ResetBits(GPIOB, DIR_PIN); } else { GPIO_SetBits(GPIOB, DIR_PIN); } }
void SetEnable(uint8_t enable) { if (enable == 0) { GPIO_SetBits(GPIOB, ENABLE_PIN); } else { GPIO_ResetBits(GPIOB, ENABLE_PIN); } }
void SetAPhase(uint8_t phase) { if (phase == 0) { GPIO_ResetBits(GPIOB, A_PHASE_PIN1); GPIO_ResetBits(GPIOB, A_PHASE_PIN2); } else if (phase == 1) { GPIO_SetBits(GPIOB, A_PHASE_PIN1); GPIO_ResetBits(GPIOB, A_PHASE_PIN2); } else if (phase == 2) { GPIO_ResetBits(GPIOB, A_PHASE_PIN1); GPIO_SetBits(GPIOB, A_PHASE_PIN2); } else { GPIO_SetBits(GPIOB, A_PHASE_PIN1); GPIO_SetBits(GPIOB, A_PHASE_PIN2); } }
void SetBPhase(uint8_t phase) { if (phase == 0) { GPIO_ResetBits(GPIOB, B_PHASE_PIN1); GPIO_ResetBits(GPIOB, B_PHASE_PIN2); } else if (phase == 1) { GPIO_SetBits(GPIOB, B_PHASE_PIN1); GPIO_ResetBits(GPIOB, B_PHASE_PIN2); } else if (phase == 2) { GPIO_ResetBits(GPIOB, B_PHASE_PIN1); GPIO_SetBits(GPIOB, B_PHASE_PIN2); } else { GPIO_SetBits(GPIOB, B_PHASE_PIN1); GPIO_SetBits(GPIOB, B_PHASE_PIN2); } }
void SetSpeed(uint16_t speed) { TIM_SetCompare1(TIM2, speed); }
int main(void) { TIM2_PWM_Init(); SetDir(0); SetEnable(0); SetAPhase(0); SetBPhase(0);
while (1)
{
// 设置速度
SetSpeed(500);
// 设置方向
SetDir(0);
// 设置使能
SetEnable(1);
// 设置A相和B相输出
SetAPhase(1);
SetBPhase(2);
// 延时
for (int i = 0; i < 1000000; i++);
}
}
原文地址: https://www.cveoy.top/t/topic/bJlb 著作权归作者所有。请勿转载和采集!