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