stm32f103c8t6循迹小车
时间: 2023-05-16 14:01:32 浏览: 399
STM32F103C8T6循迹小车是一种基于STM32F103C8T6单片机的智能小车,通常使用红外传感器或者光电传感器来实现循迹功能。该小车具有较强的数据处理能力和高速响应速度,能够以高精度完成地形或运动轨迹的扫描和记录。
在循迹方面,STM32F103C8T6循迹小车通常采用黑白线循迹或者光电感应循迹技术,通过传感器采集路面信息,根据程序设计的算法来控制小车的运动方向和速度,以达到循迹的目的。在实现循迹的过程中,需要对传感器返回的数据进行处理,包括滤波和修正等,以提高循迹的准确性和稳定性。
除了循迹功能之外,STM32F103C8T6循迹小车还可以实现多种功能,例如遥控驾驶、避障、跟随、舵机控制等。这些功能通常是通过程序设计来实现的,通过编程可以让小车具有更为智能和灵活的动作。
总的来说,STM32F103C8T6循迹小车是一款集多种功能于一体的智能小车,具有高效的数据处理能力和灵活的控制方式,可以广泛应用于教育、科研等领域。
相关问题
STM32F103C8T6循迹小车
### STM32F103C8T6 微控制器构建循迹小车教程
#### 使用PWM调整电机转速
为了实现对电机速度的有效控制,可以利用脉宽调制(PWM)技术来改变施加到电机上的电压平均值。STM32F103C8T6内置定时器能够生成精确的PWM波形用于驱动直流电机的速度调节[^1]。
```c
// 初始化TIM2作为PWM输出端口配置示例
void TIM2_PWM_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// 配置PA0为复用推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// 设置自动重装载寄存器周期值
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置通道1为PWM模式1
TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 499; // 初始占空比50%
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
```
#### IO口读取循迹模块信号
对于循迹传感器而言,通常会采用反射光强度变化的方式来判断地面颜色差异从而识别路径。当遇到黑色线条时,由于其吸收光线能力强于白色背景,因此返回给MCU低电平;反之则为高电平。可以通过配置通用输入引脚并配合外部中断服务程序捕捉这些状态转变事件来进行轨迹跟踪操作[^2]。
```c
// 定义追踪传感器对应的GPIO引脚定义宏
#define TRACK_SENSOR_PIN GPIO_Pin_1
#define TRACK_SENSOR_PORT GPIOD
// 外部中断初始化函数
void EXTI_Configuration(void){
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
// PD1设置成浮空输入模式
GPIO_InitStructure.GPIO_Pin = TRACK_SENSOR_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(TRACK_SENSOR_PORT, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1);
// 配置EXTI Line触发条件下降沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 中断优先级分组配置
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
// 对应的中断处理函数声明
void EXTI1_IRQHandler(void){
if (EXTI_GetITStatus(EXTI_Line1)!= RESET){
// 执行相应动作...
// 清除标志位
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
```
#### 编写循迹主函数逻辑
整个系统的运行依赖于一个循环结构,在此期间不断监测来自各个方向感测元件的数据,并据此作出决策以保持车辆沿着预定路线前进。具体来说就是根据当前所处位置以及目标方位之间的偏差量计算出合适的转向角度和移动距离,进而通过调整两侧轮子的不同转速达到转弯效果[^3]。
```c
int main(void){
uint8_t track_status = 0;
SystemInit();
UART_Config(); // 调试串口打印信息
PWM_Motor_Init(); // 初始化马达PWM接口
SENSOR_IO_Init(); // 初始化传感器IO接口
Delay_Init(); // 延迟函数初始化
while(1){
track_status = GetTrackSensorValue(); // 获取传感器数值
switch(track_status){
case LEFT_OFF_TRACK:
TurnRight(); // 向右修正航向
break;
case RIGHT_OFF_TRACK:
TurnLeft(); // 向左修正航向
break;
default :
GoStraight(); // 继续直行
break;
}
delay_ms(20); // 控制采样频率
}
}
```
stm32F103C8T6循迹小车代码
### STM32F103C8T6循迹小车代码实例
对于STM32F103C8T6单片机而言,实现线跟随功能主要依赖于红外传感器检测地面颜色变化并据此调整电机速度来保持车辆沿黑线行驶。下面提供一段简化版的循迹小车子程序框架。
#### 主要硬件连接说明
- 使用两个或更多红外反射传感器安装在底盘前方适当位置。
- 将这些传感器的数据引脚接到MCU相应GPIO口上读取状态。
- 连接直流减速电机至驱动模块(如L298N),再由PWM信号控制转速方向。
#### 初始化配置部分
```c
#include "stm32f1xx_hal.h"
// 定义使用的IO端口和定时器资源
#define LEFT_SENSOR_PIN GPIO_PIN_0 /* 左侧光电管 */
#define RIGHT_SENSOR_PIN GPIO_PIN_1 /* 右侧光电管 */
TIM_HandleTypeDef htim3; /* PWM输出所用定时器句柄 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void); /* GPIO初始化函数声明 */
static void MX_TIM3_PWM_Init(void); /* TIM3作为PWM源初始化*/
int main(void){
HAL_Init();
SystemClock_Config(); /* 配置系统时钟 */
MX_GPIO_Init(); /* 初始化输入/输出接口 */
MX_TIM3_PWM_Init(); /* 设置好PWM参数 */
}
```
#### 循环处理逻辑
```c
while (1){
uint8_t left_val = HAL_GPIO_ReadPin(GPIOA,LEFT_SENSOR_PIN)?1:0;
uint8_t right_val = HAL_GPIO_ReadPin(GPIOA,RIGHT_SENSOR_PIN)?1:0;
if((left_val==0)&&(right_val==0)){ // 当两路都偏离轨道时停止前进
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,0);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,0);
}else if ((left_val==1)&&(right_val==0)){ // 如果左边感应到黑色,则右转弯
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,75);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,25);
}else if ((left_val==0)&&(right_val==1)){ // 若右边感应到黑色则左转
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,25);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,75);
}else{ // 正常直行情况
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,50);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,50);
}
}
```
此段代码展示了如何通过比较两侧IR传感器返回的状态值来决定左右轮子的速度差异从而完成转向动作[^1]。
阅读全文
相关推荐













