51单片机学习笔记17 4线双极性马达和SG90舵机

一、四线双极性电机控制

1. 四线双极性电机工作方式介绍

在这里插入图片描述

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

(1)工作原理

四线双极性电机的工作原理基于电流和磁场之间的相互作用。当电流通过定子线圈时,产生的磁场会与转子上的磁场相互作用,导致转子产生旋转运动。
在这里插入图片描述

(2)驱动方式

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

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

(3)极性区分

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

  • 四线双极性步进电机的线圈是分别独立连接的,每个线圈只与一个控制线相连。
  • 四线双极性步进电机的步进角度通常较大,因为它们只有两个线圈,步进角度受限于线圈的布置方式。

(4)驱动方式

四线双极性步进电机只需要使用两个控制信号,通过改变信号的极性来控制线圈的激活,从而实现步进运动。

2. TC1508S芯片介绍

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

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

(1)主要特性

  1. 双通道设计:能够独立驱动两个直流电机或一个步进电机的两个绕组。

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

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

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

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

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

(2)引脚

在这里插入图片描述

  • INA、INB 第一通道输入
  • OUTA、OUTB 第一通道输出
  • INC、IND 第二通道输入
  • OUTC、OUTD 第二通道输出
  • 几个GND 连地
  • VDD 连5V

(3)输入/输出逻辑表

INAINBOUTAOUTB运动方式
LLHi-ZHi-Z待命状态
HLHL前进
LHLH后退
HHLL刹车

波形:
在这里插入图片描述
第二通道与此类似 。
由于输出可以反相,可以控制电机正转或反转。

3. 模块电路图

本文示例是从网上直接购买的模块组件,原理图如下:
在这里插入图片描述
PCB示例:
在这里插入图片描述

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电子制作、机器人技术和模型制作中。它的主要特性和参数的简要介绍:

  1. 结构与尺寸

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

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

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

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

    • 根据内部结构材料的不同,SG90舵机有塑料齿轮和金属齿轮两种版本,金属齿轮版通常具有更高的耐用性和承载能力。

2. 硬件连接

51单片机的I/O端口可以直接连接SG90,

颜色引脚
红 色VCC
棕色GND
橙色信号线

3. 控制信号

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

180度舵机控制参数:

角度 (°)脉冲周期 (ms)占空比 (%)脉冲高电平时间 (ms)
0202.50.5
45205.01
90207.51.5
13520102
1802012.52.5

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿来这样1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值