qq_59151428 2022-07-07 09:12 采纳率: 33.3%
浏览 67
已结题

基于STM32的智能循迹往返小车设计

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
循迹小车到达终点后如何返回起点
  • 写回答

2条回答 默认 最新

  • 泡沫o0 C/C++ 领域优质创作者 2022-07-07 09:45
    关注

    1 整体设计

    智能循迹小车控制系统主要包括控制器模块、电源模块、循迹模块、避障模块、电机控制模块、无线通信模块等,如图1所示.在控制系统中,控制器模块根据循迹模块对路线的采集数据进行分析处理,通过电机驱动模块控制电机的正反转,并由舵机实现车子的方向控制,为了能够实现避障,采用了超声测距模块对障碍物的距离进行测量,另外可扩展光电检测模块,实现对接力棒的检测,从而实现赛事中两车接力的功能.

    2 硬件设计

    2.1 主控制模块

    本文选用STM32F103VET6芯片作为主控制器,该主控器是基于Cortex-M3内核的32位处理器,最高工作频率可以达到72MHz,具有高性能、低成本和低功耗等特点;STM32F103VET6片上不仅集成了256k~512k字节的闪存程序存储器、64k字节的SRAM存储器、3个12位模数转换器和2通道12位数模转换器,还具有丰富的定时器和通信接口等资源,特别是多达6路的PWM输出,为舵机和电机驱动模块提供了方便.设计中,通过PC0~PC4和PA0~PA5引脚读取循迹模块采样值;PB8和PB9输出PWM(Pulse Width Modulation)信号,PB8控制舵机转向,PB9用作接力赛中接力棒的夾持控制;PD8、PD9、PB12~PB14控制无线模块的数据传输.

    2.2 电源模块

    电源模块采用12V电源对直流电机供电,考虑到系统中传感器和STM32芯片的供电,还提供5V和3.3V两种电压,电路图如图2和图3所示.5V电压采用PWM控制降压转换芯片AX3111进行降压处理,AX3111芯片不仅具有低纹波、高效率和出色的瞬态特性,还具有软启动功能、限流功能、短路保护功能和过热保护功能.3.3V电压采用AMS1117芯片进行转换,加上磁珠及电容抑制了电源线上的高频噪声和尖峰干扰.

    2.3 电机驱动模块

    电机驱动模块采用BTN7960搭成H桥驱动电路,可以提供高达47A的驱动电流.BTN7960是应用于电机驱动的大电流半桥高集成芯片,它带有一个P沟道的高边MOSFET、一个N沟道的低边MOSFET和一个驱动IC.电路图如图4所示,其中INH引脚为高电平,使能BTN7960.IN引脚用于确定哪个MOSFET导通.IN=1且INH=1时,高边MOSFET导通,OUT引脚输出高电平;IN=0且INH=1时,低边MOSFET导通,OUT引脚输出低电平,两个芯片的输出端分别接电机的两极,即J2接口,通过左右两边的电平高低来控制电机的正反转.另外,SR引脚外接电阻的大小,可以调节MOS管导通和关断的时间,具有防电磁干扰的功能.

    电机的速度采用PWM脉宽调制技术进行控制,stmPWM信号频率为1kHz,固定不变,通过控制占空比来调节车速,由函数Speed_Set进行设置实现.方向舵机及机械手的控制也是采用PWM来完成的.另外,方向舵机及机械手的控制也是采用PWM来完成的.PWM信号产生频率为50Hz,控制舵机的转向,实现小车方向控制或机械手的抓取功能.

    2.4 循迹模块

    为适应不同跑道、不同场地的需求,循迹电路采用抗干扰能力强的光敏对管进行设计.由于设计的智能小车速度较快,在小车的前端并排放置11组光敏对管传感器对跑道数据进行采集,每组传感器包括LED发射电路和光敏电阻接收电路,LED发射电路产生白光,经过场地反射后,通过光敏电阻获取一定的模拟电压值,该电压值经过AD转换由STM32直接读取分析,由此来判别小车在跑道上的位置.

    2.5 无线通信模块

    无线通信模块采用nRF24L01射频芯片进行设计,该芯片支持2.4GHz的全球开放ISM频段,GFSK调制,最大发射功率为0dBm,传输速率高达2Mbps,抗干扰能力强,功耗低,125个信道可供选择,完全满足多点通信及调频通信的要求.

    3 软件设计

    智能循迹小车的软件设计主要包括循迹、方向舵机的控制、小车速度的控制以及避障功能等,图6所示为两辆接力小车的流程图,(a)为前车流程图,(b)为后车流程图.

    3.1 循迹

    循迹是设计的重要组成部分,直接决定着后期数据处理的准确性.光敏对管传感器进行数据采集.

    经过AD转换后存储在Location_Data[11]数组中,通过与Set_Location[11]数列中对应的阈值进行比较,确定相应传感器的是否采集到跑道,不同的传感器对应于不同的权值,具体如表所示.

    Location_Data[11]={0,0,0,0,0,0,0,0,0,0,0};

    Set_Location[11]={505 , 541 , 600 , 422 , 586 , 500, 507 , 370 , 459 , 520 , 498 };

    void Lock_BlackLine( )

    {

    for(i=0; i<11; i++)

    if(Location_Data [i]< Set_Location [i])

    {

    Cnt++;

    Loc_Para+=5-i;

    }

    if(Cnt>0)

    {

    if(Cnt>4)

    {

    Cross_Line_Cnt++;

    if(Cross_Line_Cnt>CROSSLINE_Time)

    {

    if(Cross_Line_Flag!=1)

    Cross_Line++;

    G_Black_Line_Location=(float)(Location_Parameter/L_Location_Cnt);

    Cross_Line_Flag=1;

    Cross_Line_Cnt=0;

    }

    }

    else

    {

    Cross_Line_Cnt=0;

    Cross_Line_Flag=2;

    G_Black_Line_Location=(float)(Location_Parameter/L_Location_Cnt);

    }

    }

    else if(L_Location_Cnt==0)

    {

    G_Black_Line_Location=0;

    Cross_Line_Flag=0;

    }

    Location_Parameter=0;

    L_Location_Cnt=0;

    }

    3.2 PID(Proportion-Differential-Integral)控制

    智能車的设计过程中主要是根据采集到的数据实现方向的控制和速度的控制,PID控制算法在智能车的控制方面是应用最广泛、控制效果最理想的一种控制算法.

    PID控制算法中,输出由比例参数P、积分参数I和微分参数D三个参数决定,公式为:

    输出=P误差+D误差的变化+I*误差的积分

    但在智能车方向控制方面,积分参数I意义不大,因此,舵机控制的设计中主要由比例参数P和微分参数D来计算出pid_out的值,为了防止超调而损坏舵机,一般要对pid_out的值进行限幅,获得的pid_out的值经过简单处理可以用来调整方向舵机的转角和小车的速度.

    代码如下:

    int error_d, last_loc, integral_err;

    int P, D, pid_out;

    void pid_value ( )

    {

    error_d=loc-last_loc;

    pid_out=Ploc+error_dD;

    }

    if(pid_out>PID_MAX) { pid_out= PID_MAX; }

    if(pid_out< PID_MIN) {pid_out= PID_MIN; }

    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月7日

悬赏问题

  • ¥15 Matlab计算100000*100000的矩阵运算问题:
  • ¥50 VB6.0如何识别粘连的不规则的数字图片验证码
  • ¥16 需要完整的这份订单所有的代码,可以加钱
  • ¥30 写一个带界面控制的机房电脑一键开机关机并且实时监控的软件
  • ¥15 Stata数据分析请教
  • ¥15 请教如何为VS2022搭建 Debug|win32的openCV环境?
  • ¥15 关于#c++#的问题:c++如何使用websocketpp实现websocket接口调用,求示例代码和相关资料
  • ¥15 51单片机的外部中断,按下按键后不能切换到另一个模式
  • ¥15 java连接sqlserver有问题
  • ¥15 yolov8 如何调cfg参数