激光模塊電路圖如下:
通過4個IO口去選通8路激光驅動,每一個狀態只能驅動一個激光;2路激光接收器,在接收到激光發射光后會把收到發射信號的那一路檢測IO腳拉低;
激光巡線模塊代碼思路:將4個選通IO口的狀態跟8路激光一一對應起來,在每一顆激光驅動的同時檢測激光接收模塊的狀態,如果對應驅動的激光能使激光接收器輸出低電平(低電平收到激光反射信號,高電平沒有收到激光反射信號),就將激光對應的位號置為0;通過分析每次8個激光的掃描結果,輸出對應激光巡線的位置;輸出位置標定為5檔,Left_L、Left_S、Middle、Right_S、Right_L;
/******************************************************************************
* FILENAME : Bsp_Laser.c
* PURPOSE : Laser應用函數接口
* Author: 電筆小新 Created on: 2025年9月7日
******************************************************************************/
# "User_Include.h"
# "Bsp_Laser.h"
//======================================================
// * Variables & Function_Defines
//======================================================
u8 Laser_Result=0;
// LASER_TX1 引腳宏定義
LASER_TX1_H (GpioDataRegs.GPASET.bit.GPIO11=1) /* LASER_TX1 = 1 */
LASER_TX1_L (GpioDataRegs.GPACLEAR.bit.GPIO11=1) /* LASER_TX1 = 0 */
// LASER_TX2 引腳宏定義
LASER_TX2_H (GpioDataRegs.GPASET.bit.GPIO5=1) /* LASER_TX2 = 1 */
LASER_TX2_L (GpioDataRegs.GPACLEAR.bit.GPIO5=1) /* LASER_TX2 = 0 */
// LASER_TX3 引腳宏定義
LASER_TX3_H (GpioDataRegs.GPASET.bit.GPIO4=1) /* LASER_TX3 = 1 */
LASER_TX3_L (GpioDataRegs.GPACLEAR.bit.GPIO4=1) /* LASER_TX3 = 0 */
// LASER_TX4 引腳宏定義
LASER_TX4_H (GpioDataRegs.GPBSET.bit.GPIO40=1) /* LASER_TX4 = 1 */
#LASER_TX4_L (GpioDataRegs.GPBCLEAR.bit.GPIO40=1) /* LASER_TX4 = 0 */
// LASER_RX1 引腳宏定義
# LASER_RX1() (GpioDataRegs.GPADAT.bit.GPIO10) /* 讀LASER_RX1狀態 */
// LASER_RX2 引腳宏定義
# LASER_RX2() (GpioDataRegs.GPBDAT.bit.GPIO34) /* 讀LASER_RX2狀態 */
//LASER掃描狀態定義
#deLeft_L 3
#d Left_S 4
#d Middle 5
#d Right_S 6
#deRight_L 7
//======================================================
// * Function : Laser_Init()
// * Purpose :
// * Parameters : Null
// * Return : Null
//======================================================
void Laser_Init(void)
{
// LASER_TX1 初始化
GpioCtrlRegs.GPAMUX1.bit.GPIO11=0; //IO口
GpioCtrlRegs.GPADIR.bit.GPIO11=1; //端口設置輸出
GpioCtrlRegs.GPAPUD.bit.GPIO11=1; //上拉
// LASER_TX2 初始化
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0; //IO口
GpioCtrlRegs.GPADIR.bit.GPIO5=1; //端口設置輸出
GpioCtrlRegs.GPAPUD.bit.GPIO5=1; //上拉
// LASER_TX3 初始化
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0; //IO口
GpioCtrlRegs.GPADIR.bit.GPIO4=1; //端口設置輸出
GpioCtrlRegs.GPAPUD.bit.GPIO4=1; //上拉
// LASER_TX4 初始化
GpioCtrlRegs.GPBMUX1.bit.GPIO40=0; //IO口
GpioCtrlRegs.GPBDIR.bit.GPIO40=1; //端口設置輸出
GpioCtrlRegs.GPBPUD.bit.GPIO40=1; //上拉
// LASER_RX1 初始化
GpioCtrlRegs.GPAMUX1.bit.GPIO10=0; //IO口
GpioCtrlRegs.GPADIR.bit.GPIO10=0; //端口設置輸入
GpioCtrlRegs.GPAPUD.bit.GPIO10=1; //上拉
// LASER_RX2 初始化
GpioCtrlRegs.GPBMUX1.bit.GPIO34=0; //IO口
GpioCtrlRegs.GPBDIR.bit.GPIO34=1; //端口設置輸入
GpioCtrlRegs.GPBPUD.bit.GPIO34=1; //上拉
}
//======================================================
// * Function : Laser_Scan()
// * Purpose :
// * Parameters : Null
// * Return : Null
//======================================================
u8 Laser_Scan(void)
{
u8 i;
u8 Laser_Temp=0;
for (i = 0; i < 8; i++)
{
switch(i)
{
Cas e 0: LASER_TX1_L;LASER_TX2_L;LASER_TX3_L;LASER_TX4_H;break; //點亮第1個激光
case 1: LASER_TX1_H;LASER_TX2_L;LASER_TX3_L;LASER_TX4_H;break; //點亮第2個激光
case 2: LASER_TX1_L;LASER_TX2_H;LASER_TX3_L;LASER_TX4_H;break; //點亮第3個激光
case 3: LASER_TX1_H;LASER_TX2_H;LASER_TX3_L;LASER_TX4_H;break; //點亮第4個激光
case 4: LASER_TX1_L;LASER_TX2_L;LASER_TX3_H;LASER_TX4_H;break; //點亮第5個激光
case 5: LASER_TX1_H;LASER_TX2_L;LASER_TX3_H;LASER_TX4_H;break; //點亮第6個激光
case 6: LASER_TX1_L;LASER_TX2_H;LASER_TX3_H;LASER_TX4_H;break; //點亮第7個激光
case 7: LASER_TX1_H;LASER_TX2_H;LASER_TX3_H;LASER_TX4_H;break; //點亮第8個激光
default: LASER_TX1_L;LASER_TX2_L;LASER_TX3_L;LASER_TX4_L;break;
}
DELAY_US(100);
if((LASER_RX1())||( LASER_RX2())) //接收狀態檢測
{
Laser_Temp |= (1<