fangjinghang 2023-11-24 21:45 采纳率: 75%
浏览 6
已结题

基于51单片机的寻迹小车问题

这个小车为什么只能朝一边转?


void turnright()
{
    mot1=0;
  mot2=15;
    
    IN11=0;
    IN12=0;
    
    IN13=0;
    IN14=1;
    
    IN21=0;
    IN22=0;
    
    IN23=1;
    IN24=0;
}

void turnleft()
{
    mot1=15;
  mot2=0;
    
    IN11=0;
    IN12=1;
    
    IN13=0;
    IN14=0;
    
    IN21=1;
    IN22=0;
    
    IN23=0;
    IN24=0;
}

void PWM_right_turn()
{
    unsigned char t=0;
    t++;
    t%=100;
    if(t<mot2)
    {
        ENB1=1;ENB2=1;
    }
    else
    {
        ENB1=0;ENB2=0;
    }
}

void PWM_left_turn()
{
    unsigned char t=0;
    t++;
    t%=100;
    if(t<mot1)
    {
        ENA1=1;ENA2=1;
    }
    else
    {
        ENA1=0;ENA2=0;
    }
}
#include <REGX52.H>
#include "Delay.h"
#include "Time0.h"
#include "Trolley.h"

unsigned char counter,compare;

void main()
{
    Timer0Init();
    compare=50;
    turnright();
    while(1)
    {
        
    }
}

void Timer0_Routine() interrupt 1
{

    TL0 = 0xA4;        
    TH0 = 0xFF;    
    PWM_right_turn();
    PWM_left_turn();
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-25 08:36
    关注

    【以下回答由 GPT 生成】

    首先,通过代码可以看到,小车只能朝一个方向转是因为在turnright()turnleft()函数中,只有一个电机被启动了,另一个没有被启动。 下面我会分析整个代码并给出解决方案。

    在你提供的代码中,你使用了一些函数和引入了一些头文件,其中PWM_right_turn()PWM_left_turn()函数控制电机的转动速度,Timer0_Routine()函数是定时器中断处理函数。

    首先,我会解释一下51单片机的引脚使用情况: - mot1和mot2是控制小车电机转速的两个变量,可能是PWM输出占空比的设置; - ENA1和ENA2分别是电机1的使能引脚,ENA1控制电机1的正转,ENA2控制电机1的反转; - ENB1和ENB2分别是电机2的使能引脚,ENB1控制电机2的正转,ENB2控制电机2的反转; - IN11、IN12、IN13、IN14是电机1的输入引脚,具体每个引脚的控制意义要看具体接线方式; - IN21、IN22、IN23、IN24是电机2的输入引脚,具体每个引脚的控制意义要看具体接线方式;

    根据代码和引脚的定义,可以看到,turnright()函数中只有电机2被启动,电机1没有被启动。同理,turnleft()函数中只有电机1被启动,电机2没有被启动。这就是小车只能朝一个方向转的原因。

    为了解决这个问题,你需要在两个函数中启动两个电机。

    以下是修正的代码:

    void turnright()
    {
        mot1 = 15;
        mot2 = 15;
    
        IN11 = 0;
        IN12 = 0;
        IN13 = 0;
        IN14 = 1;
    
        IN21 = 0;
        IN22 = 0;
        IN23 = 0;
        IN24 = 1;
    }
    
    void turnleft()
    {
        mot1 = 15;
        mot2 = 15;
    
        IN11 = 0;
        IN12 = 1;
        IN13 = 0;
        IN14 = 0;
    
        IN21 = 0;
        IN22 = 1;
        IN23 = 0;
        IN24 = 0;
    }
    

    通过修改以上两个函数,你的小车应该可以同时启动两个电机了。接下来,你可以在main()函数中调用这两个函数来测试。

    另外,你使用了定时器中断来控制占空比,这是很常见的做法,但是在你提供的代码中,timer0init()函数和Timer0_Routine()函数没有给出,所以我无法判断它们的具体实现。如果你无法提供这些代码,你需要确保你的定时器中断的配置和初始化正确。

    希望这个解答对你有帮助!如果还有其他问题,请随时告诉我。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 已采纳回答 11月26日
  • 修改了问题 11月24日
  • 创建了问题 11月24日

悬赏问题

  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容