STM32-微项目03-pwm控制直流电机运行

这篇具有很好参考价值的文章主要介绍了STM32-微项目03-pwm控制直流电机运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,项目目标

实现利用STM32F103C8T6+TB6612,输出不同占空比输出的PWM波,从而实现电机不同转速的运行、正反转的功能;

stm32通过定时器输出不同占空比的pwm波来调整直流电机的转速,实现家用电风扇的1,2,stm32,单片机,嵌入式硬件stm32通过定时器输出不同占空比的pwm波来调整直流电机的转速,实现家用电风扇的1,2,stm32,单片机,嵌入式硬件

 

 二、硬件涉及

1,STM32核心板

2,TB6612直流电机驱动模块

3,直流电机 

三、硬件接线涉及

1,先看TB6612直流电机驱动模块:

①驱动模块是具备两路PWM输入,两路out口,两路AIN,可以实现对两个不同电机的转速控制、方向控制;

stm32通过定时器输出不同占空比的pwm波来调整直流电机的转速,实现家用电风扇的1,2,stm32,单片机,嵌入式硬件

②模块引脚

仅使用第一路电机

PWMA控制电机占空比、AIN1 AIN2控制输入、A01 A02电机驱动

核心点:PWM控制电机转速、AIN控制转向、AO用于输出

 stm32通过定时器输出不同占空比的pwm波来调整直流电机的转速,实现家用电风扇的1,2,stm32,单片机,嵌入式硬件

2,STM32核心板接线

stm32通过定时器输出不同占空比的pwm波来调整直流电机的转速,实现家用电风扇的1,2,stm32,单片机,嵌入式硬件

四、前置知识介绍

1,定时器输出比较,输出PWM波

见微项目02介绍

 五、代码模块介绍

1,思路分析:

①开始RCC时钟,GPIO和TIM2时钟模块

②开启TIM2时钟输入源为内部72MHZ

③配置时钟模块,ARR和PSC模块

④输出比较模块配置

⑤配置TIM2输出端口的GPIO,复用推挽输出

⑥开始使能时钟

⑦动态配置CCR

⑧配置PA4,PA5控制输出、配置GPIO模块

下面开始代码介绍:

①配置GPIO时钟和TIM2的模块时钟

//配置时钟RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

②配置TIM2的时钟源,内部时钟72MHZ

//配置时钟源为RCC -72mhz
	TIM_InternalClockConfig(TIM2);

③配置时基模块,主要是ARR和PSC

	//配置时基单元数值
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;  //psc
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);

④输出比较单元配置

	//输出比较单元配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
	
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
	
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR数值

	TIM_OC3Init(TIM2, &TIM_OCInitStruct);

⑤配置PWM输出的端口PA2的GPIO  ---复用推挽输出

	// 配置PA2端口
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);

⑥开启时钟

//启动定时器
	TIM_Cmd(TIM2,ENABLE);

⑦动态配置CCR函数

void pwm_setcompare( uint16_t compare)
{
	TIM_SetCompare3(TIM2, compare);
}

⑧配置PA4,PA5控制输出、配置GPIO模块---推挽输出 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);

到此核心代码已经配置完成

具体在代码各个模块的体现

PWM模块

#include "stm32f10x.h"                  // Device header

void pwm_init(void)
{
	//配置时钟RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//配置时钟源为RCC -72mhz
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元数值
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1 ;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up ;
	TIM_TimeBaseInitStruct.TIM_Period=100-1;  //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1;  //psc
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	//输出比较单元配置
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1 ;
	
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High ;
	
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse=0;//设置CCR数值

	TIM_OC3Init(TIM2, &TIM_OCInitStruct);
	
	// 配置PA2端口
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);
	
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void pwm_setcompare( uint16_t compare)
{
	TIM_SetCompare3(TIM2, compare);
}

motor模块配置,对于pwm模块二次封装和调整

#include "stm32f10x.h"                  // Device header
#include "pwm.h" 

void motor_init(void)
{
	pwm_init();
	//初始化方向控制的PA4 PA5
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init( GPIOA, &GPIO_InitStruct);
	
}

void motor_setspeed(int8_t speed)
{
	if(speed >=0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		pwm_setcompare(speed);
	}
	else
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
		pwm_setcompare(-speed);
	}
}

在主函数的中简单配置文章来源地址https://www.toymoban.com/news/detail-765627.html

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "motor.H"
#include "key.H"



uint8_t keyn=0;
int8_t speed=0;
int main()
{
	
	OLED_Init();
	motor_init();
	keyinit();
	

	OLED_ShowString(1,1,"SPEED");
	OLED_ShowSignedNum(2,1,speed,3);
	while(1)
	{
		keyn=key_getnum();
		if(keyn==1)
		{
			speed+=20;
			if(speed>100)
			{
				speed=-100;
			}
			OLED_ShowSignedNum(2,1,speed,3);
		}
		motor_setspeed(speed);
	}
}

到了这里,关于STM32-微项目03-pwm控制直流电机运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【STM32学习】——定时器输出比较功能&PWM脉宽调制&通用/高级定时器输出比较通道&舵机/直流电机简介&PWM驱动呼吸灯/舵机/直流电机代码实操

    声明:学习笔记根据b站江科大自化协stm32入门教程编辑,仅供学习交流使用!

    2024年02月03日
    浏览(58)
  • STM32控制直流电机转向

    一、所需硬件模块 1.主控芯片:STM32F103C8T6 2.程序下载器:STLINK 3.电机:直流电机 4.电机驱动模块:L298N 二、模块介绍 1、主控芯片采用的是STM32系列的最小系统板,通过控制其引脚的输出进而实现对电机的控制; 2、STLINK下载器是用于烧录程序,其中的SWCLK、SWDLO、GND、3.3V引脚

    2024年02月07日
    浏览(37)
  • 基于STM32单片机的直流电机PWM调速(数码管显示)(Proteus仿真+程序)

          由 STM32单片机+数码管显示模块+键盘模块+L298N电机驱动模块+直流电机 1、采用STM32F103单片机为主控制器 2、四个按键,分别为启动/暂停、方向切换、加速、减速功能 3、数码管显示PWM占空比和电机转动方向(0正转,1反转) 注意:proteus8.11版本才能打开   24、基于STM32单

    2024年02月11日
    浏览(63)
  • [proteus]STM32F103单片机直流电机PID算法PWM波电机调速正反转Proteus仿真

    1、实现功能: (1)、基于STM32F103单片机PID算法PWM控制直流电机正反转调速,LCD1602显示转速等。可通过“加速”、“减速”按键修改“目标转速”并实时测量“实际转速”送到LCD1602上显示。 (2)、“启动”按键控制电机启动,默认启动电机是正转(示波器上的黄色PWM波)。 (3)、“

    2024年02月06日
    浏览(50)
  • 基于stm32的减速直流电机PID算法控制

    本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。         硬件组成:stm32f103c8t6最小系统板;0.96寸LED12864(I2C通讯模式);智能小车12v移动电源;25GA370直流减速电机(带霍尔编码器);JDY-31蓝牙模块

    2024年02月20日
    浏览(48)
  • PWM控制直流电机

    一,TB6612电机驱动模块       直流电机属于大功率器件,GPIO无法直接驱动,需要电机驱动模块配合,才能驱动直流电机. TB6612可以驱动2个直流电机。由IN1,IN2控制电机旋转方向,由PWM控制电机旋转速度。 二,代码部分 核心代码还是为PWM部分,直流电机初始化也只是多初始化

    2023年04月27日
    浏览(42)
  • PWM如何控制直流电机

    智能车基础可是控制电机呀!如何设置频率,如何控制车的加速,减速,正反转状态~。是这篇文章要弄明白的 对于普通的 直流(有刷)电机 ,在其两个电极上接上合适的直流电源后,电机就可以满速转动,电源反接后,电机就反向转动。实际情况是我们要能控制电机的正反

    2024年01月18日
    浏览(52)
  • 【正点原子】STM32电机应用控制学习笔记——2.直流无刷电机基础知识

    没有电刷,无换向器的电机,也称为无换向器电机。 主要是定子和转子,而直流有刷电机多的是换向器和电刷。 而直流有刷的定子是N和S的永磁体,而无刷是三个线圈饶阻。 直流有刷是定子是饶阻,无刷的定子是N和S的永磁体。两者的转子和定子恰好是相反的。也是他们最大

    2024年02月03日
    浏览(71)
  • STM32 Proteu直流电机正反转控制系统限位开关-0035

    STM32 Proteu直流电机正反转控制系统限位开关-0035 Proteus 仿真小实验: STM32 Proteu直流电机正反转控制系统限位开关-0035 功能: 硬件组成:STM32F103C6单片机 +L298N电机控制电路+直流电机+3个按键(正转、反转、停止)+LED指示灯(正转、反转、停止)+限位开关(正限位 反限位)

    2024年02月09日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包