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

日期:2023-07-11 21:04:01浏览量:210

深圳市鑫希田机电有限公司(艾德克尔ADDKA)是集工业自动化零部件产品、互联网、供应链服务于一体的综合性工厂直销+电商平台, 2005年创立于粤港澳大湾区四大中心城市之一 、国家物流枢纽、国际性综合交通枢纽 、国际科技产业创新中心 、中国三大全国性金融中心之一 深圳市,以代理销售日本松下、三菱、ABB等工业自动化传动产品,为使产品质量不断提高,引进一批高素质的专业技术人员,引进100台/套 日本哈马仪滚齿机、精密全自动磨床、热处理设备、CNC加工中心等生产设备;日本TIT精密齿轮检测设备、铬氏硬度仪、维氏硬度仪等,至力研发、生产高效、节能、环保型的工业传动产品。 2020年为适应客户需要,满足客户期望一站式采购工业自动化零部件需求,公司转型升级,旨在构建以“工业部件+工厂+互联网+供应链”为主体的全新工业品营销方式,打造工业自动化零部件自主生产、线上线下交易、服务、技术支持一体化平台。具有高性价比,正品保证,快速出货,免费3D下载等特点。我们多样化的产品种类与充足的库存使客户可以安心、便捷地搜寻和购买到合适的产品。、充足的现货储备,所有产品质量保障, 深圳市鑫希田机电有限公司为客户提供专业的采购服务,节省客户的时间和成本。

引言

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

1.模块介绍

1.1直流减速编码电机

以下是直流减速电机的商品图

同时我使用的是转速为620的直流电机,此直流电机的电流在0.07A(空载)到1.8A(堵转)之间。

直流电机和编码盘互相独立供电,红色和白色需要连接到电机驱动模块的输出。黑色和绿色是编码器电源,3.3V供电。黄色和绿色就是编码器的AB相,硬件资源会占用定时器的ch1和ch2通道。

1.2电机驱动模块

直流电机没有办法直接接在单片机上面使用,大部分的单片机引脚通过的电流在100mA左右,没有办驱动直流电机,同时单片机也无法承受直流电机的反馈脉冲电流强度,会导致单片机烧毁。所以单片机驱动电机时添加驱动电路来控制电机的转动。也就是由外部电源来提供电流,驱动电机转动。

微型 直流减速电机

这里使用的是L298N驱动模块来驱动电机转动。

驱动模块的5V连接到单片机的5V接口,L298N模块在连接外部电源时会给单片机5V供电,L298N模块的GND连接电池的负极以及单片机板载GND,输出A和输出B连接电机的正负极。

在测试模块是否正常使用时,使能端(ENA和ENB)的跳线帽可以不拔(这样相当于ENA、ENB接高电平,),IN1,IN2设置高低电平来让电机转动。当使用PWM信号控制电机转速时,使能端的跳线帽要拔下来,同时PWM信号要输入在使能端。

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

接线如下

ENA-->PA8

ENB-->PA9

IN1-->PB12

微型 直流减速电机

IN2-->PB13

IN3-->PB14

IN4-->PB15

编码器1-->PA0 PA1

编码器2-->PA6 PA7

之后的代码只举例一个编码电机,也就是编码器2。

2.软件部分

2.1中断配置

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

 "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信号控制直流电机速度会在我的其他文章中说明(还没有更新出来),更新后我会把文章链接放在末尾。

以上内容为用户投稿,如有侵权请联系我们删除!