嵐山網(wǎng)站建設(shè)報(bào)價(jià)老鐵外鏈
文章目錄
- 前言
- 一、模塊參數(shù)
- 二、接口說(shuō)明
- 三、準(zhǔn)備工作
- 四、直流電機(jī)驅(qū)動(dòng)
- 引腳接線
- 效果展示
- 五、兩相四線步進(jìn)電機(jī)驅(qū)動(dòng)
- 步進(jìn)電機(jī)相關(guān)概念
- 拍數(shù)驅(qū)動(dòng)時(shí)序
- 引腳接線
- 效果展示
- 六、參考示例
前言
??L298N 是一種常見(jiàn)的雙 H 橋電機(jī)驅(qū)動(dòng)模塊,廣泛用于驅(qū)動(dòng)直流電機(jī)和步進(jìn)電機(jī)。它基于 ST 的 L298N 芯片,具有高電流承載能力和靈活的控制模式,適合機(jī)器人、自動(dòng)化設(shè)備等領(lǐng)域。
一、模塊參數(shù)
1、驅(qū)動(dòng)芯片:L298N 雙 H 橋直流電機(jī)驅(qū)動(dòng)芯片
2、驅(qū)動(dòng)電壓 Vs:+5V~+35V ; 如需要板內(nèi)取電,則供電范圍Vs:+7V~+35V
3、驅(qū)動(dòng)電流Io:2A(MAX)
4、邏輯電壓Vss:+5V~+7V(可板內(nèi)取電+5V)
5、邏輯電流:0~36mA
6、控制信號(hào)輸入電壓范圍:
??低電平:-0.3V≤Vin≤1.5V
??高電平:2.3V≤Vin≤Vss
7、使能信號(hào)輸入電壓范圍:
??低電平:-0.3≤Vin≤1.5V(控制信號(hào)無(wú)效)
??高電平:2.3V≤Vin≤Vss(控制信號(hào)有效)
8、最大功耗:20W(溫度 T=75℃時(shí))
9、存儲(chǔ)溫度:-25℃~+130℃
二、接口說(shuō)明
關(guān)于模塊供電說(shuō)明:
??供電一:板上除了L298N外,還有7805的5V穩(wěn)壓芯片,當(dāng)供電為5V到7V區(qū)間的時(shí)候模塊內(nèi)置的7805芯片不能正常工作的。所以供電端接5-7V外部電源只負(fù)責(zé)給電機(jī)供電,然后邏輯端外接5V邏輯電源。
??供電二:當(dāng)供電電壓為7-12V時(shí),插上板載5V使能的跳線帽,此時(shí)的邏輯端不但不用外接5V電源,還可以輸出5V為單片機(jī)進(jìn)行供電。
??供電三:當(dāng)供電在大于12V的時(shí)候,此時(shí)必須斷開(kāi)板載5V使能跳線帽,再在邏輯端子接入5V電源給芯片供電。如果不斷開(kāi)板載使能跳線帽的話,可能會(huì)損壞內(nèi)置的7805的穩(wěn)壓芯片。
??注意:板子沒(méi)有升降壓功能,供電范圍要根據(jù)接的電機(jī)選擇,避免供電過(guò)低過(guò)高帶不動(dòng)電機(jī)或燒壞電機(jī),如驅(qū)動(dòng)12V的電機(jī),則接12V的電源。
三、準(zhǔn)備工作
??STM32F103最小系統(tǒng)板、L298N驅(qū)動(dòng)模塊、2個(gè)直流電機(jī)或1個(gè)兩相四線步進(jìn)電機(jī)、EC11旋轉(zhuǎn)編碼器模塊以及供電電源。
四、直流電機(jī)驅(qū)動(dòng)
??該驅(qū)動(dòng)板可驅(qū)動(dòng) 2 路直流電機(jī),使能端 ENA、ENB 為高電平時(shí)有效,控制方式及直流電機(jī)狀態(tài)表如下所示:
??若要對(duì)直流電機(jī)進(jìn)行 PWM 調(diào)速,需設(shè)置 IN1 和 IN2,確定電機(jī)的轉(zhuǎn)動(dòng)方向,然后對(duì)使能端輸出 PWM 脈沖,即可實(shí)現(xiàn)調(diào)速。注意當(dāng)使能信號(hào)為 0 時(shí),電機(jī)處于自由停止?fàn)顟B(tài);當(dāng)使能信號(hào)為 1,且 IN1 和 IN2 為 00 或 11 時(shí),電機(jī)處于制動(dòng)狀態(tài),阻止電機(jī)轉(zhuǎn)動(dòng)。IN1和IN2控制輸出A,IN3和IN4控制輸出B。
引腳接線
L298N | STM32F103 / 電源 / 直流電機(jī) |
---|---|
輸出A,B | 連接電機(jī)1,2 |
12V供電 | 電源正 |
供電GND | 電源負(fù) |
旋轉(zhuǎn)編碼器A,B,S | PB3,PB1,PB0 |
通道A,B使能 | 去掉跳線帽,使能A接PA6,使能B接PA7 ,PWM調(diào)速 |
IN1,IN2 | PA0,PA1 |
IN3,IN4 | PA2,PA3 |
效果展示
五、兩相四線步進(jìn)電機(jī)驅(qū)動(dòng)
步進(jìn)電機(jī)相關(guān)概念
??相數(shù)——步進(jìn)電機(jī)的N、S磁場(chǎng)的激磁線圈對(duì)數(shù),如兩相四線步進(jìn)電機(jī),就有兩對(duì)極N、S磁場(chǎng)的激磁線圈,四線A+、A-、B+、B-,A+A-,B+B-是連通的,在不知道四線哪兩兩線為一對(duì)激磁線圈,通過(guò)短接兩兩線有明顯阻力變化的則為一對(duì)線圈。
??拍數(shù)——轉(zhuǎn)子轉(zhuǎn)動(dòng)一周,定子繞組通電的次數(shù),以?xún)上嚯姍C(jī)為例,有兩相四拍運(yùn)行方式即(A+)—(B+)—(A-)—(B-),兩相八拍運(yùn)行方式(A+)—(A+B+)—(B+)–(B+A-)—(A-)—(A-B-)—(B-)–(B-A+),以此循環(huán)。
??步距角——步進(jìn)電機(jī)接收到一個(gè)脈沖信號(hào)后,驅(qū)動(dòng)電機(jī)按設(shè)定的方向轉(zhuǎn)動(dòng)的一個(gè)固定角度。如兩相四線步進(jìn)電機(jī)的基本步距角是1.8°,即一個(gè)脈沖走1.8°。
??同時(shí),為了減弱或消除步進(jìn)電機(jī)的低頻振動(dòng)開(kāi)發(fā)了細(xì)分驅(qū)動(dòng)技術(shù)。細(xì)分后電機(jī)運(yùn)行時(shí)的實(shí)際步距角是基本步距角的幾分之一,微步即1/4-step、1/8-step、1/16-step等。 比如,兩相步進(jìn)電機(jī)的基本步距角是1.8°,如果沒(méi)有細(xì)分,則是200個(gè)脈沖走一圈360°。細(xì)分是通過(guò)驅(qū)動(dòng)器靠精確控制電機(jī)的相電流所產(chǎn)生的,如果是10細(xì)分,則發(fā)一個(gè)脈沖電機(jī)走0.18°,即2000個(gè)脈沖走一圈360°,電機(jī)的精度能否達(dá)到或接近0.18°,還取決于細(xì)分驅(qū)動(dòng)器的細(xì)分電流控制精度等其它因素。
細(xì)分驅(qū)動(dòng) | 單圈步數(shù)=360°÷角度 |
---|---|
四拍(1細(xì)分) | 1.8°—— 單圈200步 |
八拍(2細(xì)分) | 0.9°—— 單圈400步 |
十六拍(4細(xì)分) | 0.45°—— 單圈800步 |
三十二拍(8細(xì)分) | 0.225°—— 單圈1600步 |
六十四拍(16細(xì)分) | 0.1125°—— 單圈3200步 |
拍數(shù)驅(qū)動(dòng)時(shí)序
??單4拍(整步)方式驅(qū)動(dòng)時(shí)序
??雙4拍(整步)方式驅(qū)動(dòng)時(shí)序
??電機(jī)轉(zhuǎn)動(dòng)方向如下所示,(A+)—(B+)—(A-)—(B-),以此循環(huán),
特性 | 單四拍 | 雙四拍 |
---|---|---|
通電相數(shù) | 每次一相 | 每次兩相 |
功耗 | 較低 | 較高 |
步進(jìn)角 | 一致 | 一致 |
力矩 | 較小 | 較大 |
定位穩(wěn)定性 | 一般 | 更高 |
??8拍(半步)方式驅(qū)動(dòng)時(shí)序
??電機(jī)轉(zhuǎn)動(dòng)方向如下所示,(A+)—(A+B+)—(B+)–(B+A-)—(A-)—(A-B-)—(B-)—(B-A+),以此循環(huán),
??反轉(zhuǎn)時(shí),控制時(shí)序倒過(guò)來(lái)控制就可實(shí)現(xiàn)反向轉(zhuǎn)動(dòng)。
引腳接線
L298N | STM32F103 / 電源 / 兩相四線電機(jī) |
---|---|
12V供電 | 電源正 |
供電GND | 電源負(fù) |
旋轉(zhuǎn)編碼器A,B,S | PB3,PB1,PB0 |
通道A,B使能 | 把跳線帽插回去 |
IN1,IN2 | PA0,PA1 |
IN3,IN4 | PA2,PA3 |
OUT1,OUT2 | A+,A- |
OUT3,OUT4 | B+,B- |
效果展示
六、參考示例
main.c
#include "stm32f10x.h" // Device header
#include "encoder.h"
#include "l298n.h"
#include "usart.h"
#include "timer.h"
#include "pwm.h"int32_t RxData;int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);usart_Init();L298N_Init();Encoder_Init();Timer_Inti();PWM_Init();while(1){ RxData =Encoder_Get();//直流電機(jī)控制正反轉(zhuǎn),調(diào)速TIM_SetCompare1(TIM3,RxData);if(Encoder_GetKey() == 0){Motor1_Zturn();Motor2_Zturn();}else{Motor1_Rturn();Motor2_Rturn();}//步進(jìn)電機(jī)控制正反轉(zhuǎn)
// if(Encoder_GetKey() == 0)
// {
// switch(RxData)
// {
// case 1:
// ZturndouControl_4();
// break;
// case 2:
// RturndouControl_4();
// break;
// }
// }else{
// switch(RxData)
// {
// case 1:
// ZturnControl_8();
// break;
// case 2:
// RturnControl_8();
// break;
// }
// }}
}
l298n.c
#include "l298n.h"
#include "delay.h"
#include "timer.h"void L298N_Init(void)
{//通過(guò)旋轉(zhuǎn)編碼器控制步進(jìn)電機(jī)正轉(zhuǎn),翻轉(zhuǎn),加減速,停止GPIO_InitTypeDef GPIO_InitStructurn;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructurn.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructurn.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructurn.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructurn);
}void Motor1_Stop(void) //電機(jī)1停止
{IN1(0);IN2(0);
}void Motor2_Stop(void) //電機(jī)2停止
{IN3(0);IN4(0);
}void ALL_Stop(void) //兩個(gè)電機(jī)全停止
{IN1(0);IN2(0);IN3(0);IN4(0);
}void Motor1_Zturn(void) //電機(jī)1正轉(zhuǎn)
{IN1(1);IN2(0);
}void Motor1_Rturn(void) //電機(jī)1反轉(zhuǎn)
{IN1(0);IN2(1);
}void Motor2_Zturn(void) //電機(jī)2正轉(zhuǎn)
{IN3(1);IN4(0);
}void Motor2_Rturn(void) //電機(jī)2反轉(zhuǎn)
{IN3(0);IN4(1);
}void Control_4(void) //單四拍
{if(Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}
}void ZturndouControl_4(void) //正雙四拍
{if(Timer_GetCounter()<2500){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}
}void RturndouControl_4(void) //反雙四拍
{if(Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<5000){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<7500){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<10000){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}
}void ZturnControl_8(void) //正八拍
{if(Timer_GetCounter()<1250){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>1250 && Timer_GetCounter()<2500){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<3750){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>3750 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<6250){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>6250 && Timer_GetCounter()<7500){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<8750){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>8750 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}
}void RturnControl_8(void) //反八拍
{if(Timer_GetCounter()<1250){IN1(1);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>1250 && Timer_GetCounter()<2500){IN1(0);IN2(0);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>2500 && Timer_GetCounter()<3750){IN1(0);IN2(1);IN3(0);IN4(1);delay_ms(10);}else if(Timer_GetCounter()>3750 && Timer_GetCounter()<5000){IN1(0);IN2(1);IN3(0);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>5000 && Timer_GetCounter()<6250){IN1(0);IN2(1);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>6250 && Timer_GetCounter()<7500){IN1(0);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>7500 && Timer_GetCounter()<8750){IN1(1);IN2(0);IN3(1);IN4(0);delay_ms(10);}else if(Timer_GetCounter()>8750 && Timer_GetCounter()<10000){IN1(1);IN2(0);IN3(0);IN4(0);delay_ms(10);}
}