红外循迹小车怎么只有一边轮子动,请教一下这个代码有问题吗

#include "sys.h"
#include "delay.h"

#define EN1 PAout(2) //L293D控制管脚定义
#define IN1 PAout(3) //L293D控制管脚定义
#define IN2 PAout(4) //L293D控制管脚定义
#define EN2 PAout(7) //L293D控制管脚定义
#define IN3 PAout(6) //L293D控制管脚定义
#define IN4 PAout(5) //L293D控制管脚定义

#define BEEP PBout(5) //蜂鸣器控制管脚定义

#define KEY1 PAin(8) //功能按键对应的管脚

#define XJ_LEFT PAin(13) //左边循迹信号
#define XJ_RIGHT PAin(14) //右边循迹信号

u8 pwmval_left = 0; //左电机调速变量
u8 pwmval_right = 0; //右电机调速变量

u8 pwmval_left_init = 6; //左电机速度值
u8 pwmval_right_init = 6; //右电机速度值

u8 right_pwm = 1; //左电机调速开关
u8 left_pwm = 1; //右电机调速开关

void Motor_Init(void); //电机接口初始化
void forward(void); //小车前进控制函数
void back(void); //小车后退控制函数
void left_turn(void); //向右转
void stop(void); //向左转
void right_turn(void); //停车
void circle_left(void); //原地向左转圈
void circle_right(void); //原地向右转圈
void left_moto(void); //左电机调速函数
void right_moto(void); //右电机调速函数
void Timerx_Init(u16 arr,u16 psc); //定时器初始化函数
void Beep_Init(void); //蜂鸣器接口初始化
void Key_Init(void); //按键接口初始化函数
void Key_Scan(void); //按键1扫描函数
void Xj_Init(void); //循迹信号接口初始化函数
/***********************************************************
实验功能
智能小车按键循迹实验,智能小车上电后,按下开发板启动按键(靠
近电源开关那个)小车开始循迹运动。要达到好的实验效果请仔细调
循迹灵敏度。

接线说明:
电机驱动线:
开发板的PA2接小车底盘的M6
开发板的PA3接小车底盘的M5
开发板的PA4接小车底盘的M4
开发板的PA5接小车底盘的M3
开发板的PA6接小车底盘的M2
开发板的PA7接小车底盘的M1

电源线:
开发板的5V接小车底盘的5V
开发板的GND接小车底盘的GND

循迹信号线:
开发板的PA13接小车底盘的H1
开发板的PA14接小车底盘的H2
***********************************************************/
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
Motor_Init(); //初始化与电机连接的硬件接口
Timerx_Init(9,7199); //10Khz的计数频率,计数到9为1ms
Beep_Init(); //蜂鸣器接口初始化
Key_Init();
Xj_Init();

Key_Scan(); //按键扫描

while(1)
{
if((XJ_LEFT==0)&&(XJ_RIGHT==0)) //两边都没有感应到黑线
{
forward(); //前进
}
else if((XJ_LEFT==1)&&(XJ_RIGHT==1)) //两边都感应到黑线(这种情况基本不会出现,主要是容错处理)
{
forward(); //前进
}
else
{
if((XJ_LEFT==1)&&(XJ_RIGHT==0)) //右边感应到黑线
{
delay_ms(3);
if((XJ_LEFT==1)&&(XJ_RIGHT == 0))
{
left_turn(); //左转
}
}
if((XJ_RIGHT==1)&&(XJ_LEFT==0)) //左边感应到黑线
{
delay_ms(3);
if((XJ_RIGHT==1)&&(XJ_LEFT==0))
{
right_turn(); //右转
}
}
}
}
}

void Beep_Init(void) //蜂鸣器接口初始化
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟

GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000; //PB5推挽输出
GPIOB->ODR|=1<<5; //PB5输出高
}

void Xj_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFF0FFFFF;
GPIOA->CRH|=0X00800000; //PA13上拉输入
GPIOA->ODR|=1<<13; //PA13上拉

GPIOA->CRH&=0XF0FFFFFF;
GPIOA->CRH|=0X08000000; //PA14上拉输入
GPIOA->ODR|=1<<14; //PA14上拉
}

void Key_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000008; //PA8上拉输入
GPIOA->ODR|=1<<8; //PA8上拉
}

void Key_Scan(void) //按键扫描函数
{
LOOP:if(KEY1==0) //第一次判断按键是否按下
{
delay_ms(5);
if(KEY1==0) //第二次判断按键是否按下
{
BEEP = 0; //蜂鸣器响
while(KEY1 == 0); //等待按键松开
BEEP = 1; //蜂鸣器不响
}
else
{
goto LOOP; //如果第一次判断时按键没有按下则重新扫描
}
}
else
{
goto LOOP; //如果第二次判断时按键没有按下则重新扫描
}
}

void Motor_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA接口时钟

GPIOA->CRL&=0XFFFFF0FF;
GPIOA->CRL|=0X00000300; //PA2推挽输出
GPIOA->ODR|=1<<2; //PA2输出高电平

GPIOA->CRL&=0XFFFF0FFF;
GPIOA->CRL|=0X00003000; //PA3推挽输出
GPIOA->ODR|=1<<3; //PA3输出高电平

GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00030000; //PA4推挽输出
GPIOA->ODR|=1<<4; //PA4输出高电平

GPIOA->CRL&=0XFF0FFFFF;
GPIOA->CRL|=0X00300000; //PA5推挽输出
GPIOA->ODR|=1<<5; //PA5输出高电平

GPIOA->CRL&=0XF0FFFFFF;
GPIOA->CRL|=0X03000000; //PA6推挽输出
GPIOA->ODR|=1<<6; //PA6输出高电平

GPIOA->CRL&=0X0FFFFFFF;
GPIOA->CRL|=0X30000000; //PA7推挽输出
GPIOA->ODR|=1<<7; //PA7输出高电平
}

void forward(void) //小车前进控制函数
{
IN1 = 1;
IN2 = 0;

IN3 = 1;
IN4 = 0;
}

void back(void) //小车后退控制函数
{
IN1 = 0;
IN2 = 1;

IN3 = 0;
IN4 = 1;
}

void left_turn(void) //向左转
{
IN1 = 1;
IN2 = 0;

IN3 = 0;
IN4 = 0;
}

void right_turn(void) //向右转
{
IN1 = 0;
IN2 = 0;

IN3 = 1;
IN4 = 0;
}

void stop(void) //停车
{
IN1 = 0;
IN2 = 0;

IN3 = 0;
IN4 = 0;
}

void circle_left(void) //原地向左转圈
{
IN1 = 1;
IN2 = 0;

IN3 = 0;
IN4 = 1;
}

void circle_right(void) //原地向右转圈
{
IN1 = 0;
IN2 = 1;

IN3 = 1;
IN4 = 0;
}

void left_moto(void) //左电机调速函数
{
if(left_pwm)
{
if(pwmval_left <= pwmval_left_init)
{
EN1 = 1;
}
else
{
EN1 = 0;
}
if(pwmval_left >= 20)
{
pwmval_left = 0;
}
}
else
{
EN1 = 0;
}
}

void right_moto(void) //右电机调速函数
{
if(right_pwm)
{
if(pwmval_right <= pwmval_right_init)
{
EN2 = 1;
}
else if(pwmval_right > pwmval_right_init)
{
EN2 = 0;
}
if(pwmval_right >= 20)
{
pwmval_right = 0;
}
}
else
{
EN2 = 0;
}
}

//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001) //溢出中断
{
pwmval_left = pwmval_left + 1;
pwmval_right = pwmval_right + 1;

left_moto();
right_moto();
}
TIM3->SR&=~(1<<0); //清除中断标志位
}

//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0; //允许更新中断
TIM3->CR1|=0x01; //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2); //抢占1,子优先级3,组2
}