0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32F103C8T6+L298N通过PWM控制直流电机

CHANBAEK 来源:月月望归鸟 作者:K.Fire 2023-06-15 16:51 次阅读

01 前言

原来做的差速小车是基于Arduino控制的,感觉有些简单,也有些基础,Arduino方便简单的同时,可操作性感觉也少了很多,所以想将控制器换成STM32,然后将树莓派作为上位机,STM32作为下位机,通过树莓派和STM32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学STM32,也是奔着应用去的,所以对于STM32编程原理方面可能不太精通,这里偏重于记录应用层面的知识。

02 PWM调速原理

直流电机驱动是最简单的,给电机通上电就能转,根据电机的公式:

图片

可知:当提高电压时,反电势升高,进而转速升高,电压与转速大致有如图所示的关系。

图片编辑

所以我们只要控制给电机通电的电压即可控制电机的转速,但是在实际的控制中,控制直流电机需要通过H桥控制电机的正反转,如图,当T1和T4二极管导通时,有粉色通路;当T2和T3二极管导通时,有蓝色通路,这样我们就可以实现弱电控制强电,通过二极管的通断来控制电机的转向。

但是这样电机通电时电压就是Us,我们如果想自由的控制Us的电压值基本是不能实现的,因为电机是接到单片机的引脚上的,引脚的供电电压值是确定的,我们就要使用控制二极管的通断时间对电机的转速进行控制,即PWM控制。

图中的D1~D4二极管为续流的作用,因为电机中有绕组,在断电后,电感的电流不能瞬时变为0,所以在断电后电流沿棕色和绿色的通路放点电。

image.png

image.png

在一个周期内,我们通过控制通电的时间就可以调控平均电压,而平均电压的高低直接控制电机的转速,通电时间/周期,就可以得到占空比,我们也就是通过控制电机的占空比来控制电机的转速的。

image.png

在实际应用过程中,我们不用自己搭建H桥,而是使用电机驱动板(如:L298N)对直流电机进行驱动,L298N内搭载两个H桥电路,可以实现对两个电机的转向和转速进行控制。

图片

这是淘宝商家提供的电机驱动板控制表,将IN1~4接到单片机的引脚,我们就可以通过引脚输出PWM控制信号,对直流电机进行控制。

03 STM32编程实现

在STM32中如果想输出PWM信号,需要借助定时器,通过定时器的捕获/比较通道的PWM输出

图片

当我们对定时器设置了预装载值arr和比较值ccr后,可以通过配置PWM模式,使定时器CNT计数值超过ccr后产生有效信号,并通过配置相应寄存器设置有效信号是1还是0,而配置PWM的输出方式,具体原理信息可以参考原子哥的视频,也可以参考中文参考手册的14.4.7内容。

图片

在程序中,我们使用库函数进行配置,配置步骤如下:

  1. 使能定时器和相关外设引脚时钟 :RCC_APBxPeriphClockCmd()
  2. 配置IO口为复用输出模式(查手册8.1.11)配置成相应的模式(复用推挽输出)
  3. 初始化定时器:TIM_TimeBaseInit()
  4. 初始化TIM2 Channe1234 PWM模式:TIM_OCxInit()
  5. 使能OCx通道的预装载寄存器:TIM_OC1PreloadConfig()
  6. 使能时钟:TIM_Cmd()
  7. 在主函数中配置占空比进行调速:TIM_SetCompare1()
#include "sys.h"


/********************
功能:通用时钟2用来产生通道1234四路PWM信号
函数:TIM2_PWM_Init(u16 arr,u16 psc)
作者:K.Fire
日期:2022.01.30
引脚:PA0 PA1 PA2 PA3
参数:arr:自动重装值 psc:时钟预分频数
*****************/


void TIM2_PWM_Init(u16 arr,u16 psc)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  //使能GPIOA外设模块时钟  
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   

  //设置引脚为复用输出功能,输出TIM2 CH1的PWM脉冲波形  GPIOA.0
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM2_CH1
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

  //设置引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形  GPIOA.1
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM2_CH2
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

    //设置引脚为复用输出功能,输出TIM2 CH3的PWM脉冲波形  GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TIM2_CH3
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

  //设置引脚为复用输出功能,输出TIM2 CH4的PWM脉冲波形  GPIOA.3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2_CH4
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

  //使能定时器2时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
    //初始化TIM2
  TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  //初始化TIM2 Channe1234 PWM模式   
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

  TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC1
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC3
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC4


  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR1上的预装载寄存器
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR2上的预装载寄存器
  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR3上的预装载寄存器
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIM2在CCR4上的预装载寄存器

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

}

04 总结

原理部分我讲的很简略,我也是看原子哥的视频学,如果大家对单片机控制原理有学习需要,可以去B站看原子哥的视频,博主主要是做控制和上位机的,所以这部分只需要会用即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 直流电机
    +关注

    关注

    36

    文章

    1709

    浏览量

    70090
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5157

    浏览量

    213481
  • STM32
    +关注

    关注

    2266

    文章

    10877

    浏览量

    354979
  • Arduino
    +关注

    关注

    187

    文章

    6464

    浏览量

    186694
  • 树莓派
    +关注

    关注

    116

    文章

    1699

    浏览量

    105542
收藏 人收藏

    评论

    相关推荐

    STM32F103C8T6实现直流电机速度PID控制

    前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的PID算法,对
    的头像 发表于 06-15 16:52 4865次阅读
    <b class='flag-5'>STM32F103C8T6</b>实现<b class='flag-5'>直流电机</b>速度PID<b class='flag-5'>控制</b>

    L298N驱动直流电机问题

    pwm调制 l298n驱动一个直流电机c程序怎么编写还有该怎么接线
    发表于 05-04 17:14

    STM32L298N相关资料推荐

    文章目录用STM32L298N(正反转、调速)控制直流电机正反转使用PWM调速用STM32
    发表于 06-29 06:02

    空心杯直流电机控制

    统的控制对象是4个空心杯直流电机电机带光电编码器,可以反馈转速大小的波形。电机驱动模块是普通的L298N模块。芯片型号,
    发表于 09-13 08:47

    使用L298n控制两路直流电机PWM调速

    新手来记录自己从0开始自学STM32,也不晓得自己能坚持多久。使用L298n控制两路直流电机PWM调速还没学直接上程序.
    发表于 01-06 07:11

    L298N电机驱动直流电机程序汇总

    关于L298N驱动直流电机的各种写法程序汇总
    发表于 05-04 16:04 31次下载

    基于80C196KC和L298N直流电机PWM控制技术

    介绍了基于80C196KC和L298N直流电机PWM控制技术,pwm调速系统的工作原理、
    发表于 12-12 09:41 6200次阅读
    基于80<b class='flag-5'>C</b>196KC和<b class='flag-5'>L298N</b>的<b class='flag-5'>直流电机</b><b class='flag-5'>PWM</b><b class='flag-5'>控制</b>技术

    使用STM32F103C8T6控制L298N电机驱动麦克纳姆轮小车(HAL库)

    使用STM32F103C8T6控制L298N电机驱动麦克纳姆轮小车(HAL库)
    发表于 11-23 17:36 56次下载
    使用<b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>控制</b><b class='flag-5'>L298N</b><b class='flag-5'>电机</b>驱动麦克纳姆轮小车(HAL库)

    如何使用L298N和Arduino板控制直流电机

    在这个Arduino教程中,我们将学习如何使用Arduino控制直流电机。我们来看看控制直流电机的一些基本技术,并通过两个例子,学习如何使用
    的头像 发表于 04-08 15:06 1.1w次阅读
    如何使用<b class='flag-5'>L298N</b>和Arduino板<b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>

    L298n直流电机的原理说明

    该文件包含了L298n直流电机的工作原理图和PCB制图
    发表于 05-28 10:06 3次下载

    ros与arduino通信控制直流电机

    前言:在成功通过arduino开发板控制直流电机后,开始尝试用ros与arduino通信来控制直流电机,为无人小车作准备 硬件 ardui
    发表于 03-31 11:45 4次下载
    ros与arduino通信<b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>

    STM32F103C8T6+L298N通过PWM控制直流电机转速

    下位机,通过树莓派和STM32进行通讯,实现对差速移动小车的控制,本人也是寒假期间初学STM32, 也是奔着应用去的,所以对于STM32
    发表于 03-31 11:16 4次下载
    <b class='flag-5'>STM32F103C8T6+L298N</b><b class='flag-5'>通过</b><b class='flag-5'>PWM</b><b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>转速

    STM32F103C8T6实现直流电机速度PID控制

    前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的PID算法,对
    发表于 03-31 11:26 2次下载
    <b class='flag-5'>STM32F103C8T6</b>实现<b class='flag-5'>直流电机</b>速度PID<b class='flag-5'>控制</b>

    基于STM32PWM控制直流电机转速(CubeMX+HAL库)

    使用到的各元件: 1、12V电源一个 2、单片机:STM32F103C8T6 3、直流电机4个 4、电机驱动模块:L298N 5、降压模块两个 6
    发表于 03-31 09:36 12次下载
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>PWM</b><b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>转速(CubeMX+HAL库)

    L298N直流电机总结

    采用L298N双桥直流电机驱动芯片 工作电压范围5V35V,如果需要从模块内取电,则供电范围为7V35V 峰值输出电流2A 每个通道有一个使能输入端 可以驱动两个直流电机或者一个四线步进
    发表于 04-03 11:05 3次下载
    <b class='flag-5'>L298N</b><b class='flag-5'>直流电机</b>总结