由于麥克納姆輪的特殊性,每個輪子都需要一個電機進行獨立控制,輪子的安裝順序為ABAB(注釋中順序為:B輪A輪D輪C輪),怎么安裝網上資料很多,驅動建議使用L298N四路驅動模塊,話不多說,直接上程式:
麥克納姆輪安裝方向
A輪 \\ ------ // B輪
\\ ------ //
------
------
------
// ------ \\
D輪 // ------ \\ C輪
//四驅底盤及四輪麥克納姆輪底盤
//硬體連接說明:
timer8 控制ABCD四個輪子的PWM
TIM8_CH1--PC7--A輪 //左前 ---- 電機驅動1-ENA
TIM8_CH2--PC6--B輪 //右前 ---- 電機驅動1-ENB
TIM8_CH3--PC8--C輪 //右后 ---- 電機驅動2-ENA
TIM8_CH4--PC9--D輪 //左后 ---- 電機驅動2-ENB
A輪:PC1 PC0 控制前后運動 PC1----IN2,PC0----IN1
B輪:PC3 PC2 控制前后運動 PC3----IN4,PC2----IN3
C輪:PC10,PC11控制前后運動 PC10 --- IN1,PC11---IN2
D輪:PC12,PD2控制前后運動 PC12 --- IN3,PD2 ---IN4
*********************************************************************************************************
*/
#include "motor.h"
//***************************配置電機驅動IO口***************************//
void MOTOR_GPIO_Init(void)
{
/*定義一個GPIO_InitTypeDef型別的結構體*/
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE); /*開啟GPIO的外設時鐘*/
GPIO_InitStructure.GPIO_Pin = MOTOR_A1 | MOTOR_A2 | MOTOR_B1 | MOTOR_B2 | MOTOR_C1 | MOTOR_C2 | MOTOR_D1; /*選擇要控制的GPIO引腳*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*設定引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*設定引腳速率為50MHz */
GPIO_Init(MOTOR_PORT, &GPIO_InitStructure); /*呼叫庫函式,初始化GPIO*/
RCC_APB2PeriphClockCmd( MOTOR_CLK2, ENABLE); /*開啟GPIO的外設時鐘*/
GPIO_InitStructure.GPIO_Pin = MOTOR_D2; /*選擇要控制的GPIO引腳*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*設定引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*設定引腳速率為50MHz */
GPIO_Init(MOTOR_PORT2, &GPIO_InitStructure); /*呼叫庫函式,初始化GPIO*/
}
//左前A電機
void MOTOR_A(char state)
{
if(state == GO)//左前電機前進
{
GPIO_SetBits(MOTOR_PORT,MOTOR_A2);
GPIO_ResetBits(MOTOR_PORT,MOTOR_A1);
}
if(state == BACK)//左前電機后退
{
GPIO_SetBits(MOTOR_PORT,MOTOR_A1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_A2);
}
if(state == STOP)//停轉
{
GPIO_ResetBits(MOTOR_PORT,MOTOR_A1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_A2);
}
}
//右前B電機
void MOTOR_B(char state)
{
if(state == GO)//右前電機前進
{
GPIO_SetBits(MOTOR_PORT,MOTOR_B1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_B2);
}
if(state == BACK)//右前電機后退
{
GPIO_SetBits(MOTOR_PORT,MOTOR_B2);
GPIO_ResetBits(MOTOR_PORT,MOTOR_B1);
}
if(state == STOP)//停轉
{
GPIO_ResetBits(MOTOR_PORT,MOTOR_B1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_B2);
}
}
//左后C電機
void MOTOR_C(char state)
{
if(state == GO)//左后電機前進
{
GPIO_SetBits(MOTOR_PORT,MOTOR_C2);
GPIO_ResetBits(MOTOR_PORT,MOTOR_C1);
}
if(state == BACK)//左后電機后退
{
GPIO_SetBits(MOTOR_PORT,MOTOR_C1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_C2);
}
if(state == STOP)//停轉
{
GPIO_ResetBits(MOTOR_PORT,MOTOR_C1);
GPIO_ResetBits(MOTOR_PORT,MOTOR_C2);
}
}
//右后D電機
void MOTOR_D(char state)
{
if(state == GO)//右后電機前進
{
GPIO_SetBits(MOTOR_PORT2,MOTOR_D2);
GPIO_ResetBits(MOTOR_PORT,MOTOR_D1);
}
if(state == BACK)//右后電機后退
{
GPIO_SetBits(MOTOR_PORT,MOTOR_D1);
GPIO_ResetBits(MOTOR_PORT2,MOTOR_D2);
}
if(state == STOP)//停轉
{
GPIO_ResetBits(MOTOR_PORT,MOTOR_D1);
GPIO_ResetBits(MOTOR_PORT2,MOTOR_D2);
}
}
//***************************前進***************************//
//只要配置INx()的狀態就可以改變電機轉動方向
void Car_Go(void)
{
//左前電機 前 //右前電機 前
MOTOR_A(GO); MOTOR_B(GO);
//左后電機 前 //右后電機 前
MOTOR_D(GO); MOTOR_C(GO);
}
void Car_Back(void)
{
//左前電機 后 //右前電機 后
MOTOR_A(BACK); MOTOR_B(BACK);
//左后電機 后 //右后電機 后
MOTOR_D(BACK); MOTOR_C(BACK);
}
//***************************向左***************************//
void Car_Left(void)
{
//左前電機 后 //右前電機 前
MOTOR_A(BACK); MOTOR_B(GO);
//左后電機 前 //右后電機 后
MOTOR_D(GO); MOTOR_C(BACK);
}
//***************************向左前45度***************************//
void Car_LeftQ45(void)
{
//左前電機 停 //右前電機 前
MOTOR_A(STOP); MOTOR_B(GO);
//左后電機 前 //右后電機 停
MOTOR_D(GO); MOTOR_C(STOP);
}
//***************************向左后45度***************************//
void Car_LeftH45(void)
{
//左前電機 后 //右前電機 停
MOTOR_A(BACK); MOTOR_B(STOP);
//左后電機 停 //右后電機 后
MOTOR_D(STOP); MOTOR_C(BACK);
}
//***************************向左轉圈***************************//
void Car_Turn_Left(void)
{
//左前電機 后 //右前電機 前
MOTOR_A(BACK); MOTOR_B(GO);
//左后電機 后 //右后電機 前
MOTOR_D(BACK); MOTOR_C(GO);
}
//***************************向右***************************//
void Car_Right(void)
{
//左前電機 前 //右前電機 后
MOTOR_A(GO); MOTOR_B(BACK);
//左后電機 后 //右后電機 前
MOTOR_D(BACK); MOTOR_C(GO);
}
//***************************向右前45度***************************//
void Car_RightQ45(void)
{
//左前電機 前 //右前電機 停
MOTOR_A(GO); MOTOR_B(STOP);
//左后電機 停 //右后電機 前
MOTOR_D(STOP); MOTOR_C(GO);
}
//***************************向右后45度***************************//
void Car_RightH45(void)
{
//左前電機 停 //右前電機 后
MOTOR_A(STOP); MOTOR_B(BACK);
//左后電機 后 //右后電機 停
MOTOR_D(BACK); MOTOR_C(STOP);
}
//***************************向右轉圈***************************//
void Car_Turn_Right(void)
{
//左前電機 前 //右前電機 后
MOTOR_A(GO); MOTOR_B(BACK);
//左后電機 前 //右后電機 后
MOTOR_D(GO); MOTOR_C(BACK);
}
//***************************停車***************************//
void Car_Stop(void)
{
//左前電機 停 //右前電機 停
MOTOR_A(STOP); MOTOR_B(STOP);
//左后電機 停 //右后電機 停
MOTOR_D(STOP); MOTOR_C(STOP);
以上為幾種車子運動的函式構造,接下來是用四路循跡模塊完成循跡任務程式代碼:
#include "find.h"
#include "bsp_timer8.h"
#include "bsp_sys.h"
#include "delay.h"
//循跡IO初始化
//尋跡傳感器從右到左以此O1 O2 O3 O4
//硬體連接 O1-PA4,O2-PA5,O3-PA6,O4-PA7,
//要初始化為輸入模式
void Find_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//開啟GPIO時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6 | GPIO_Pin_7;//選擇IO埠
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置為上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//根據GPIO_InitStructure中指定的引數初始化外設GPIOD暫存器
}
//循跡、、循跡模塊 黑線輸出高電平1 白線低電平0
//小車最左端是O4----最右端是O1
//循跡路面:白色路面黑色引導線,即尋黑線,
//黑線 傳感器輸出1,白線輸出0
void Find(void)
{
//全是白線,前進
if((Find_O4 == 0)&&(Find_O3 == 0)&&(Find_O2 == 0)&&(Find_O1 == 0))// 白線,前進
{
Car_Go();
}
O2在黑線 右邊有黑線 小車偏左
//應向右轉調整到前進方向 ,即左輪加速右輪減速
if((Find_O4 == 0)&&(Find_O3 == 0)&&(Find_O2 == 1)&&(Find_O1 == 0))// O2尋到黑線
{
Car_Turn_Right();
}
O2在黑線 O1黑線 右邊有黑線 小車偏偏左
//應向右轉調整到前進方向 ,即左輪加速右輪減速
if((Find_O4 == 0)&&(Find_O3 == 0)&&(Find_O2 == 1)&&(Find_O1 == 1))// O2 O1尋到黑線
{
Car_Turn_Right();
}
O1在黑線 右邊有黑線 小車偏偏偏左
//應向右轉調整到前進方向 ,即左輪加速右輪減速
if((Find_O4 == 0)&&(Find_O3 == 0)&&(Find_O2 == 0)&&(Find_O1 == 1))// O1尋到黑線
{
Car_Turn_Right();
}
O3在黑線 左邊邊有黑線 小車偏右
//應向左轉調整到前進方向 ,即右輪加速左輪減速
if((Find_O4 == 0)&&(Find_O3 == 1)&&(Find_O2 == 0)&&(Find_O1 == 0))// O3尋到黑線
{
Car_Turn_Left();
}
O3,O4在黑線 左邊邊有黑線 小車偏偏右
//應向左轉調整到前進方向 ,即右輪加速左輪減速
if((Find_O4 == 1)&&(Find_O3 == 1)&&(Find_O2 == 0)&&(Find_O1 == 0))// O3 O4尋到黑線
{
Car_Turn_Left();
}
O4在黑線 左邊邊有黑線 小車偏偏偏右
//應向左轉調整到前進方向 ,即右輪加速左輪減速
if((Find_O4 == 1)&&(Find_O3 == 0)&&(Find_O2 == 0)&&(Find_O1 == 0))// O4尋到黑線
{
Car_Turn_Left();
}
//停車
if((Find_O4 == 1)&&(Find_O3 == 1)&&(Find_O2 == 1)&&(Find_O1 == 1))// 所以傳感器都在黑線
{
Car_Stop();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/171876.html
標籤:其他
