STM32 直流减速电机控制

使用STM32通过PWM控制直流减速电机的转速,以实现小车直线行驶。当检测到电机转速不一致时,采用PID算法动态调整PWM占空比,确保两轮速度匹配,保证小车行驶直线性。
摘要由CSDN通过智能技术生成

    在直流减速电机控制中,最常用的方法就是通过PWM来控制直流电机的转速。在控制小车走直线的过程中,需要两者的转速一置(如果要走得很直,还需要在短时间内保证两者的行程大致相当,这可以用PID算法来控制)。 因此,在检测到两者转速不一样时,需要动态调整其中一个或两个轮子的PWM的点空比(简单点的就以一个轮为基准,调整另外一个轮子即可;如果以一个固定的标准的话,需要调整两个轮子的PWM占空比)。

 1 程序第一步:设置GPIO,略(输出PWM的管脚用Mode_AF_PP即可)
 2 
 3 程序第二步:设置定时器,(保证产生两路PWM即可,我用的是TIM4)
 4 
 5 void TIM4_Configuration(void)
 6 {
 7 TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStructure;
 8 TIM_OCInitTypeDef TIM_OCInitStructure;
 9 
10 //时间基初始化
11 TIM_TimeBaseInitStructure.TIM_Period=144;   //18K/144=125Hz,这个是电机PWM的频率
12 TIM_TimeBaseInitStructure.TIM_Prescaler=4000; //72000000/4000=18K
13 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
14 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
15 TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0x0000;
16 
17 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
18 
19 //输出比较模式设置,用于4路PWM输出
20 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //输出PWM
21 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能正向通道
22 TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Disable; //失能反向通道
23 TIM_OCInitStructure.TIM_Pulse=PWM_L;    
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用STM32控制直流减速电机的PWM代码: ```c #include "stm32f10x.h" #define PWM_PERIOD 1000 // PWM周期,单位为us #define MOTOR_SPEED 500 // 电机速度,取值范围为0~1000 int main(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置GPIOB10为TIM3_CH3输出 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置TIM3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1; // PWM周期 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 分频系数,时钟为72MHz,分频后为1MHz TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置TIM3_CH3 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = MOTOR_SPEED; // 占空比,取值范围为0~PWM_PERIOD TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); // 启动TIM3 TIM_Cmd(TIM3, ENABLE); while (1) { // 电机控制代码 } } ``` 在此代码中,我们使用了TIM3的PWM功能来控制直流减速电机的速度。首先,我们需要将GPIOB10配置为TIM3_CH3输出,并且使能GPIOB和TIM3的时钟。然后,我们配置TIM3的基本参数,包括PWM周期、分频系数等。接着,我们配置TIM3_CH3的参数,包括占空比、输出极性等。最后,启动TIM3,并在while循环中编写电机控制代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值