直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块

这篇具有很好参考价值的文章主要介绍了直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

直接减速电机就是在直流电机上加上霍尔编码器,霍尔编码器可用于电机转动的测速,A、B相会产生相位相差90°的方波信号。stm32可以使用硬件资源或者软件模拟来捕获编码器信号。这里我介绍的是stm32自带的编码器模式来使用直流减速电机。

1.模块介绍

1.1直流减速编码电机

以下是直流减速电机的商品图
​​stm32f103c8t6控制直流电机,STM32,stm32,单片机,嵌入式硬件,模块测试
同时我使用的是转速为620的直流电机,此直流电机的电流在0.07A(空载)到1.8A(堵转)之间。
stm32f103c8t6控制直流电机,STM32,stm32,单片机,嵌入式硬件,模块测试
直流电机和编码盘互相独立供电,红色和白色需要连接到电机驱动模块的输出。黑色和绿色是编码器电源,3.3V供电。黄色和绿色就是编码器的AB相,硬件资源会占用定时器的ch1和ch2通道。

1.2电机驱动模块

直流电机没有办法直接接在单片机上面使用,大部分的单片机引脚通过的电流在100mA左右,没有办驱动直流电机,同时单片机也无法承受直流电机的反馈脉冲电流强度,会导致单片机烧毁。所以单片机驱动电机时添加驱动电路来控制电机的转动。也就是由外部电源来提供电流,驱动电机转动。
这里使用的是L298N驱动模块来驱动电机转动。
stm32f103c8t6控制直流电机,STM32,stm32,单片机,嵌入式硬件,模块测试
驱动模块的5V连接到单片机的5V接口,L298N模块在连接外部电源时会给单片机5V供电,L298N模块的GND连接电池的负极以及单片机板载GND,输出A和输出B连接电机的正负极。
在测试模块是否正常使用时,使能端(ENA和ENB)的跳线帽可以不拔(这样相当于ENA、ENB接高电平,),IN1,IN2设置高低电平来让电机转动。当使用PWM信号控制电机转速时,使能端的跳线帽要拔下来,同时PWM信号要输入在使能端。

以下是L298N驱动模块的引脚使用方法

ENA IN1 IN2 转动
1 1 0
1 0 1
1 1 1
0 - -
ENB IN3 IN4 转动
1 1 0
1 0 1
1 1 1
0 - -

接线如下
ENA–>PA8
ENB–>PA9
IN1–>PB12
IN2–>PB13
IN3–>PB14
IN4–>PB15
编码器1–>PA0 PA1
编码器2–>PA6 PA7
之后的代码只举例一个编码电机,也就是编码器2。
stm32f103c8t6控制直流电机,STM32,stm32,单片机,嵌入式硬件,模块测试

2.软件部分

2.1中断配置

使用TIM4定时器进行软件中断,用于刷新OLED显示stm32捕获编码器的速度值,单独写在Timer.c的文件中

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);		//使能TIM4时钟
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;				//TIM4中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);								//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
	
	TIM_TimeBaseStructure.TIM_Period = 10000-1;				//总的值设置为0xFFFF,设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;			//预分频器
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;				//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);				//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM_Cmd(TIM4, ENABLE);										//开启定时器
	TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);					//开启定时器更新中断
}

中断函数可以写在Timer.c文件或者main.c文件

void TIM4_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
	{
		//LED_ON();//用于测试是否进入中断
		Speed1 = Encoder_Get1();
		Speed2 = Encoder_Get2();
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}

这里需要说明一下LED_ON();的函数,这个函数的作用是点亮stm32f103c8t6最小系统板自带的LED灯,新手在配置中断时候可以使用这样的方法快速检验是否进入中断。

2.2编码器模式配置

这里把TIM3配置为编码器模式,当定时器配置为编码器模式的时候,时钟会被占用,无法处理其他任何工作,并且编码器模式会占用时钟的1和2通道。

#include "stm32f10x.h"                  // Device header

void Encoder_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;//配置GPIO
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	TIM_ICInitTypeDef TIM_ICInitStructure;//配置编码器模式
	TIM_ICStructInit(&TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
	TIM_ICInitStructure.TIM_ICFilter = 0xF;
	TIM_ICInit(TIM3, &TIM_ICInitStructure);
	//开启编码器模式
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_Cmd(TIM3, ENABLE);//使能时钟
}

int16_t Encoder_Get(void)//获取编码器模式读取的值,用于OLED显示
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}

2.3主函数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "OLED.h"
#include "L298N.h"
#include "Timer.h"
#include "Encoder.h"

int16_t Speed1,Speed2;

int main(void)
{
	
	OLED_Init();
	Timer_Init();
	LED_Init();
	Encoder_Init();
	L298N_Init();
	OLED_ShowString(1, 1, "Speed1:");
	OLED_ShowString(2, 1, "Speed2:");
	
	while (1)
	{
		
		OLED_ShowSignedNum(1, 7, Speed1, 5);
		OLED_ShowSignedNum(2, 7, Speed2, 5);
		L298N_TurnText();
	}
}

void TIM4_IRQHandler(void)//中断函数一直刷新编码器模式捕获的值
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
	{
		//LED_OFF();//用于测试是否进入中断
		Speed1 = Encoder_Get1();
		Speed2 = Encoder_Get2();
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
	}
}

OLED显示刷新放在中断函数中是为了多任务考虑,如果只需要单片机显示编码器的值,那OLED的刷新放在主函数中就可以,但是会占用主程序的资源,单片机执行其他任务就会有压力。所以将OLED显示刷新放在中断函数中显示

3.总结

使用stm32来捕获编码电机信号,主要是使用TIM_EncoderInterfaceConfig函数来开启和配置编码器模式。stm32的编码器模式相关函数只有这一个。

stm32使用PWM信号控制直流电机速度会在我的其他文章中说明(还没有更新出来),更新后我会把文章链接放在末尾。文章来源地址https://www.toymoban.com/news/detail-545898.html

到了这里,关于直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于STM32F103的PWM电机驱动A4950

    A4950的峰值输出电流可达±3.5 A,工作电压为7.6~40v。 优点:相对于L298N模块控制2个电机正反转仅需要4个I/O口,体积小,发热低。 缺点:需要2个PWM引脚才能控制正反转,所以控制2个电机需要4PWM引脚,会使用STM32F103芯片一个定时器的全部PWM通道。 A4950模块是靠输入2路的PWM占空

    2024年02月04日
    浏览(38)
  • stm32f103单片机—编码器测速

    stm32f103ZET6开发板(非指定) MG513P3012V型号电机(带霍尔编码器)(非指定) 此种测速方法要求单片机的定时器具有编码器模式,对于stm32f1系列,具备编码器模式的定时器有TIM1/2/3/4/5/8, 定时器使用通道1、2来实现编码器功能 ,接线时注意把A/B相接到定时器通道1/2的引脚。 电

    2024年02月06日
    浏览(42)
  • stm32F103单片机pwm控制伺服驱动器进而控制步进电机

    1.需要一台步进电机,私服驱动器,stm32单片机;先按照说明文档,连接好硬件相关线路,对应好sign+,sign-,puls+,puls-线路,其中sign只是个io口拉高拉低操作,puls是pwm波形输出口,虽然有两根线,但只是需要控制一个IO口输出波形即可; 采用主从模式,TIM1为主定时器,tim3未从定

    2024年02月04日
    浏览(17)
  • 设计分享 | STM32F103RCT6利用ULN2003驱动步进电机正反转

    https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a86e13f421741aefd08cedb169708309c79566ab1ftoken=1923877603lang=zh_CN#rd https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==mid=2247484170idx=1sn=3fa68d0fbf30cf614e8779abf38c3e2bchksm=cf430652f8348f44e4b95bb7b22ce7f9f5a8

    2023年04月17日
    浏览(17)
  • 【32单片机学习】(3)霍尔编码器减速直流电机控制及测速

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1.实验现象 2.实验接线及原理图 接线图 原理图  电机接线图 3.代码部分 1.主函数  main.c 2.按键部分   key.c  key.h pwm代码   pwm.c  pwm.h 电机驱动   motor.c   motor.h  OLED显示 oled.c oled.h  编码器

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

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

    2024年02月20日
    浏览(21)
  • J-Link使用汇总(STM32F103)

    内容包括SWD硬件连接,Keil仿真设置与其问题解决, J-Flash解除写保护与下载Hex文件及对芯片批量加密 。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!  一、SWD实时仿真硬件电路 1、SWD实时仿真接线 2、注意 二、仿真设置 三、仿真时问题的解决 (Keil5.

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

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

    2024年02月12日
    浏览(28)
  • 使用STM32F103的串口实现IAP程序升级功能

    🎬IAP程序烧录全过程演示: ✨这几天折腾IAP升级功能,狂补了很多相关BootLoader相关的知识。本来最想实现IAP升级程序的方式是,基于SPI通讯的SD卡,借助挂载的FatFS文件系统,来实现对目标stm32芯片的自身程序的升级,奈何没有实现,只能求其次,先来通过官方现有的串口实

    2024年02月10日
    浏览(14)
  • STM32f103入门 CubeMX使用教程--安装教程及新建工程

    1、STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。STM32CubeMX几乎覆盖了STM32 全系列芯片。 在CubeMX上,通过傻瓜化的操作便

    2024年02月11日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包