STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)

这篇具有很好参考价值的文章主要介绍了STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32单片机的PWM(脉冲宽度调制)电机控制

作者:公子易平

时间:2023/6/6

前段时间做一个智能小车的相关项目时,发现很少有人能够将STM32的PWM控制讲清楚,故而书此文,希望对后来的学习者有所帮助。

1.硬件介绍

  • STM32F103C8T6最小系统板

stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

  • 直流TT电机
    stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

  • 电机驱动芯片(TB6612)

  • stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

  • 杜邦线若干
    stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

接线情况:

TB6612引脚说明:
stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

STM32主控芯片与TB6612接线:

STM32F103C8T6 TB6612
PA6 PWMA
PA7 PWMB
PB12 AIN1
PB13 AIN2
PB14 BIN1
PB15 BIN2

TB6612其余接口:

TB6612 接口
VM 7.4V
VCC 3.3V
GND GND
AO1&AO2 A路电机正负极
BO1&BO2 B路电机正负极
STBY 3.3V

电路原理图如下,仅供参考:
stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

2.PWM控制原理

PWM即脉冲宽度调制(Pulse Width Modulation),常用PWM实现LED呼吸灯、直流电机调速以及舵机控制,本文重点介绍如何使用STM32单片机对直流电机进行调速控制。

2.1PWM控制的三个关键参数

PWM控制的三个关键参数为频率(Freq)、占空比(Duty)以及分辨率(Reso),其相关定义如下式所示。
stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

式中,Freq、Duty以及Reso分别表示PWM的频率、占空比和分辨率。Ts为一个PWM控制周期的总时间,Ton为一个PWM控制周期中高电平时间。式中分辨率和频率的定义一样但是单位不同,频率的单位是Hz,分辨率的单位是%。

需要重点关注的是占空比和分辨率两个参数。

  • 占空比:

高电平的工作时间占一个周期的比例,可以理解高电平时间越长则电机转速越快,反之越慢。

(理想的认为占空比和电机的转速成正比例关系)

eg:

Duty=0% 电机不转

Duty=100% (在供电电压满足电机的额定电压时)电机达到最大转速

Duty=50%的电机转速大于Duty=30%的电机转速

  • 分辨率:

表征PWM控制的精度的一个参数,即可以电机速度调节的步距(Step)的大小,分辨率越大,能够控制的占空比也就精度越高。

eg:

Reso=1%(1/100) 则电机的占空比可以为1% 2% 3%…100%,但是不能为3.5%;

Reso=0.1% (1/1000)则电机的占空比可以为0.1%、8.9%…,但是不能是90.678%。

2.2定时器关键参数

使用STM32单片机实现PWM控制时需要用到单片机上的TIM定时器外设,使用定时器的输出比较功能。

需要配置的定时器的关键参数亦有三个:预分频值PSC(Prescalar)、自动重装值ARR(AutoReload Register)以及输出比较值CCR(Capture /Compare Register)。

  • PSC

​ 对输入到定时器中的时钟进行分频,如果默认的输入时钟信号为72MHz,则PSC=0时,时钟信号不分频,定时器输入时钟信号为72MHz;PSC=1时,系统分频,定时器输入时钟信号为36MHz…

定时器的输入时钟信号=默认的输入时钟信号➗(PSC+1)

  • ARR

​ 当使用定时器时,每经过单位时间(时基单元决定),定时器中CNT计数单元就会加1,其上限值由寄存器的位数决定,为防止其无限增加,需要配置ARR值。ARR的作用是在CNT计数单元增加到ARR值时,CNT的值自动停止增加并返回到初始值。

​ 实际上可以将这个过程看作给多个杯子加水的过程,每过一段时间就给一个杯子加固定体积的水,当一个杯子中的水装满之后,就给另一个新的杯子加水,而ARR自动重装值就相当于每个杯子的高度。

  • CCR

​ 其实CCR输出比较值可以简单的理解为一个分界线。

​ 依旧是上面的例子,这次我们将杯子更具CCR分界线分成了上下两部分。下部分空间在遇到水之后会变成绿色,而上部分空间在遇到水之后会变成红色。

​ 在单片机中将绿色想象成高电平,红色为低电平。则在一个计数的周期内,如果定时器的计数值CNT未到达CCR分界线,则水是绿色的,输出高电平给电机;当计数值CNT到达分界线CCR,则此时再向水杯中加水,颜色就会变成红色,即输出低电平给电机,而当水杯装满后,又需要给下一个水杯进行加水重复上述过程。
stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

2.3PWM参数联系定时器参数

上文中已然描述了定时器的三个参数以及PWM控制的三个参数,最终的目的是将定时器的三个参数的配置和PWM控制的三个参数的控制联系起来。

其相互之间的联系的公式可以由下述公式进行描述:

stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

其中ARR值和CCR的值决定了PWM控制的占空比和分辨率。

下图所示为其原理图,PWM控制的工作过程为:

  1. 定时器工作,计数器值增加。
  2. 当计数器值N小于CCR时,输出电平V为高电平1。
  3. 当计数器值到达CCR时,输出电平V翻转为低电平0。
  4. 当计数器值大于CCR小于ARR时,输出电平持续为低电平0,计数值N继续增加。
  5. 当计数器值达到ARR时,计数值N回到初始状态,同时电平翻转,一个周期结束。
    stm32pwm控制电机程序,STM32,单片机,stm32,嵌入式硬件,汽车,硬件工程

所以,PWM控制实际上就是通过不断的改变定时器的CCR值来改变占空比,从而实现对电机的调速。

3.软件设计

TB6612电机驱动芯片可以驱动两路电机,本次使用单片机定时器3的两个通道产生两路PWM波实现对电机的调速控制。以下是代码部分,使用Keil软件进行编写。

3.1定时器配置

#include "stm32f10x.h"//头文件

//初始化定时器TIM3 并配置PWM初始化参数
void PWM12_Init(void)
{	//开启TIM3和GPIOA的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//初始化GPIO口 PA6 PA7 用于产生PWM信号
	GPIO_InitTypeDef GPIO_InitStructure;
	//复用推挽输出模式因为复用了TIM3外设
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO A6 A7 
	//使用内部时钟
	TIM_InternalClockConfig(TIM3);
	//配置时基单元参数
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//定时器不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//ARR自动重装值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;//PSC预分频值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//到达ARR触发一次中断 停止计数
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//初始化单元
	//输出比较结构体配置
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//补全结构体中未配置参数
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性选择
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能

	TIM_OC1Init(TIM3, &TIM_OCInitStructure);//初始化 TIM3 OC1
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能CCR1自动重装
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);//初始化 TIM3 OC2	
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能CCR2自动重装
	
	TIM_ARRPreloadConfig(TIM3,ENABLE);//开启预装载
	TIM_Cmd(TIM3, ENABLE);//开启定时器3
	TIM3->CCR1 = 0;//设置输出比较值
	TIM3->CCR2 = 0;
}

//设置PWM1比较值 为Compare 即输出比较值
void PWM12_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM3, Compare);
}

//设置PWM2比较值 为Compare
void PWM12_SetCompare2(uint16_t Compare)
{
	TIM_SetCompare2(TIM3, Compare);
}

3.2电机端口初始化

/******************************Motor电机模块**************************
电机初始化设置 以及电机PWM设置
*********************************************************************/
#include "stm32f10x.h"                  // Device header
#include "Timer.h"

void MotorAll_Init(void)
{
	//开启电机驱动口的四个GPIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13|GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	PWM12_Init();//开启定时器
}

//设置右路电机速度 PWM
void MotorR_SetSpeed(int8_t Speed)
{
	if (Speed >= 0)//Speed值为正
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_12);//电机正转
		GPIO_ResetBits(GPIOB, GPIO_Pin_13);
		PWM12_SetCompare1(Speed);//设置Speed转速
	}
	else//Speed值为负
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);//电机反转
		GPIO_SetBits(GPIOB, GPIO_Pin_13);
		PWM12_SetCompare1(-Speed);//设为-Speed转速
	}
}

//设置左路电机PWM 速度
void MotorL_SetSpeed(int8_t Speed)
{
	if (Speed >= 0)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_14);
		GPIO_ResetBits(GPIOB, GPIO_Pin_15);
		PWM12_SetCompare2(Speed);
	}
	else
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_14);
		GPIO_SetBits(GPIOB, GPIO_Pin_15);
		PWM12_SetCompare2(-Speed);
	}
}

3.3小车运动封装

/******************************模块简介*******************************
模块功能:小车运动 模块函数封装 
*********************************************************************/
#include "stm32f10x.h"                  // Device header
#include "Motor.h" 
#include "Delay.h"  
void Car_Stop()//小车停止
{
	MotorR_SetSpeed(0);
	MotorL_SetSpeed(0);
}

void Car_Up()//小车前进
{
	MotorR_SetSpeed(80);
	MotorL_SetSpeed(80);	
}

void Car_Down()//小车后退
{
	MotorR_SetSpeed(-80);
	MotorL_SetSpeed(-80);
}

void Car_TurnRight()//小车右转
{
	MotorR_SetSpeed(-50);
	MotorL_SetSpeed(100);
}

void Car_TurnLeft()//小车左转
{
	MotorR_SetSpeed(100);
	MotorL_SetSpeed(-50);
}

void Car_Spin()//小车旋转
{
	MotorR_SetSpeed(-100);
	MotorL_SetSpeed(100);
}

在主函数中分别调用上述封装函数,即可实现电机的调速运动。


上述内容仅为作者个人看法,受限于水平和经验原因,部分描述可能存在问题。希望读者可以指出错误的地方,一起交流学习。毕竟读他人的东西只有做到双眼自将秋水洗,才能一生不受古人欺。


更新日期 :2023/6/8

作 者:公子易平文章来源地址https://www.toymoban.com/news/detail-556163.html

到了这里,关于STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月13日
    浏览(56)
  • 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图  六、硬件框图 七、流程图 八、程序源码 九、资料包括 随着社会在不断进步,高科技含量决定着产品发展的新趋势和前景,智能化技术在电子产品领

    2024年02月02日
    浏览(55)
  • 单片机控制PWM的直流电机调速系统的设计

    单片机控制PWM的直流电机调速系统的设计  摘 要:在国民生产中,随着现代技术的发展,电力电子技术已得到了全面的发展,其技术已应用到各个领域。在各类机电系统中,由于直流电机具有良好的启动、制动和调速性能,直流电机调速系统已广泛运用于工业、航天领域的各个

    2024年02月04日
    浏览(43)
  • 基于STM32单片机直流电机控制加减速正反转系统proteus仿真原理图程序

    功能: 0.本项目采用STM32F103C8T6作为单片机系统的控制MCU 1.通过按键可以控制电机,正转、反转、加速、减速、停止。 2.总共六个功能按键可实现正转、反转、加速、减速、停止。 3.启停和正反转均有指示灯,测试采用的霍尔传感器方案 4.采用DC002作为电源接口可直接输入5V给

    2024年02月12日
    浏览(56)
  • 51单片机控制步进电机启停,正反转速度——入门

    实验器件 STC89C52RC的学习板子一个 DC 5V 4相5线步进电机 28YBJ-48 减速步进电机一个 元器件连接: 51单片机开发板  电气原理图     实验现象:下载程序后; 当按下KEY1键可调节电机旋转方向; 当按下KEY2键,电机加速; 当按下KEY3键,电机减速; 按下KEY4的时候,电机启动/停止;

    2024年02月11日
    浏览(46)
  • Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测

    临近期末,学校的单片机课程需要做课程设计,主要内容是基于51单片机的可调速电机,具体要求如下,在此记录一下具体的一个解题方案。 要求利用单片机输出PWM波形,通过改变占空比,改变电枢两端电压的平均值,从而改变电动机的转速 通过按键进行手动速度调整(速度

    2023年04月14日
    浏览(67)
  • STM32单片机智能小车一PWM方式实现小车调速和转向

    目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转; IA1输入低电平,IA1输入高电平,

    2024年02月07日
    浏览(58)
  • 基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0031 基于51单片机的PWM控制直流电机设计 1.设计要求 采用51单片机作为核心控制器,控制直流电机的正转,反转,制动,停止。 2.功能要求 1)数码管显示当前转动方向和当前的PWM占空比0~100%。 2)电机

    2023年04月25日
    浏览(55)
  • 单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

    目录 工作原理 在电机控制中的应用 脉宽调制(PWM)是一种在单片机中常用的控制技术,它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号,用于控制电机速度、亮度、电压等。   产生PWM信号: 单片机内部的定时器/计数器通

    2024年01月23日
    浏览(66)
  • K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数         1、参数         2、引脚说明 三、驱动说明         TB6612模块驱动说明         对应程序:         ENA ENB输出PWM 四、部分代码说明         接线说明                 1、STC89C52RC+TB6612模块                 2、STM32F

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包