TA的每日心情 | 无聊 1-7-2015 18:46 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
一、简介
直流有刷电机(Brushed DC,简称BDC),由于其结构简单,操控方便,成本低廉,具有良好的扁动和调速性能等优势,被广泛应用于各种动力器件中,小到玩具,按钮调节式汽车座椅,大到印刷机械等生产机械中都能看到它的身影。
直流电源的电能通过电刷和换向器进入电枢绕组,产生电枢电流,电枢电流产生的磁场与主磁场相互作用产生电磁转矩,使电机旋转带动负载。
H桥是一个典型的直流电机控制电路,因为它的电路形状酷似字母H,故得名曰“H桥”。4个三极管组成H的4条垂直腿,而电机就是H中的横杠。【来源:360】
二、驱动模式
得保证一边的上下管不会直通。
(1)受限单极模式
这种模式,充电电路在预驱芯片内部则可以。如果自举电路在外部,则动作过程中,无法对自举电容进行充电。
(2)单极模式
PWM和PWMN是互补的PWM信号,一般用高级控制定时器的通道和互补通道控制。在PWM为高电平时:MOS管1和4都导通,MOS管2和3都截止,电流从电源正极,经过MOS管1,从左到右流过电机、然后经过MOS管4流入电源负极。在PWM为低电平时:MOS管2和4都导通,MOS管1和3都截止,根据楞次定律,存在自感电动势,电流还是从左到右流过电机,经过MOS管4和MOS管2形成电流回路。【来源:百度】
控制过程:MOS管1和2由一对互补PWM进行控制,当1为高电平时,由VCC-1-Motor-4-GND形成通路,电机电流上升。当1为低电平时,2变为高电平,根据楞次定律,当不再给电机供电,线圈中存在自感电动势,电流继续往同一方向流动,于是由2-Motor-4形成通路,给线圈电流继续提供通路。【来源:隔壁家的王小琪】
(3)双极模式
控制过程:1和4同时处于PWM的高电平,于是由VCC-1-Motor-4-GND形成通路,电流上升。当1和4同时变为低电平,2和3相应变为高电平,因为楞次定律,线圈上的电流方向不变,于是由GND-2-Motor-3-VCC形成通路,虽然存在反向的供电电压,但是电机的线圈电流更大,于是电流仍然向VCC流动,同时电流下降的更快,线圈电流波动也更大。【来源:隔壁家的王小琪】
通电线圈在磁场中受力转动,当线圈转到平衡位置时,为了使线圈能持续的转动下去,在输入电流时利用换向器来改变线圈中的电流方向,从而改变它两边的受力方向,使线圈连续转动.
直流电动机是根据通电线圈在磁场中受到力的作用而发生转动的原理制成的,它在工作时将电能转化为机械能.直流电动机主要由两部分组成,即能够转动的线圈和固定不动的磁体。在电动机里,能够转动的部分叫转子,固定不动的部分叫定子,电动机工作时,转子在定子中飞快地转动。安装直流电动机模型时,线圈不转的原因主要有电路开路、磁铁无磁性和线圈处于平衡位置等几种情况。转速过小是因为电流小或磁性弱。区别电动机与发电机,要分清是运动产生电,还是通电后运动,从而确定电能与机械能的转化;装置方面一个有电源,一个没有电源,电动机是通电产生运动,所以有电源的是电动机,没电源的是发电机。
“来源:程序环卫工”
最近用到了低压大功率有刷直流电机, 需要调速控制, 时间紧急,来不及加速度反馈, 直接使用PWM开环控制了。 根据功率估算了电流大概在10A左右,没时间画电路板,于是淘宝 找了下集成驱动模块, 发现也就BTS7960 板桥芯片的模块合适,于是买了3个, 模块每个有2个 BTS7960, 组成一个H桥, 驱动一路电机, 需要2路。 由于之前没有实际驱动过H桥, 看来下几种驱动方式, 决定使用单桥臂 PWM调制 方法, 另一桥臂作为方向使用, 这种情况下只有一路桥臂需要PWM引脚,实际分配引脚方便些, 但是有个问题,控制方向的桥臂驱动高电平时, pwm 桥臂侧最小时 输出低电平的话,其实是最大输出, 想到2种办法,一是更改输出极性, 二是 使用最大PWM值减去计算的pwm值作为 PWM输出, 不想再初始化定时器,于是采用 减pwm的方法写的。 H桥简图
考虑 方向桥臂有可能使用 继电器 或 接触器代替, 切换方向时 关闭使能了一段时间,避免驱动电机过程中切换方向,引起电弧,产生浪涌电压,损坏器件。 另外需要注意 大功率电机 需要添加加减速控制逻辑, 加速过程会避免大电流冲击, 减速过程能再生制动。 代码如下:
typedef enum DIR_ENUM // 方向枚举
{
DirForward = 0,
DirBackward = 1
}DirEnum;
/ 定义了个 最小PWM: BASE_PWM_VAL, pwm 映射到 百分比: BASE_PWM_PERC ~ 100
// 0 不要映射, 做 停止PWM用
u16 percConv(u32 pwm)
{
if(0 == pwm) return 0;
else return BASE_PWM_VAL + (pwm * (100 - BASE_PWM_PERC)) / 100;
}
// PCout(6)
// RUN_MOTR_EN PAout(8)
// 最少10mS 调用一次, 换向时 30mS内 无pwm输出
void setLRPwm(u16 reaPwmL, u16 reaPwmR, DirEnum dirL, DirEnum dirR)
{
static DirEnum lastDirL, lastDirR;
static u8 reinL, reinR; // static u16 lastPwmL, lastPwmR;
reaPwmL = percConv(reaPwmL);
reaPwmR = percConv(reaPwmR);
// check max pwm
if(reaPwmL > MAX_PWM_VAL) reaPwmL = MAX_PWM_VAL;
if(reaPwmR > MAX_PWM_VAL) reaPwmR = MAX_PWM_VAL;
// 左或右 换向时, 重置 时间计数, 多少次内无PWM输出
if(lastDirL != dirL)
{
reinL = 0;
lastDirL = dirL;
}
if(lastDirR != dirR)
{
reinR = 0;
lastDirR = dirR;
}
DIR_L = dirL;
DIR_R = dirR;
if(reinL < 4)
RUN_MOTL_EN = 0;
else
{
if(DirForward == dirL)
{
TIM_SetCompare3(TIM4, reaPwmL);
}else
TIM_SetCompare3(TIM4, FULL_PWM_VAL - reaPwmL);
if(0 == reaPwmL) RUN_MOTL_EN = 0;
else RUN_MOTL_EN = 1;
}
if(reinR < 3)
RUN_MOTR_EN = 0;
else
{
if(DirForward == dirR)
{
TIM_SetCompare4(TIM4, reaPwmR);
}else
TIM_SetCompare4(TIM4, FULL_PWM_VAL - reaPwmR);
if(0 == reaPwmR) RUN_MOTR_EN = 0;
else RUN_MOTR_EN = 1;
} // lastPwmL = reaPwmL; lastPwmR = reaPwmR;
reinL++; reinR++;
if(reinL > 200) reinL = 200;
if(reinR > 200) reinR = 200;
} |
|