基于stm32f103c8t6两驱四驱小车循迹代码分享

只需要两个红外模块就能实现小车的稳定循迹,这套代码是我毕设研究出来的,此外我的小车还具备蓝牙功能以及其他传感器模块功能都有相应的代码来实现,需要的话可以私信我。

下面是我小车的循迹演示视频

stm32f103c8t6循迹小车

需要调整为多个红外控制也是原理,在我代码的基础上修改都能实现,只要基本的代码框架没问题,其他都非常容易实现。

### STM32F103C8T6 四轮循迹小车教程 #### 硬件连接 对于四轮循迹小车而言,硬件部分主要包括STM32F103C8T6单片机红外传感器阵列用于检测轨迹线、编码器测量电机转速以及直流电机动车辆运动。这些组件之间需建立可靠的电气连接以确保系统稳定运行。 - **电源管理**:为保证各部件正常运作,应提供稳定的供电电压给MCU和其他外设。通常情况下,电池组会向整个电路板供电;而敏感元件如MCU则可能需要额外稳压芯片来获得更纯净的工作条件[^1]。 - **信号传输线路**:从红外发射接收头到处理器之间的数据通信路径至关重要。建议使用短且屏蔽良好的导线减少干扰影响精度。同样地,在反馈速度信息回传至CPU时也应注意布线质量[^2]。 - **接口定义** - 将多个红外反射式光电开关均匀分布于底盘前端侧边缘处形成探测带; - 连接上述器件的数据端口分别接入指定GPIO引脚上以便读取状态变化情况; - 对于每台马达来说,则要将其使能端子与PWM输出通道关联起来从而实现调速目的。 ```cpp // GPIO初始化配置示例代码 (假设使用HAL库) __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启PA口时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // 定义使用的管脚编号 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置输入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不启用上下拉电阻 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 79; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK){ Error_Handler(); } ``` #### 控制算法 为了提高行驶过程中的稳定性和平顺度,可以引入PID调节机制对实际位置偏差做出响应调整。具体来讲就是依据当前时刻所获取的位置误差计算出相应的校正量作用于执行机构之上直至达到预期目标为止。 - **参数整定方法** 鉴于不同应用场景下最佳系数不尽相同因此有必要针对特定环境反复试验优化Kp(比例增益),Ki(积分时间常数), Kd(微分提前角)三个关键因子直到取得满意效果为止。 - **程序逻辑结构** 下面给出一段简化版伪代码描述了如何利用PID控制器完成直线跟踪任务: ```cpp float Setpoint = 0.0f; /* 设定点 */ float Input = 0.0f; /* 测量值 */ float Output = 0.0f; /* 输出控制量 */ double lastTime = millis(); void loop() { double currentTime = millis(); double deltaTime = (currentTime - lastTime)/1000; // 获取当前位置偏移量作为Input变量赋值 myPID.Compute(); /* 计算新的Output值 */ setMotorSpeed(Output);/* 应用此结果改变左右侧行驶速率差异*/ lastTime = currentTime; } class PID{ public: void Compute(){ error = Setpoint - Input; Pout = kp * error; Iout += ki * error * dt; Dout = kd * ((error-lastError)/dt); Output = Pout + Iout + Dout; lastError = error; } private: float kp=1,kd=0.1,ki=0.05; float pOut,iOut,dOut,lastError,error; }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值