基于stm32的智能小车修改运行时长问题

智能小车的main函数相关部分如下:

#include "stm32f10x.h"
#include "motor.h"
#include "interface.h"

//全局变量定义
uint16_t speed_count=0;//占空比计时器,50次一周期
int8_t left_speed_duty=MIN_SPEED_DUTY;
int8_t right_speed_duty=MIN_SPEED_DUTY;

uint8_t tick_1s = 0;//1s计数器
uint8_t tick_100ms = 0;//100ms计数器
uint8_t tick_1ms = 0;//1ms计数器

//uint8_t continue_time=0;

void GPIO_Conf(void);
void RCC_Conf(void);
void TIM2_Init(void);
void MotorInit(void);

int main(void)
{
//    uint16_t i,j;
    
    RCC_Conf();
    GPIO_Conf();
    TIM2_Init();
    MotorInit();
//    for(i=0;i<10000;i++)
//        for(j=0;j<1000;j++);
    while(1)
    {
        if(tick_1s < 30)
        {
            CarGo();    //全速3s
            //CarBack();    // 全速2s
            //CarRight();    // 半速右转1s
        }
        else
            CarStop();      // 停止
    }
}

其中motor.c函数中相关需要修改部分如下:

//Ïòǰ
void CarGo(void)
{
    left_speed_duty=MAX_SPEED_DUTY;
    right_speed_duty=MAX_SPEED_DUTY;
}

//向前
void CarLeft(void)
{
    left_speed_duty=-MID_SPEED_DUTY;
    right_speed_duty=MID_SPEED_DUTY;
}

//向左
void CarRight(void)
{
    left_speed_duty=MID_SPEED_DUTY;
    right_speed_duty=-MID_SPEED_DUTY;
}

//向右
void CarStop(void)
{
    left_speed_duty=MIN_SPEED_DUTY;
    right_speed_duty=MIN_SPEED_DUTY;
}

//后退
void CarBack(void)
{
    left_speed_duty=-MAX_SPEED_DUTY;
    right_speed_duty=-MAX_SPEED_DUTY;
}

void MotorInit(void)
{
    MotorGPIO_Configuration();
    CarStop();
}

现在要求向前,向后分别全速跑四秒,然后向右转两秒,最后停止四秒,请问应该怎么改上面代码呢?

有同学给改成这样,我不是很理解,i应该在哪里申明呢,不需要赋初始值吗?

//向前
void CarGo(int i)
{
    left_speed_duty=4*i;
    right_speed_duty=4*i;
}

//向左
void CarRight(void)
{
    left_speed_duty=MID_SPEED_DUTY;
    right_speed_duty=-MID_SPEED_DUTY;
}

//向右
void CarStop(void)
{
    left_speed_duty=MIN_SPEED_DUTY;
    right_speed_duty=MIN_SPEED_DUTY;
}

//后退
void CarBack(int i)
{
    left_speed_duty=-4*i;
    right_speed_duty=-4*i;
}

void MotorInit(void)
{
    MotorGPIO_Configuration();
    CarStop();
}

参考GPT和自己的思路:

根据你的要求,可以将原来的while循环改为以下代码:

while(1)
{
    if(tick_1s < 4)
        CarGo();    //向前全速跑4s
    else if(tick_1s < 8)
        CarBack();  //向后全速跑4s
    else if(tick_1s < 10)
        CarRight(); //向右转2s
    else if(tick_1s < 14)
        CarStop(); //停止4s

    if(tick_1s >= 14)
        tick_1s = 0; //计时器归零
}

这里修改了while循环中的判断条件,根据计时器的不同阶段调用不同的Car函数来控制小车的运动。最后需要将计时器tick_1s在达到14后归零,以开始新的循环。同时,注意更改tick_1s的初始值。

至于第二部分代码的修改,可以将CarBack函数的参数i改为固定值4,以符合题目要求中的全速后退。至于申明i的位置和初始值可以放在调用CarBack函数的地方,这里不需要在函数外进行申明和赋值。