写一段基于stm32f103的以pwm波的形式输出控制L298N模块使得电机正反转和调速的代码
#include "stm32f10x.h"
#define PWM_PERIOD 1000 // PWM周期为1ms #define PWM_PRESCALER 72 // PWM分频系数为72
// 定义PWM输出引脚 #define PWM_FORWARD_PIN GPIO_Pin_0 #define PWM_FORWARD_PORT GPIOA #define PWM_REVERSE_PIN GPIO_Pin_1 #define PWM_REVERSE_PORT GPIOA
// 定义L298N模块控制引脚 #define ENABLE_PIN GPIO_Pin_2 #define ENABLE_PORT GPIOA #define IN1_PIN GPIO_Pin_3 #define IN1_PORT GPIOA #define IN2_PIN GPIO_Pin_4 #define IN2_PORT GPIOA
void PWM_Configuration(void) { // 初始化PWM的GPIO口为复用推挽输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PWM_FORWARD_PIN | PWM_REVERSE_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_FORWARD_PORT, &GPIO_InitStructure);
// 初始化TIM2为PWM模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1;
TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 初始化TIM2的PWM通道1和2
TIM_OCInitTypeDef TIM_OCInitStructure;
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_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
}
void L298N_Configuration(void) { // 初始化L298N模块控制引脚为输出模式 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = ENABLE_PIN | IN1_PIN | IN2_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ENABLE_PORT, &GPIO_InitStructure); }
void Motor_Forward(uint16_t speed) { // 设置PWM输出占空比为speed TIM_SetCompare1(TIM2, speed); TIM_SetCompare2(TIM2, 0);
// 设置L298N模块IN1和IN2引脚控制电机正转
GPIO_WriteBit(IN1_PORT, IN1_PIN, Bit_SET);
GPIO_WriteBit(IN2_PORT, IN2_PIN, Bit_RESET);
}
void Motor_Reverse(uint16_t speed) { // 设置PWM输出占空比为speed TIM_SetCompare1(TIM2, 0); TIM_SetCompare2(TIM2, speed);
// 设置L298N模块IN1和IN2引脚控制电机反转
GPIO_WriteBit(IN1_PORT, IN1_PIN, Bit_RESET);
GPIO_WriteBit(IN2_PORT, IN2_PIN, Bit_SET);
}
void Motor_Stop(void) { // 停止PWM输出 TIM_SetCompare1(TIM2, 0); TIM_SetCompare2(TIM2, 0);
// 关闭L298N模块使能引脚
GPIO_WriteBit(ENABLE_PORT, ENABLE_PIN, Bit_RESET);
}
int main(void) { // 初始化PWM和L298N模块 PWM_Configuration(); L298N_Configuration();
// 电机正转
Motor_Forward(800);
GPIO_WriteBit(ENABLE_PORT, ENABLE_PIN, Bit_SET);
delay_ms(1000);
// 电机反转
Motor_Reverse(800);
GPIO_WriteBit(ENABLE_PORT, ENABLE_PIN, Bit_SET);
delay_ms(1000);
// 调整PWM输出占空比实现调速
for (int i = 0; i <= 1000; i += 100)
{
TIM_SetCompare1(TIM2, i);
TIM_SetCompare2(TIM2, 0);
GPIO_WriteBit(ENABLE_PORT, ENABLE_PIN, Bit_SET);
delay_ms(100);
}
// 停止电机
Motor_Stop();
while(1);
}
原文地址: https://www.cveoy.top/t/topic/bLKC 著作权归作者所有。请勿转载和采集!