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

发布者:ph49635359最新更新时间:2023-07-18 来源: elecfans关键字:STM32F103C8T6  L298N  PWM控制  直流电机 手机看文章 扫描二维码
随时随地手机看文章

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站看原子哥的视频,博主主要是做控制和上位机的,所以这部分只需要会用即可。


关键字:STM32F103C8T6  L298N  PWM控制  直流电机 引用地址:基于STM32F103C8T6+L298N通过PWM控制直流电机

上一篇:STM32的ADC用法
下一篇:stm32 swd接口定义

推荐阅读最新更新时间:2024-11-01 14:08

三电平逆变器SVPWM控制算法研究
摘要:论述了二极管箝位式三电平逆变器的基本结构,分析了空间矢量脉宽调制(SVPWM)控制三电平逆变器的算法,给出了确定参考矢量的三个规则,并推导出工作矢量的作用时间和输出顺序,从而使三电平逆变器SVPWM控制算法的可行性得到了验证。 关键词:三电平逆变器;SVPWM;算法 目前,三电平逆变器是实现中高压、大容量电机调速的主要方式之一,与传统的两电平逆变器相比,其优点是能承受高电压、电压电流上升率低等。但是,由于其逆变状态比传统两电平多,加上前端三线整流所带来的中点电压波动,其控制算法的复杂程度也随之增大。电压空间矢量脉宽调制(SVPWM)本质上依赖于开关矢量的选择和开关矢量作用时间的计算,通过优化开关矢量,降低开关频率,从
[工业控制]
三电平逆变器SV<font color='red'>PWM控制</font>算法研究
一种H型双极模式PWM控制的功率转换电路设计
  低速特性是衡量转台伺服系统性能的重要指标之一。影响低速特性的因素有很多,其中最主要的是摩擦力矩和电机波动力矩的干扰。对摩擦力矩的干扰,可以采取摩擦力矩补偿方法,来降低摩擦力矩干扰对伺服系统低速特性的影响。但在工程中很难确定摩擦力矩的准确模型,因此这些补偿方法在工程中应用比较困难。   H型双极模式PWM控制提高转台伺服系统低速特性的作用十分显著,而且简单易行。H型双极模式PWM控制能够提高伺服系统的低速特性,是因为H型双极模式PWM控制的电动机电枢回路中始终流过一个交变的电流,这个电流可以使电动机发生高频颤动,有利于减小静摩擦,从而改善伺服系统的低速特性。但因其功率损耗大,H型双极模式PWM控制只适用于中、小功率的伺服系统
[模拟电子]
PWM控制LED灯渐亮渐灭汇编程序
;******************************************************************* ;* 演示程序 - PWM控制LED灯渐亮渐灭 * ;* 邮箱: mcuinfo@163.com * ;* 作者: keel * ;* 时间: 2005/11/30 * ;*【版权】Copyright(C)晶格电子 All Rights Reserved* ;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! * ;******************************************************************* ; PWM 控制 LED 灯渐亮渐灭
[单片机]
一种高性能Class D音频放大器PWM控制的设计
    音乐手机和iPad等便携式音乐设备对音频放大器要求高保真音质的同时,对放大器效率也提出了越来越严格的要求。D类放大器的实际效率可以达到90%以上,而且体积更小,因此代表了未来音频放大器的发展方向。同时D类放大器要求能工作在宽输入电源电压范围内,以增强D类放大器的通用性。其中PWM比较器是将输入音频信号(通常以正弦信号表示)与三角波或锯齿波信号进行比较,得到占空比跟随输入音频信号的PWM信号传统PWM控制方式是锯齿波信号的幅度范围保持固定不变。为在高电源电压时高输出功率而设置合适的锯齿波幅度,在低电源电压下会出现削波失真而无法正常工作。本文针对这个问题,提出了一种高性能PWM控制方式。将锯齿波信号的共模电平设计成跟随电源电压的
[嵌入式]
一种H型双极模式PWM控制的功率转换电路设计
低速特性是衡量转台伺服系统性能的重要指标之一。影响低速特性的因素有很多,其中最主要的是摩擦力矩和电机波动力矩的干扰。对摩擦力矩的干扰,可以采取摩擦力矩补偿方法,来降低摩擦力矩干扰对伺服系统低速特性的影响。但在工程中很难确定摩擦力矩的准确模型,因此这些补偿方法在工程中应用比较困难。 H型双极模式PWM控制提高转台伺服系统低速特性的作用十分显著,而且简单易行。H型双极模式PWM控制能够提高伺服系统的低速特性,是因为H型双极模式PWM控制的电动机电枢回路中始终流过一个交变的电流,这个电流可以使电动机发生高频颤动,有利于减小静摩擦,从而改善伺服系统的低速特性。但因其功率损耗大,H型双极模式PWM控制只适用于中、小功率的伺服系统。因
[电源管理]
STM32F103C8T6 SPI主从通讯问题及待解决方案
1.我是用两块STM32F103C8T6进行SPI通讯,一块做主机,一块作为从机; 主机部分代码: void SPI2_Config(void)//SPI2的传输配置 { SPI_InitTypeDef SPI_InitStructure; SPI_Cmd(SPI2, DISABLE); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; S
[单片机]
<font color='red'>STM32F103C8T6</font> SPI主从通讯问题及待解决方案
STM32—PID控制在直流电机中的应用
一.PID控制算法 1.什么是PID PID:Proportion-Integral-Differential 在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。 PID控制系统(模拟)的框图如下: 2.PID系数的理解 理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
[单片机]
STM32—PID控制在<font color='red'>直流电机</font>中的应用
用于反激式适配器的多功能PWM控制器FAN6754
当你把几乎任何小型计算或消费电子设备插入电源插座时,便不难发现手中的插头大部分都连接到外部电源(EPS)。EPS是所有小型电子设备工作的必不可少的部分,单单在美国,就有多达15亿个在使用中 (据业界估计,在全球则超过30亿个)。   EPS的核心是多功能PWM控制器集成电路(IC)(如飞兆半导体的FAN6754)以及功率 MOSFET,它们联合工作,为负载高效分配能量,并监控电路以保护系统。所有元器件都被集成在一个精简的封装中,与过去那种看起来老旧笨重的电源成了强烈对比。   PWM控制器可被视为电源的大脑。它监控反馈数据并调整占空比,以调节开关模式电源(SMPS)的输出电压,帮助系统满足所有相关节能标准。   这种绿色
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved