本文主要是介绍51单片机学习笔记17 4线双极性马达和SG90舵机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
51单片机学习笔记17 4线双极性马达和SG90舵机
- 一、四线双极性电机控制
- 1. 四线双极性电机工作方式介绍
- (1)工作原理
- (2)驱动方式
- (3)极性区分
- (4)驱动方式
- 2. TC1508S芯片介绍
- (1)主要特性
- (2)引脚
- (3)输入/输出逻辑表
- 3. 模块电路图
- 4. 代码实现
- dc_motor_4_wire_utils.c
- main.c
- 二、SG90舵机控制
- 1. SG90简介
- 2. 硬件连接
- 3. 控制信号
- 4. 代码示例
- dc_motor_sg90_utils.c
- main.c
一、四线双极性电机控制
1. 四线双极性电机工作方式介绍
四线双极性电机通常用于驱动一些需要高效率和可靠性的应用。它的定子通常包含固定的线圈,而转子则是可以旋转的部分,通常是通过磁场与定子相互作用来产生转动力。
(1)工作原理
四线双极性电机的工作原理基于电流和磁场之间的相互作用。当电流通过定子线圈时,产生的磁场会与转子上的磁场相互作用,导致转子产生旋转运动。
(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)引脚
- INA、INB 第一通道输入
- OUTA、OUTB 第一通道输出
- INC、IND 第二通道输入
- OUTC、OUTD 第二通道输出
- 几个GND 连地
- VDD 连5V
(3)输入/输出逻辑表
INA | INB | OUTA | OUTB | 运动方式 |
---|---|---|---|---|
L | L | Hi-Z | Hi-Z | 待命状态 |
H | L | H | L | 前进 |
L | H | L | H | 后退 |
H | H | L | L | 刹车 |
波形:
第二通道与此类似 。
由于输出可以反相,可以控制电机正转或反转。
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-Aswitch(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;elsedir=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,
颜色 | 引脚 |
---|---|
红 色 | VCC |
棕色 | GND |
橙色 | 信号线 |
3. 控制信号
调整信号线的PWM,就可以让SG90实现各个角度转动。
180度舵机控制参数:
角度 (°) | 脉冲周期 (ms) | 占空比 (%) | 脉冲高电平时间 (ms) |
---|---|---|---|
0 | 20 | 2.5 | 0.5 |
45 | 20 | 5.0 | 1 |
90 | 20 | 7.5 | 1.5 |
135 | 20 | 10 | 2 |
180 | 20 | 12.5 | 2.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定时方式1TH0 = 0Xfe;TL0 = 0X33; // 计数初值设置为0.5msET0=1; // 打开定时器0的中断TR0=1; // 打开定时器0EA=1; // 开总中断
}
// 定时器中断0
void sg90_timer_irq() interrupt 1
{TR0=0;TH0 = 0XFE;TL0 = 0X33; //重新赋计数初值为0.5msif(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
这篇关于51单片机学习笔记17 4线双极性马达和SG90舵机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!