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