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


    有刷直流电机

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

    电机选型

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

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

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

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

    驱动方式

    驱动方式一:只能打开或关闭,不能变速与换向,用继电器,BJT或MOS开关控制通断即可。

    驱动方式二:可以打开或关闭,可以变速,但不能换向,可用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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    MySQL(三):表的增删改查(进阶)
    【故障公告】取代 memcached 的 redis 出现问题造成网站故障
    支持在线写SQL的Oracle学习免费网站(个人常使用)
    CCAA 常见错题集
    java类的练习 -- 声明一个接口(Calculability),接口中
    Docker harbor私有仓库部署与管理
    Idea之常用插件
    10.用户登录——什么是token、生成token、token获取用户信息免密登录、登录装饰器
    vue2 .sync 修饰符
    登录中获取验证码的节流
  • 原文地址:https://blog.csdn.net/weixin_46251230/article/details/126727802