一、四线双极性电机控制
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)输入/输出逻辑表
波形:
第二通道与此类似 。
由于输出可以反相,可以控制电机正转或反转。
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电子制作、机器人技术和模型制作中。它的主要特性和参数的简要介绍:
结构与尺寸:
尺寸小巧,规格约为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,
3. 控制信号
调整信号线的PWM,就可以让SG90实现各个角度转动。
180度舵机控制参数:
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
|