问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103玩转智能车控制,你get了吗?

创作时间:
作者:
@小白创作中心

STM32F103玩转智能车控制,你get了吗?

引用
CSDN
9
来源
1.
https://blog.csdn.net/a11111ccc/article/details/113761005
2.
https://wenku.csdn.net/answer/7b178e7c2ba54b69a5431493e19acad4
3.
https://zhuanlan.zhihu.com/p/595886872
4.
https://blog.csdn.net/qq_67153941/article/details/142428709
5.
https://blog.csdn.net/weixin_44690557/article/details/125607583
6.
https://blog.csdn.net/m0_52679677/article/details/118682023
7.
https://cloud.baidu.com/article/3390774
8.
https://juejin.cn/post/7112239216871866382
9.
https://bbs.elecfans.com/jishu_1865112_1_1.html

@[01]{color}### 硬件搭建与选型

核心硬件选型

  • 主控芯片:STM32F103ZET6(64引脚LQFP封装)
  • 电机驱动:L298N模块(支持双路直流电机)
  • 传感器
    • 红外避障传感器(5路)
    • MPU6050六轴陀螺仪
    • CCD摄像头(可选)
  • 电源:18650锂电池*2(7.4V输出)

电路焊接要点

  • 电源模块:使用LM2596将7.4V降至5V,供主控板使用
  • 信号隔离:电机电源与控制信号电源需完全隔离
  • 抗干扰设计:PWM信号线加磁环,减少电磁干扰

硬件连接示意图

@[02]{color}### 基础控制实现

电机控制代码示例

#include "stm32f10x.h"

#define MOTOR_PIN1 GPIO_Pin_0
#define MOTOR_PIN2 GPIO_Pin_1
#define MOTOR_TIM TIM3

void motor_init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能GPIO和定时器时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    // 配置GPIO引脚为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置定时器
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    // 配置PWM输出
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

    // 使能定时器
    TIM_Cmd(TIM3, ENABLE);
}

void set_motor_speed(int speed) {
    if (speed > 0) {
        TIM_SetCompare1(TIM3, speed);
        TIM_SetCompare2(TIM3, 0);
    } else {
        TIM_SetCompare1(TIM3, 0);
        TIM_SetCompare2(TIM3, -speed);
    }
}

红外避障传感器读取

uint8_t read_infrared_sensor(uint8_t channel) {
    GPIO_InitTypeDef GPIO_InitStructure;
    uint8_t value = 0;

    // 配置GPIO为输入模式
    GPIO_InitStructure.GPIO_Pin = 1 << channel;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 读取传感器状态
    value = GPIO_ReadInputDataBit(GPIOB, 1 << channel);

    return value;
}

@[03]{color}### 调试与测试

串口打印调试

#include "usart.h"

void debug_print(char *format, ...) {
    va_list args;
    va_start(args, format);
    vsprintf((char *)tx_buffer, format, args);
    USART_SendData(USART1, (uint8_t *)tx_buffer, strlen((char *)tx_buffer));
    va_end(args);
}

上位机开发

使用Qt Creator开发上位机,实现以下功能:

  • 实时图像传输
  • 波形显示
  • 参数调节

上位机与下位机通过串口或无线模块通信,可以实时查看传感器数据、调整PID参数等。

PID参数调优

使用Ziegler-Nichols法则进行PID参数整定:

  1. 先将Ki和Kd设为0,调整Kp使系统振荡
  2. 记录临界增益Kc和临界周期Tc
  3. 根据经验公式计算PID参数

无线调试方案

使用2.4GHz无线模块(如nRF24L01)实现无线数据传输,可以远程监控车辆状态和调整参数。

通过以上步骤,你可以快速搭建一个基于STM32F103的智能车控制系统。当然,实际竞赛中还需要不断优化算法和调试参数,以达到最佳性能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号