• 全国大学生智能汽车大赛(三):上下位机通信协议及代码


    全国大学生智能汽车大赛(一):摄像头识别赛道代码

    全国大学生智能汽车大赛(二):电感采样、卡尔曼滤波、方向控制代码

    全国大学生智能汽车大赛(三):上下位机通信协议及代码

     下面为正文

    一、 上下位机通信协议及代码

    1. /*******************************
    2. * 屏幕显示
    3. * 蓝牙通信
    4. *作者:躺躺我啊
    5. *最终修改日期:2021.6.20
    6. *TC264D
    7. *******************************/
    8. #include "headfile.h"
    9. uint8 data[30];
    10. //向上位机发送信息用
    11. extern int speed_now_int,speed_out_int;
    12. extern int x_error_int,y_error_int;
    13. void data_init(void)
    14. {
    15. data[0] = 0x55; //帧数据头
    16. data[1] = 0xaa; //帧数据头
    17. data[28] = 0x55; //帧数据尾
    18. data[29] = 0xaa; //帧数据尾
    19. }
    20. void send_to_pc(void)
    21. {
    22. data[2] = speed_now_int / 256; //编码器输出,高8位
    23. data[3] = speed_now_int % 256; //编码器输出,低8位
    24. data[4] = speed_out_int / 256; //电机PWM占空比,高8位
    25. data[5] = speed_out_int % 256; //电机PWM占空比,低8位
    26. data[6] = steer.out / 256; //舵机控制输出,高8位
    27. data[7] = steer.out % 256; //舵机控制输出,低8位
    28. data[8] = steer.ll / 256; //电感1输出值,高8位
    29. data[9] = steer.ll % 256; //电感1输出值,低8位
    30. data[10] = steer.l / 256; //电感2输出值,高8位
    31. data[11] = steer.l % 256; //电感2输出值,低8位
    32. data[12] = steer.lm / 256; //电感3输出值,高8位
    33. data[13] = steer.lm % 256; //电感3输出值,低8位
    34. data[14] = steer.m / 256; //电感4输出值,高8位
    35. data[15] = steer.m % 256; //电感4输出值,低8位
    36. data[16] = steer.r / 256; //电感5输出值,高8位
    37. data[17] = steer.r % 256; //电感5输出值,低8位
    38. data[18] = steer.rm / 256; //电感6输出值,高8位
    39. data[19] = steer.rm % 256; //电感6输出值,低8位
    40. data[20] = steer.rr / 256; //电感7输出值,高8位
    41. data[21] = steer.rr % 256; //电感7输出值,低8位
    42. data[22] = steer.all / 256; //电感总输出值,高8位
    43. data[23] = steer.all % 256; //电感总输出值,低8位
    44. data[24] = x_error_int / 256; //横向电感偏差,高8位
    45. data[25] = x_error_int % 256; //横向电感偏差,低8位
    46. data[26] = y_error_int / 256; //纵向电感偏差,高8位
    47. data[27] = y_error_int % 256; //纵向电感偏差,低8位
    48. wireless_send_buff(&data[0],30); //向上位机发送数据
    49. }
    50. void show_all(void)
    51. {
    52. char txt[32] = "xiaoli";
    53. sprintf(txt, "1_ll:%4d 2_l:%4d 3_lm:%4d", steer.ll, steer.l, steer.lm); //显示电感值
    54. ips200_showstr(0,0,txt);
    55. sprintf(txt, "7_rr:%4d 6_r:%4d 5_rm:%4d", steer.rr, steer.r, steer.rm); //显示电感值
    56. ips200_showstr(0,1,txt);
    57. sprintf(txt, "4_mid:%4d", steer.m); //显示电感值
    58. ips200_showstr(0,2,txt);
    59. sprintf(txt, "L_all:%4d ", steer.all); //显示电感总值
    60. ips200_showstr(0,3,txt);
    61. sprintf(txt, "x_left: %4d", steer.x_left); //显示左横电感总值
    62. ips200_showstr(0,4,txt);
    63. sprintf(txt, "x_right:%4d",steer.x_right); //显示右横电感总值
    64. ips200_showstr(0,5,txt);
    65. sprintf(txt, "x_err:%4.1f x_big:%4d", steer.x_error, steer.x_bigerror); //显示电感偏差
    66. ips200_showstr(0,6,txt);
    67. sprintf(txt, "y_err:%4.1f y_big:%4d", steer.y_error, steer.y_bigerror); //显示电感偏差
    68. ips200_showstr(0,7,txt);
    69. sprintf(txt, "steer.out:%4d",steer.out); //显示舵机控制输出
    70. ips200_showstr(0,8,txt);
    71. sprintf(txt, "speed_now:%.1f",speed_param.now); //显示电机PWM
    72. ips200_showstr(0,9,txt);
    73. sprintf(txt, "speed_set:%.1f",speed_param.set); //显示电机PWM
    74. ips200_showstr(0,10,txt);
    75. sprintf(txt, "speed_out:%.1f",speed_param.out); //显示电机PWM
    76. ips200_showstr(0,11,txt);
    77. sprintf(txt, "speed_real:%.1f",speed_param.speed_real); //显示实际速度
    78. ips200_showstr(0,12,txt);
    79. sprintf(txt, "counts_flag:%d counts:%d",speed_param.counts_flag,speed_param.counts); //显示实际速度
    80. ips200_showstr(0,13,txt);
    81. sprintf(txt, "distance:%.1f",speed_param.distance); //显示实际速度
    82. ips200_showstr(0,14,txt);
    83. sprintf(txt, "direct_flag:%d",steer.direct_flag); //显示丢线相关信息
    84. ips200_showstr(0,15,txt);
    85. sprintf(txt, "circle_flag:%d stage:%d",steer.circle_flag,steer.circle_stage); //显示环岛相关信息
    86. ips200_showstr(0,16,txt);
    87. sprintf(txt, "trident_flag:%d time:%d",steer.trident_flag,steer.trident_time); //显示三叉相关信息
    88. ips200_showstr(0,17,txt);
    89. }
    90. //蜂鸣器,time为蜂鸣次数
    91. void bark(int time)
    92. {
    93. int i = 0;
    94. for (i = 0;i < time;i++)
    95. {
    96. gpio_set(P33_10,1); //开启蜂鸣器
    97. systick_delay_ms(STM0, 400); //延时
    98. gpio_set(P33_10,0); //关闭蜂鸣器
    99. }
    100. }

    二、 推荐IO分配

    摄像头:8个数据口,一个串口,两eru中断
            数据口:00_0 00_1 00_2 00_3 00_4 00_5 00_6 00_7
            配置串口:摄像头RX:02_2     摄像头TX:02_3
            VSY:02_0
            HREF:程序不需要,所以不接
            PCLK:02_1

            四路运放 A0 A1 A2 A3 等

    四个编码器:
        LSB:33_7   DIR:33_6
        LSB:02_8   DIR:00_9
        LSB:10_3   DIR:10_1
        LSB:20_3   DIR:20_0

    8路pwm:

            21_2 21_3 21_4 21_5 02_4 02_5 02_6 02_7

    ICM20602:
        CLK:    P20_11  
        MOSI:    P20_14 
        MISO:    P20_12 
        CS:    P20_13
        SPI0

    TFT屏幕:
        CLK     15_3 
        MOSI     15_5 
        MISO     15_4    //实际上TFT没有这个引脚 这里仅仅占位而已  
        CS0     15_2 
        BL         15_4     //复用控制背光
        REST     15_1 
        DC         15_0  
        SPI2

    舵机:P33_9


            尽量不要使用以下引脚,以下引脚属于boot引脚,不合理的使用容易导致单片机无法启动等问题,因此建议大家尽量不要使用:
            P14_2 
            P14_3
            P14_4
            P14_5
            P14_6 
            P10_5 
            P10_6 

  • 相关阅读:
    竞赛开源项目汇总
    2023高教社杯数学建模A题B题C题D题E题思路模型 国赛建模思路分享
    使用 gperftools 分析程序cpu性能
    如何评估RPA需求?
    【源码解读】asp.net core源码启动流程精细解读
    android 11及以上保存图片视频到相册
    【工具使用】神经网络训练高效可视乎库visdom | 使用方式 概念全梳理
    学习笔记-Flutter 布局(三)- FittedBox、AspectRatio、ConstrainedBox详解
    oracle-pl/sql -常用sql (持续更新中)
    nacos 负载均衡ribbon 轮询策略 权重2种方式
  • 原文地址:https://blog.csdn.net/m0_53966219/article/details/126880510