一、四線雙極性電機控制
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-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,
顔色 | 引腳 |
紅 色 | 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