[电机应用]

4线双极性马达和SG90舵机

[复制链接]
264|0
手机看帖
扫描二维码
随时随地手机跟帖
Zuocidian|  楼主 | 2025-1-4 10:07 | 显示全部楼层 |阅读模式
一、四线双极性电机控制
1. 四线双极性电机工作方式介绍

66484677897ea109cf.png

四线双极性电机通常用于驱动一些需要高效率和可靠性的应用。它的定子通常包含固定的线圈,而转子则是可以旋转的部分,通常是通过磁场与定子相互作用来产生转动力。

(1)工作原理
四线双极性电机的工作原理基于电流和磁场之间的相互作用。当电流通过定子线圈时,产生的磁场会与转子上的磁场相互作用,导致转子产生旋转运动。

68470677897e30a9a1.png

(2)驱动方式
四线双极性电机通常使用直流电源供电。通过在定子线圈中施加不同方向的电流,可以控制电机的转向和速度;
该电机驱动原理有4拍驱动和8拍驱动,4拍即4个节拍一转动圈,8拍即8个节拍一圈。

本文使用TC1508S芯片用来驱动4线双极性电机。

(3)极性区分
与五线四相步进电机相比,四线双极性步进电机只有四根电路线,其中两根用于控制两个线圈(相),另外两根则是共阳或共阴线和地线。

四线双极性步进电机的线圈是分别独立连接的,每个线圈只与一个控制线相连。
四线双极性步进电机的步进角度通常较大,因为它们只有两个线圈,步进角度受限于线圈的布置方式。
(4)驱动方式
四线双极性步进电机只需要使用两个控制信号,通过改变信号的极性来控制线圈的激活,从而实现步进运动。

2. TC1508S芯片介绍
TC1508S是一款双通道直流电机驱动集成电路,主要用于驱动中小型直流电机或四线双极性步进电机。这款芯片内置了功率MOSFET全桥驱动电路,可以方便地实现电机的正转、反转、停止以及刹车控制。

我手头的步进电机额定电压要6-24V,TC1508S无法直接驱动。已网购 TMI8549 芯片,到手实验成功后补充驱动电路 。

(1)主要特性
双通道设计:能够独立驱动两个直流电机或一个步进电机的两个绕组。

内置MOSFET:集成高耐压和大电流的MOSFET,每个通道的最大连续输出电流可达1.8A,并且支持峰值电流2.5A,这意味着它可以直接驱动中低功率的直流电机而无需额外的H桥驱动电路。

宽电压工作范围:适合多种电源电压条件下的应用。

高效能:具有超低的待机电流和工作电流,有助于节能和提高整体系统效率。

控制功能:提供前进、后退和制动模式的控制接口,使得在嵌入式系统中对电机进行精准操控变得容易。

保护机制:虽然具体的保护功能未明确指出,但通常这类马达驱动芯片会包含过流、短路等保护措施以确保芯片及电机的安全。

(2)引脚

29101677897d95d1c5.png

INA、INB 第一通道输入
OUTA、OUTB 第一通道输出
INC、IND 第二通道输入
OUTC、OUTD 第二通道输出
几个GND 连地
VDD 连5V
(3)输入/输出逻辑表

50312677897d282efb.png

波形:

27292677897c7e3e83.png

第二通道与此类似 。
由于输出可以反相,可以控制电机正转或反转。

3. 模块电路图
本文示例是从网上直接购买的模块组件,原理图如下:

29194677897c164ef4.png

PCB示例:

78275677897b9b222e.png

4. 代码实现
dc_motor_4_wire_utils.c
#include "dc_motor_4_wire_utils.h"

// 默认逆时针方向
static u8 dir=0;
// 默认最大速度旋转
static u8 speed=STEPMOTOR_MAXSPEED;
static u8 step=0;
// 1运行中 0停止运行
static u8 run_flag=0;
/**
* @brief 向步进电机发送一个脉冲
* @param step 指定步进序号,可选值0~7
* @param dir 方向选择,1:顺时针,0:逆时针
*/
void step_motor_4_wire_send_pulse(void){
        u8 temp=step;
       
        if(dir==0)        //如果为逆时针旋转
                temp=7-step;//调换节拍信号

  // (A+)---(A+B+)---(B+)--(B+A-)---(A-)---(A-B-)---(B-)---(B-A+)
        // A-AC-C-CB-B-BD-D-DA-A
        switch(temp)
        {   //        黑A+  绿A-    黄B+   红B-
                case 0: IN_A=1;IN_B=0;IN_C=0;IN_D=0;break;
                case 1: IN_A=1;IN_B=0;IN_C=1;IN_D=0;break;
                case 2: IN_A=0;IN_B=0;IN_C=1;IN_D=0;break;
                case 3: IN_A=0;IN_B=1;IN_C=1;IN_D=0;break;
                case 4: IN_A=0;IN_B=1;IN_C=0;IN_D=0;break;
                case 5: IN_A=0;IN_B=1;IN_C=0;IN_D=1;break;
                case 6: IN_A=0;IN_B=0;IN_C=0;IN_D=1;break;
                case 7: IN_A=1;IN_B=0;IN_C=0;IN_D=1;break;
        //default: IN_A=0;IN_B=0;IN_C=0;IN_D=0;break;
        }                       
}
/**
* @brief 设置速度
*/
void step_motor_4_wire_set_speed(u8 s){
    speed=s;
}
/**
* @brief 增加速度
*/
void step_motor_4_wire_increase_speed(void){
    if(speed>STEPMOTOR_MAXSPEED)speed--;
    else{
        speed = STEPMOTOR_MINSPEED;
    }
}
/**
* @brief 设置方向
*/
void step_motor_4_wire_set_dir(u8 d){
    dir=d;
}
/**
* @brief 反转方向
*/
void step_motor_4_wire_revert_dir(void){
        if(dir==0)
                dir=1;
        else
                dir=0;
}
/**
* @brief 启动
*/
void step_motor_4_wire_start(void){
    run_flag=1;
}
/**
* @brief 运行
*/
void step_motor_4_wire_run(void){

        if(run_flag==1){
                step_motor_4_wire_send_pulse();
                step++;
                if(step>7)step=0;
                delay_10us(speed*300);
        }
}
/**
* @brief 停止
*/
void step_motor_4_wire_stop(void){
    run_flag=0;
}
void step_motor_4_wire_init(void){
        IN_A=0;
        IN_B=0;
        IN_C=0;
        IN_D=0;
}




main.c
#include "dc_motor_4_wire_utils.h"
#include "key_utils.h"

/**
* @brief 按键3_4回调函数
*/
void key3_4Callback(int keyNum){
        // key3 转方向
        if(keyNum == 3){
                step_motor_4_wire_revert_dir();
        }else{
                // key4 增加速度
                step_motor_4_wire_increase_speed();
        }
}

/**
* @brief 主函数
*/
void main()
{
        step_motor_4_wire_init();
        step_motor_4_wire_set_speed(1);
        // 顺时针旋转
        step_motor_4_wire_set_dir(1);
        // 启动步进电机
        step_motor_4_wire_start();

        key3_init();
        key4_init();
        setCallback(key3_4Callback);
        while(1){
                // 运行步进电机
                step_motor_4_wire_run();
        }               
}




二、SG90舵机控制
1. SG90简介
SG90舵机是一款常见且经济实惠的小型模拟伺服电机,广泛应用于各类DIY电子制作、机器人技术和模型制作中。它的主要特性和参数的简要介绍:

结构与尺寸:

尺寸小巧,规格约为21.5mm x 11.8mm x 22.7mm,重量仅为9克,适合在空间有限的应用场合中使用。
工作原理:

舵机作为一种位置伺服驱动器,通过接收外部控制器(如单片机、遥控器等)发出的PWM(脉宽调制)信号,依据脉冲宽度的变化来精确控制转动的角度。
电气规格:

工作电压范围为4.8V至6V,典型工作电压为4.8V。
最大扭矩约为1.2至1.4公斤/厘米(在4.8V电压下),意味着它能提供足够的力量保持特定角度或者克服一定阻力。
控制信号周期通常为20毫秒,脉冲宽度在0.5ms至2.5ms之间变化,对应不同的旋转角度,1.5ms时位于中心位置(约180度机械结构的一半)。
脉冲控制精度较高,可达2微秒级别。
位置等级为1024级,理论上可实现更精细的角度定位。
性能指标:

无负载情况下,SG90舵机在4.8V电压下大约能在0.12秒内完成60度的旋转,即每度大约需要0.002秒。
使用温度范围较宽,从-30摄氏度到+60摄氏度。
设有死区设定,防止舵机在接近目标角度时过度抖动,提高了稳定性。
类型:

根据内部结构材料的不同,SG90舵机有塑料齿轮和金属齿轮两种版本,金属齿轮版通常具有更高的耐用性和承载能力。
2. 硬件连接
51单片机的I/O端口可以直接连接SG90,

83269677897a39dd15.png

3. 控制信号
调整信号线的PWM,就可以让SG90实现各个角度转动。

180度舵机控制参数:

6770677897957b60c.png

4. 代码示例
dc_motor_sg90_utils.c
#include "dc_motor_sg90_utils.h"

// 信号引脚
sbit SG_PWM = P0^0;
// 计数用来切换高低电平
static u8 PWM_count=3;   
static u8 count=0;
//1--0度,2--45度,3--90度,4--135度,5--180度
static u8 sg90_angle=0;
void sg90_timer_Init()
{
        TMOD = 0X01;              // T0定时方式1
        TH0 = 0Xfe;
        TL0 = 0X33;               // 计数初值设置为0.5ms
        ET0=1;                  // 打开定时器0的中断
        TR0=1;                  // 打开定时器0
        EA=1;                   // 开总中断
}
// 定时器中断0
void sg90_timer_irq() interrupt 1
{
        TR0=0;
        TH0 = 0XFE;
        TL0 = 0X33;       //重新赋计数初值为0.5ms
        if(count <= PWM_count){
                SG_PWM=1;
        }
        else{
                SG_PWM=0;
        }
        count++;
        if(count>=40){
                count=0;
                sg90_angle++;
        }
        TR0=1;
}
void sg90_run(void){
        if(sg90_angle==16){
                PWM_count=1;
        }
        if(sg90_angle==32){
                PWM_count=3;
                sg90_angle=0;
        }
}



main.c
#include "dc_motor_sg90_utils.h"

void main()
{
          sg90_timer_Init();
          while(1){
              sg90_run();
          }
}


代码解读
本文代码开源地址:
https://gitee.com/xundh/learn51
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/xundh/article/details/137590912

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

20

帖子

0

粉丝