(六)stm32巡线小车首尝试 整合篇(2)

#采用stm32f103c8t6芯片

本次编写的巡线的逻辑,由于没有测速元件,同时红外也是数字式的,所以我学习了一下,好像没法使用pid,所以前面设置的pid接收好像没什么用处?
其实也不完全是,还是可以设置一些其它的参数的,既然写了,怎么会没用呢?其实还是可以设置一些参数的,嘿嘿。
最开始我的巡线逻辑是先前进,再进行条件判断,判断小车是否偏航。以两个传感器为例,如果左红外传感器输出高电平(即左传感器触碰到黑线),小车向左偏航,如果右传感器输出高电平,小车向右偏航。
在这里插入图片描述更改前逻辑

这样子的逻辑存在一个问题。每一循环必然使小车前进一段距离,当接触黑线时小车才会进入左转与右转的条件分支。这就导致一个问题,在小车遇到黑线时,可能因为执行了前进的函数,使得小车在进行红外传感器的判断时就已经冲出了黑线轨道,造成巡线的失败,这一点在比较大的弯道时尤其如此。所以,巡线逻辑需要改进。
改进后的巡线逻辑将前进的逻辑包含在条件判断中,只有在左右红外传感器未检测到高电平(即触碰到黑线时),前进的逻辑才会被执行。
在这里插入图片描述更改后逻辑

这样子,巡线的效果会变得更好。
在这里插入图片描述
经过测试,巡线的效果相比第一个逻辑确实能够更好,然而还是很不够优秀。小车有几个问题,一个是,有时候小车能够完成巡线,有时候却不能,就是说明小车的巡线并不稳定。其次,就是在拐锐角弯道时,会一直卡在转弯处,比较难以转弯。
接下来时巡线代码:

#main.c

#include "stm32f10x.h"
#include "pwm_timer.h"
#include "car_driver.h"
#include "delay.h"
#include "bluetooth.h"
#include "infrared.h"
#include "timer.h"

volatile int P_control = 50;
volatile int I_control = 50;
volatile int D_control = 50;

#define infrared2_repeat 2
#define infrared3_repeat 3

void Myinit()
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    CarDriverSet();
    delay_init();
    BluetoothUsartInit();
    INFRARED_Init(INFRARED1_init);
    INFRARED_Init(INFRARED2_init);
    INFRARED_Init(INFRARED3_init);
    INFRARED_Init(INFRARED4_init);
}

int main(void)
{
    int repeat_count = 30000, xun_flag = 0;
    Myinit();
    while(1)
    {
        if (data_out == xun_control)
        {
            if (INFRARED2_input == Meet_black)
            {
                CarControl(MOTORA, 2000);
                CarControl(MOTORB, 2000);
                while (repeat_count--)if (INFRARED1_input == Meet_black) xun_flag = 1;
                if (xun_flag == 0)
                {
                    CarControl(MOTORA, -2000);
                    CarControl(MOTORB, 2000);
                    delay_ms(120);
                }
                else 
                {
                    CarControl(MOTORA, -2000);
                    CarControl(MOTORB, 2000);
                    while(INFRARED3_input == None_black);
                    delay_ms(200);
                }
                xun_flag = 0;
                repeat_count = 30000;
            }
            else if (INFRARED3_input == Meet_black)
            {
                CarControl(MOTORA, 2000);
                CarControl(MOTORB, 2000);
                while (repeat_count--)if (INFRARED1_input == Meet_black) xun_flag = 1;
                if (xun_flag == 0)
                {
                    CarControl(MOTORA, 2000);
                    CarControl(MOTORB, -2000);
                    delay_ms(120);
                }
                else 
                {
                    CarControl(MOTORA, 2000);
                    CarControl(MOTORB, -2000);
                    while(INFRARED2_input == None_black);
                    delay_ms(200);
                }
                xun_flag = 0;
                repeat_count = 30000;
            }
            else
            {
                CarControl(MOTORA, 1300);
                CarControl(MOTORB, 1300);
            }
        }
    }
}

总体来时,小车实现的还是不错的。
谢谢各位读者看到这啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值