#include 'motor.h' #include 'pwm.h'

void Motor_Init(void) { PWM_Init(); }

void Motor_SetSpeed(uint8_t speed) { uint16_t duty_cycle = (uint16_t)(speed * 10.23); // 将速度转换为占空比,范围为 0-100 PWM_SetDutyCycle(duty_cycle); }

#ifndef __MOTOR_H #define __MOTOR_H

#include "stm32f10x.h"

void Motor_Init(void); // 初始化步进电机 void Motor_SetSpeed(uint8_t speed); // 设置步进电机速度,speed 范围为 0-100

#endif

#include 'pwm.h'

void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_OCInitTypeDef TIM_OC_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 使能 GPIOA 和 AFIO 时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能 TIM2 时钟

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 设置 GPIOA 为复用推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; // 设置 GPIOA.1 为 PWM 输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置 GPIOA 输出速度为 50MHz GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 GPIOA

TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 设置时钟分割为 1 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器为向上计数 TIM_InitStruct.TIM_Period = 999; // 设置计数器周期为 1000 TIM_InitStruct.TIM_Prescaler = 71; // 设置预分频器为 72 TIM_TimeBaseInit(TIM2, &TIM_InitStruct); // 初始化 TIM2

TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1; // 设置 PWM 模式为模式 1 TIM_OC_InitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset; // 设置 PWM 空闲状态为低电平 TIM_OC_InitStruct.TIM_OCNIdleState = TIM_OCIdleState_Reset; // 设置 PWM 互补输出空闲状态为低电平 TIM_OC_InitStruct.TIM_OCNPolarity = TIM_OCPolarity_High; // 设置 PWM 互补输出极性为高电平 TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 设置 PWM 极性为高电平 TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable; // 使能 PWM 输出 TIM_OC_InitStruct.TIM_OutputNState = TIM_OutputNState_Enable; // 使能 PWM 互补输出 TIM_OC_InitStruct.TIM_Pulse = 0; // 设置 PWM 占空比为 0 TIM_OC1Init(TIM2, &TIM_OC_InitStruct); // 初始化 TIM2 通道 1

TIM_Cmd(TIM2, ENABLE); // 使能 TIM2 }

void PWM_SetDutyCycle(uint16_t duty_cycle) { TIM_SetCompare1(TIM2, duty_cycle); // 设置 PWM 占空比 }

#ifndef __PWM_H #define __PWM_H

#include "stm32f10x.h"

void PWM_Init(void); // 初始化 PWM void PWM_SetDutyCycle(uint16_t duty_cycle); // 设置 PWM 占空比,duty_cycle 范围为 0-1000

#endif

#include "stm32f10x.h" #include "motor.h"

int main(void) { Motor_Init(); // 初始化步进电机

while(1) { Motor_SetSpeed(50); // 设置步进电机速度为 50 } }

STM32F103RCT6 步进电机PWM控制 C代码示例

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

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