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);  //减少电机速度
  }
}
### 回答1: stm32是一种微控制器,具有控制直流电机的能力。直流电机是一种常见的电机类型,采用直流电源供电,并且通过改变电流方向来实现电机转动。 stm32可以通过使用PWM(脉宽调制)信号来控制直流电机的转速和转向。通过调整PWM信号的占空比,可以改变电机的转速。当占空比增大时,电机转速增加;而当占空比减小时,电机转速减小。此外,通过改变PWM信号的极性,也可以改变电机的转向。 为了实现直流电机的精确控制,stm32还可以配备编码器或霍尔传感器等反馈装置。这些装置可以测量电机的转速和位置,然后传输给stm32微控制器,以便它可以根据需要调整PWM信号和电机转动方向,从而实现更精确的控制。 另外,stm32还提供了丰富的开发工具和软件库,用于快速开发直流电机控制应用程序。这些工具和库可以大大简化开发过程,并提供一套完整的开发环境,包括实时操作系统、驱动程序和调试工具,使开发人员能够更轻松地实现直流电机的控制。 总之,stm32是一种强大的微控制器,适用于控制刷直流电机。它能够通过PWM信号和反馈装置实现对直流电机的精确控制,同时提供了丰富的开发工具和软件库,使开发人员能够更轻松地进行直流电机控制的开发。 ### 回答2: STM32是一款由意法半导体公司开发的32位微控制器系列,并且它可以用于驱动刷直流电机。刷直流电机是一种常见的电动机类型,以其结构简单、效率高等特点而闻名。 首先,STM32系列微控制器具有丰富的外设资源,包括多个定时器和PWM(脉冲宽度调制)输出通道,能够灵活地生成和控制电机驱动信号。通过使用计时器和PWM模块,可以实现电机速度调节、电机正反转控制等功能。 其次,STM32系列微控制器内建了很多通信接口,如USART、SPI、I2C等,可以用于与外部设备(例如编码器、传感器等)进行通信,实现对电机的闭环控制。通过读取编码器反馈信息,可以实时监测电机转速和位置,并采取相应的控制策略。 此外,STM32系列还提供了丰富的开发工具和软件库,例如CubeMX和HAL库,这些工具可以帮助开发者快速搭建电机驱动系统。开发者可以通过这些工具设置GPIO引脚的输出模式和电平,配置定时器和PWM通道的工作方式,编写控制算法等。 总之,STM32系列微控制器通过灵活的外设资源、通信接口和开发工具,能够实现对刷直流电机的精确控制。无论是在工业控制、机器人、自动化设备等领域,都可以广泛应用于刷直流电机驱动系统中。 ### 回答3: STM32是一款嵌入式微控制器,它可以与刷式直流电机一起使用。刷式直流电机是一种常见的电动机类型,具有结构简单、容易控制的特点。 在STM32上使用刷式直流电机时,通常需要使用PWM(脉宽调制)信号来控制电机的速度和方向。PWM信号是一种将直流电源转换成脉冲信号的技术,通过改变脉冲的占空比可以控制电机的转速。 为了控制刷式直流电机,首先需要将电机连接到STM32的GPIO引脚上。然后,使用STM32的PWM模块来生成PWM信号,并将其输出到相应的GPIO引脚上。通过改变PWM信号的占空比,可以改变电机的转速。此外,还可以通过控制PWM信号的频率来调整电机的运行效果。 为了改变电机的转向,可以使用STM32上的GPIO引脚控制电机的正反转。通过控制GPIO引脚的高低电平,可以改变电机的转向。 在使用STM32控制刷式直流电机时,还可以结合使用传感器来实现反馈控制。通过获取电机的转速或位置信息,并将其与目标值进行比较,可以实现闭环控制,从而提高电机的精度和稳定性。 总之,STM32可以与刷式直流电机一起使用,通过PWM信号和GPIO控制,可以实现对电机速度和方向的精确控制,为各种应用提供了便利和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值