天天看點

51單片機學習筆記17 4線雙極性馬達和SG90舵機

作者:程式設計圈子

一、四線雙極性電機控制

1. 四線雙極性電機工作方式介紹

51單片機學習筆記17 4線雙極性馬達和SG90舵機

四線雙極性電機通常用于驅動一些需要高效率和可靠性的應用。它的定子通常包含固定的線圈,而轉子則是可以旋轉的部分,通常是通過磁場與定子互相作用來産生轉動力。

(1)工作原理

四線雙極性電機的工作原理基于電流和磁場之間的互相作用。當電流通過定子線圈時,産生的磁場會與轉子上的磁場互相作用,導緻轉子産生旋轉運動。

51單片機學習筆記17 4線雙極性馬達和SG90舵機

(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)引腳

51單片機學習筆記17 4線雙極性馬達和SG90舵機
  • 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 刹車

波形:

51單片機學習筆記17 4線雙極性馬達和SG90舵機

第二通道與此類似 。

由于輸出可以反相,可以控制電機正轉或反轉。

3. 子產品電路圖

本文示例是從網上直接購買的子產品元件,原理圖如下:

51單片機學習筆記17 4線雙極性馬達和SG90舵機

PCB示例:

51單片機學習筆記17 4線雙極性馬達和SG90舵機

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. 結構與尺寸:
  2. 尺寸小巧,規格約為21.5mm x 11.8mm x 22.7mm,重量僅為9克,适合在空間有限的應用場合中使用。
  3. 工作原理:
  4. 舵機作為一種位置伺服驅動器,通過接收外部控制器(如單片機、遙控器等)發出的PWM(脈寬調制)信号,依據脈沖寬度的變化來精确控制轉動的角度。
  5. 電氣規格:
  6. 工作電壓範圍為4.8V至6V,典型工作電壓為4.8V。
  7. 最大扭矩約為1.2至1.4公斤/厘米(在4.8V電壓下),意味着它能提供足夠的力量保持特定角度或者克服一定阻力。
  8. 控制信号周期通常為20毫秒,脈沖寬度在0.5ms至2.5ms之間變化,對應不同的旋轉角度,1.5ms時位于中心位置(約180度機械結構的一半)。
  9. 脈沖控制精度較高,可達2微秒級别。
  10. 位置等級為1024級,理論上可實作更精細的角度定位。
  11. 性能名額:
  12. 無負載情況下,SG90舵機在4.8V電壓下大約能在0.12秒内完成60度的旋轉,即每度大約需要0.002秒。
  13. 使用溫度範圍較寬,從-30攝氏度到+60攝氏度。
  14. 設有死區設定,防止舵機在接近目标角度時過度抖動,提高了穩定性。
  15. 類型:
  16. 根據内部結構材料的不同,SG90舵機有塑膠齒輪和金屬齒輪兩種版本,金屬齒輪版通常具有更高的耐用性和承載能力。

2. 硬體連接配接

51單片機的I/O端口可以直接連接配接SG90,

顔色 引腳
紅 色 VCC
棕色 GND
橙色 信号線

3. 控制信号

調整信号線的PWM,就可以讓SG90實作各個角度轉動。

180度舵機控制參數:

角度 (°) 脈沖周期 (ms) 占空比 (%) 脈沖高電平時間 (ms)
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定時方式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

繼續閱讀