STM32物联网项目-有刷直流电机

有刷直流电机

直流有刷电机是内含电刷装置的将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。区别于直流无刷电机,电刷装置是用来引入或引出直流电压和直流电流的。直流有刷电机是所有电机的基础,它具有启动快、制动及时、可在大范围内平滑地调速、控制电路相对简单等特点。
在这里插入图片描述

优点

1、价钱比较便宜。
2、方便控制,只需施加直流电压即可使电机转动,有时候甚至不需要使用微控制器,只要把电机连接到电池就可以使用。
3、有刷直流电机在低速时会产生输出高扭矩,即使电机有负载,那么在这种高启动转矩的使用状况下,也能带动负载。

缺点

1、有刷电机的刷子在不断地运转时,这些电刷会随着时间的推移而磨损。
2、有刷直流电动机在使用的时候电刷和换向器之间会产生电弧,会产生大量的电噪声。
3、在电机转动时,部件之间存在摩擦,而这些摩擦会产生热量,当转速达到最大时,会因为过高的速度导致热量增大而出现电机无法使用的情况。

电机选型

1.尺寸:根据结构大小选择尺寸

2.扭力:要足够带动负载

3.驱动电压:一般5V,12V,24V

4.驱动电流:电流和电压影响功率,一般功率越大,扭力越大

驱动方式

驱动方式一:只能打开或关闭,不能变速与换向,用继电器,BJT或MOS开关控制通断即可。
有刷直流电机接到J7座子即可
在这里插入图片描述

驱动方式二:可以打开或关闭,可以变速,但不能换向,可用PWM控制电子开关,也可控制驱动电压大小,一般选用PWM控制,比较简单,如下图:

在这里插入图片描述

驱动方式三:可以打开或关闭,可以变速,也可以换向(正转/反转),用PWM控制桥路,改变流经电机的电流,就能改变电机转向,如下图:

情况一:

在这里插入图片描述

情况二:

在这里插入图片描述

直流电机常用驱动IC——LV8548MC(安森美)

芯片简介

12V低饱和电压驱动正/反向电动机驱动器

概述

LV8548MC是一种2通道低饱和电压正/反向电机驱动芯片。适用于12V系统产品,可驱动两台直流电机,一台采用并联方式的直流电机,或者可全程和半步驱动步进电机。

供电电压为:4 ~ 16V

引脚

在这里插入图片描述

IN1和IN2引脚一起工作,驱动输出引脚OUT1和OUT2;IN3和IN4引脚一起工作,驱动输出引脚OUT3和OUT4

控制逻辑

在这里插入图片描述

Forward表示正转,Reverse表示反转,这跟电机接线有关系

硬件电路

在这里插入图片描述

IN1接到了32的PB1引脚,是TIM3_CH4,INT2接到PB0,是TIM3_CH3,所以用32单片机控制一路通道输出PWM波,另一路输出低电平,就能用OUT1和OUT2控制电机转动

在这里插入图片描述

通道3和通道4默认是低电平,要电机正转,通道3就输出PWM波,通道4就为低电平;要电机反转,通道4就输出PWM波,通道3就为低电平

程序

DC_Motor.c

电机启动和停止,正转反转,加速和减速函数

DC_Motor_t DC_Motor = 
{
    Stop_Status,
    Forward_Status,
    Speed_20,

    Start,
    Stop,
    Direction_Adjust,
    Speed_Adjust
};
/* Private function prototypes------------------------------------------------*/

/*
* @name   Start
* @brief  启动直流电机
* @param  None
* @retval None   
*/
static void Start()
{
    //启动电机
    if(DC_Motor.Direction ==  Forward_Status)   //如果电机的方向是正转
    {
        HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);    //启动定时器3通道3的PWM输出
    }
    else //如果电机方向是反转
    {
        HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);    //启动定时器3通道4的PWM输出
    }
    //更新电机状态
    DC_Motor.Status = Start_Status;
}

/*
* @name   Stop
* @brief  停止直流电机
* @param  None
* @retval None   
*/
static void Stop()
{
    //关闭电机
    if(DC_Motor.Status == Start_Status)
    {
        HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);     //关闭通道的3PWM输出
        HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);     //关闭通道的4PWM输出
    }
    //更新电机状态
    DC_Motor.Status = Stop_Status;
}

/*
* @name   Direction_Adjust
* @brief  调整转动方向
* @param  Direction:要设置的方向
* @retval None   
*/
static void Direction_Adjust()
{
    //判断是否是启动状态
    if(DC_Motor.Status == Start_Status)
    {
        if(DC_Motor.Direction == Reverse_Status)        //如果原来是反转
        {
            //设置为正转
            HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4);     //关闭通道4的PWM输出
            HAL_Delay(200);                             //延时200ms,等待电机停止
            HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);    //启动定时器3通道3的PWM输出
            DC_Motor.Direction = Forward_Status;        //更新方向为正转
        }
        else        //如果原来是正转
        {
            //设置为反转
            HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_3);     //关闭通道3的PWM输出
            HAL_Delay(200);                             //延时200ms,等待电机停止
            HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);    //启动定时器3通道4的PWM输出
            DC_Motor.Direction = Reverse_Status;        //更新方向为反转
        }
    }
}

/*
* @name   Speed_Adjust
* @brief  调整转动速度
* @param  Speed_Change:增加速度或者减少速度
* @retval None   
*/
static void Speed_Adjust(Speed_Change_t Speed_Change)
{
    //判断是否是启动状态
    if(DC_Motor.Status == Start_Status)
    {
        //增大电机速度
        if(Speed_Change == speed_up)
        {
            switch (DC_Motor.Speed)
            {
                case Speed_20:   DC_Motor.Speed = Speed_30;  break;
                case Speed_30:   DC_Motor.Speed = Speed_40;  break;
                case Speed_40:   DC_Motor.Speed = Speed_50;  break;
                case Speed_50:   DC_Motor.Speed = Speed_60;  break;
                case Speed_60:   DC_Motor.Speed = Speed_70;  break;
                case Speed_70:   DC_Motor.Speed = Speed_70;  break;
                default:         DC_Motor.Speed = Speed_20;  break;
            } 
        }
        //减少电机速度
        else
        {
            switch (DC_Motor.Speed)
            {
                case Speed_70:   DC_Motor.Speed = Speed_60;  break;
                case Speed_60:   DC_Motor.Speed = Speed_50;  break;
                case Speed_50:   DC_Motor.Speed = Speed_40;  break;
                case Speed_40:   DC_Motor.Speed = Speed_30;  break;
                case Speed_30:   DC_Motor.Speed = Speed_20;  break;
                case Speed_20:   DC_Motor.Speed = Speed_20;  break;
                default:         DC_Motor.Speed = Speed_70;  break;
            }
        }
        //改变占空比
        TIM3->CCR3 = DC_Motor.Speed;
        TIM3->CCR4 = DC_Motor.Speed;
    }
}

CallBack.c

外部中断回调函数中,检测4个触摸按键

按键1控制启动或停止电机

按键2控制电机正转和反转

按键3控制电机增加速度

按键4控制电机减少速度

/*
* @name   StaHAL_GPIO_EXTI_Callbackrt
* @brief  外部中断回调函数
* @param  GPIO_Pin:触发外部中断的引脚
* @retval None   
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  //如果按键1被按下
  if(GPIO_Pin == KEY1_Pin)
  {
    LED.LED_Fun(LED1,LED_Flip);
    if(DC_Motor.Status == Stop_Status)
    {
      DC_Motor.Start(); //启动电机
    }
    else
    {
      DC_Motor.Stop();  //停止电机
    }
  }

  //如果按键2被按下
  if(GPIO_Pin == KEY2_Pin)
  {
    LED.LED_Fun(LED2,LED_Flip);
    DC_Motor.Direction_Adjust();    //调整转动方向
  }

  //如果按键3被按下
  if(GPIO_Pin == KEY3_Pin)
  {
    LED.LED_Fun(LED3,LED_Flip);
    DC_Motor.Speed_Adjust(speed_up);  //增加电机速度
  }

  //如果按键4被按下
  if(GPIO_Pin == KEY4_Pin)
  {
    LED.LED_Fun(LED3,LED_Flip);
    DC_Motor.Speed_Adjust(speed_down);  //减少电机速度
  }
}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值