大一萌新の作品:红外寻迹模块做跟随小车之没有I的极简PID算法

这篇具有很好参考价值的文章主要介绍了大一萌新の作品:红外寻迹模块做跟随小车之没有I的极简PID算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(纯萌新,学习单片机半年了,这是寒假回家的作品,师从江科大,写博客纪录我实现后的经验)(比较粗略)

前言:

因为没买超声波避障模块,只能勉强一下用红外寻迹做一个类似的小车。

问题很多:光线会干扰读取到的AD值,且难以设置详细的距离,只能设置大概距离;碍于萌新我不会PID算法的I算法的编程,以及暂时无法读取电机的转苏,做不出内环,只能勉强做一个只有P,D的PID跟随小车,但实现基本功能是绰绰有余的;本文只用了一个模块,所以只能直线,如果要做到转弯等功能,可以三个模块再用简单的if语句就像寻迹小车一样即可。

目标:

  1. 能够使用单片机读取红外模块的AD值

  1. 写简单的没有I的PID算法,实现比较稳定的简单跟踪

  1. 写main函数结合上述目标

接下来分析做该项目的思路:

首先要解决读取红外模块的数值,红外模块有四根接口,其中AO是读取具体电压值的口,DO是只输出0/1的口。所以接AO。用AD的代码即可读取其值。当其遇见不反光的面时,会输出很高的AD值,反之为低。使用AD的原因是如果用DO口,只能识别有无,但是没法控制距离。

其次是PID的算法,萌新我实力有限,只能写没有I的PID算法博君一笑了。P指的是跟随比例变化电机的转速,D指的是能接收的最终误差。具体可以看其他大佬的PID讲解,很详细,但是我暂时没能将其完全写成自己的代码。

最后就是通过PID算法获知应该输入给电机的转速了,大概思路就是如此。

解决&源码:

首先是AD读取,这里建议观看江科大老师的stm32教程,很容易上手的代码(比较重要的部分在注释中已经标明。ps.标注释真是个好习惯)。

#include "stm32f10x.h"                  // Device header
#include "AD.h"              

void AD_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);            //打开ADC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                    //打开ADCCLK的6分频
    
    GPIO_InitTypeDef GPIO_InitStructure;                                    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //专属ADC的模式捏
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    

    
    //结构体初始化ADC
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode= ADC_Mode_Independent;            //ADC1单打模式!
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right ;                    //右对齐就欧克啦
    ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None;        //只用软件触发啦
    ADC_InitStructure.ADC_ContinuousConvMode=DISABLE ;                //连续转换模式(ENABLE)
    ADC_InitStructure.ADC_NbrOfChannel= 1;                    //通道数目
    ADC_InitStructure.ADC_ScanConvMode= DISABLE;                    //扫描模式        看江科大啦
    ADC_Init(ADC1,&ADC_InitStructure);
    
    ADC_Cmd(ADC1,ENABLE);            //ADC准备就绪捏
    //但是我们要校准呢
    
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1)==SET);            //没校准开始给我站在这里
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1)==SET);                    //等待校准完成捏
    
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    
}

uint16_t AD_GetValue_D(void)
{
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);                //连续触发可放在上面,这样也不需要等到转化完成啦↓
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);                //转换完成变成1就退出啦
    return ADC_GetConversionValue(ADC1);                //因为读取后自动清除标志位,所以不用清除标志位啦
}
//若是连续触发模式,可以将软件触发的函数挪到初始化的最后,只需要触发一次即可~

uint16_t AD_GetValue_E(void)                    //这个就是连续转换用的函数啦
{
    return ADC_GetConversionValue(ADC1);
}

uint16_t AD_GetValue(uint8_t ADC_Channel)
{
    ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);                //连续触发可放在上面,这样也不需要等到转化完成啦↓
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);                //转换完成变成1就退出啦
    return ADC_GetConversionValue(ADC1);                //因为读取后自动清除标志位,所以不用清除标志位啦
}

然后是PID

#include "stm32f10x.h"                  // Device header
#include "AD.h"

void PID_Init(void)
{
    AD_Init();
}

float PID(uint16_t Aim,uint16_t D)        //Aim是目标,D是误差
{
    uint16_t Now;
    float Speed=0;
    Now=AD_GetValue(ADC_Channel_8);        //假如3500是目标,50是误差,则可以计算具体比例
    if(Now<(Aim-D))
    {
        Speed=((Now-Aim)/70)-50;
        return(Speed);        //返回的速度
    }
    else if(Now>(Aim+D))
    {
        Speed=((Now-Aim)/7)+30;
        return(Speed);
    }
    else {return 0;}
}

最后是main代码

#include "stm32f10x.h"
#include "Delay.h"
#include "Motor.h"
#include "PID.h"
#include "OLED.h"
#include "AD.h"                  // Device header

int main(void)                //电机范围-100~100        
{
    float Speed;
    Motor_Init();
    PID_Init();
    OLED_Init();
    while(1)
    {
        Speed=PID(3500,75);
        Motor_L_SetSpeed(Speed);
        Motor_R_SetSpeed(Speed);
        OLED_ShowNum(1,1,Speed+100,3);
        OLED_ShowNum(2,1,AD_GetValue(ADC_Channel_8),4);
    }    
    
}

尾声:

本次作品的实现,让我提前适应了超声波避障的思路,便于之后的继续学习和研究。自己编写极其简单的PID算法也让我知道了许多算法的精妙之处,适应算法的难度。这是学习路上一个避不开的坎,努力坚持下去,终会有成果的。文章来源地址https://www.toymoban.com/news/detail-624787.html

到了这里,关于大一萌新の作品:红外寻迹模块做跟随小车之没有I的极简PID算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AT89S52单片机智能寻迹小车自动红外避障趋光检测发声发光设计

    wx供重浩:创享日记 对话框发送:寻迹 获取完整说明报告+源程序+数据 小车具有以下几个功能:自动避障功能;寻迹功能(按路面的黑色轨道行驶);趋光功能(寻找前方的点光源并行驶到位);检测路面所放置的铁片的个数的功能;计算并显示所走的路程和行走的时间,并

    2024年02月19日
    浏览(50)
  • stm32f103 简易4路红外寻迹小车(2)----2023西南交大电赛校赛(pcb原理图,代码及分析)

    目录 一。材料准备。 二。PCB原理图  三。逻辑状态图 四。代码部分 五。文件下载: 接上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大电赛校赛(含stm32中文资料) 小车测试视频: stm32小车寻迹小车 材料资料图片见上:stm32f103 简易4路红外寻迹小车(1)----2023西南交大

    2024年02月16日
    浏览(49)
  • 100、基于STM32单片机自动跟随小车 红外遥控控制小车避障模式 跟随模式设计(程序+原理图+PCB源文件+流程图+硬件设计资料+元器件清单等)

    智能小车通过各种感应器获得外部环境信息和内部运动状态,实现在复杂环境背景下的自主运动,从而完成具有特定功能的机器人系统。而随着智能化电器时代的到来,它们在为人们提供的舒适的生活环境的同时,也提高了制造智能化电器对于人才要求的门槛。智能小车是集

    2024年02月15日
    浏览(72)
  • 智能小车红外测速模块的使用方法(基于STM32的标准库)

    基于STM32标准库编程实现智能小车的红外测速所需掌握的知识: (1)外部中断的配置 (2)定时器的配置 (3)串口的配置 红外测速的核心思路 : (1)红外测速模通电后,会发出红外线,利用测速盘对红外线进行遮光,使测速模块连接STM32的中断引脚触发中断。每次发生中

    2024年02月04日
    浏览(45)
  • ROS寻迹小车

    1.自行导入某车型的mesh文件到URDF/Xacro模型(碰撞检测边框长度小数点位数保留三位:最后两位是学号最后两位),四轮驱动; 2.搭建一个具有城市或者越野行驶路面,不少于3处障碍的行驶环境; 3.给无人车装配摄像头、Kinect、激光雷达等传感器。 4.通过键盘控制无人车,采

    2024年02月06日
    浏览(57)
  • ROS仿真gazebo小车寻迹PID【第一期】

    本篇内容为笔者在2022.5.11完成的,与某个比赛相关,所以当时没有发布。 而现在是2023.2.21,当时的一番雄心壮志现在已经熄了大半,此外随着时间推移,笔者需要花更多的时间在准备考研上,因此这可能是一期 没有后续 的文章 即便如此,这一篇也实现了一个挺有趣的功能啦

    2024年02月05日
    浏览(62)
  • 基于蓝牙技术使用stm32制造一个智能小车 (寻迹,避障,遥控)

    目录 1.制作智能小车的硬件名单: 3.引脚图 2.先让小车动起来  1.小车运动 2.代码 3.寻迹  1.工作原理 2.代码 4.超声波避障  1.工作原理 2.代码 5.蓝牙遥控  1.蓝牙工作原理 2.代码 6.oled屏幕 1.工作内容 7.led灯 8.蜂鸣器 9.蓝牙使用代码main  STM32C6T6核心板 1块 L298N电机驱动  1块 五

    2024年02月15日
    浏览(39)
  • STC89C52 小车-舵机转向/蓝牙控制/寻迹,有PCB有讲解,更新

    推荐单片机:STC89C52或51(尽量52 还有提供 可用于测试直接烧录的89单片机文件(hex),不需要重新编译 。 还是老话: 源代码可以直接编译通过。 本人是自学,原创内容--转载请务必说明!! 所有下载在文章结尾(包全代码,附件) 代码:为个人gitHub库,无法或不会下载的可以评论

    2024年02月02日
    浏览(40)
  • 网页设计前端作品(大一)HTML+CSS

    🌩️ 精彩专栏推荐👇🏻👇🏻👇🏻 💂 作者主页: 【进入主页—🚀获取更多源码】 🎓 web前端期末大作业: 【📚HTML5网页期末作业 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作 (110套) 】 📔网站布局方面 :计划采用目前主流的、能兼容各大主

    2024年02月09日
    浏览(48)
  • 小型双轮差速底盘机器人实现红外跟随功能

            本文示例将实现R023样机小型双轮差速底盘跟随人移动的功能。在小型双轮差速底盘前方按下图所示安装3个  近红外传感器 ,制作一个红外线发射源,实现当红外发射源在机器人的检测范围内任意放置或移动时,机器人能追踪该发射源。 在这个示例中,我们采用了以

    2024年02月14日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包