stm32f103c8t6智能小车循迹、测速实验程序源代码
时间: 2023-09-06 09:04:10 浏览: 214
stm32f103c8t6智能小车循迹、测速实验程序源代码.rar
5星 · 资源好评率100%
循迹和测速是智能小车常见的实验项目。下面是一个简单的stm32f103c8t6智能小车循迹、测速实验程序的源代码。
#include <STM32F10x.h>
//定义驱动电机的引脚
#define MOTOR1_A GPIO_Pin_0
#define MOTOR1_B GPIO_Pin_1
#define MOTOR2_A GPIO_Pin_2
#define MOTOR2_B GPIO_Pin_3
//定义传感器的引脚
#define SENSOR_LEFT GPIO_Pin_4
#define SENSOR_MID GPIO_Pin_5
#define SENSOR_RIGHT GPIO_Pin_6
//定义速度常量
#define SPEED 1000
//定义测速的时间常量
#define INTERVAL 100
int main(void)
{
//初始化引脚和定时器
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//配置引脚输出模式
GPIO_InitStructure.GPIO_Pin = MOTOR1_A | MOTOR1_B | MOTOR2_A | MOTOR2_B;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SENSOR_LEFT | SENSOR_MID | SENSOR_RIGHT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置定时器,用于测速
TIM_TimeBaseStructure.TIM_Period = INTERVAL - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//循迹、测速逻辑
while(1)
{
//根据传感器的状态调整车辆的方向
if(GPIO_ReadInputDataBit(GPIOA, SENSOR_LEFT) == Bit_RESET && GPIO_ReadInputDataBit(GPIOA, SENSOR_MID) == Bit_SET && GPIO_ReadInputDataBit(GPIOA, SENSOR_RIGHT) == Bit_RESET)
{
//只中间传感器检测到
GPIO_SetBits(GPIOA, MOTOR1_A);
GPIO_ResetBits(GPIOA, MOTOR1_B);
GPIO_SetBits(GPIOA, MOTOR2_A);
GPIO_ResetBits(GPIOA, MOTOR2_B);
}
else if(GPIO_ReadInputDataBit(GPIOA, SENSOR_LEFT) == Bit_SET && GPIO_ReadInputDataBit(GPIOA, SENSOR_MID) == Bit_RESET && GPIO_ReadInputDataBit(GPIOA, SENSOR_RIGHT) == Bit_SET)
{
//只两侧传感器检测到
GPIO_ResetBits(GPIOA, MOTOR1_A);
GPIO_SetBits(GPIOA, MOTOR1_B);
GPIO_ResetBits(GPIOA, MOTOR2_A);
GPIO_SetBits(GPIOA, MOTOR2_B);
}
else if(GPIO_ReadInputDataBit(GPIOA, SENSOR_LEFT) == Bit_SET && GPIO_ReadInputDataBit(GPIOA, SENSOR_MID) == Bit_SET && GPIO_ReadInputDataBit(GPIOA, SENSOR_RIGHT) == Bit_RESET)
{
//只右侧传感器检测到
GPIO_ResetBits(GPIOA, MOTOR1_A);
GPIO_SetBits(GPIOA, MOTOR1_B);
GPIO_SetBits(GPIOA, MOTOR2_A);
GPIO_ResetBits(GPIOA, MOTOR2_B);
}
else
{
//其他情况,停止车辆
GPIO_ResetBits(GPIOA, MOTOR1_A);
GPIO_ResetBits(GPIOA, MOTOR1_B);
GPIO_ResetBits(GPIOA, MOTOR2_A);
GPIO_ResetBits(GPIOA, MOTOR2_B);
}
//启动定时器,测量小车的速度
TIM_Cmd(TIM2, ENABLE);
//等待定时器计数完成
while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
//停止定时器,重置计数值
TIM_Cmd(TIM2, DISABLE);
TIM_SetCounter(TIM2, 0);
}
}
以上代码是一个简单的stm32f103c8t6智能小车的循迹、测速实验程序。其中使用了引脚控制驱动电机的转向,通过传感器检测来调整小车的方向。通过定时器测量小车的速度,并在一定时间间隔内重复这个过程。代码中使用了定时器2来测量速度,依据传感器状态控制小车的转向,根据需要可以自行调整转向的逻辑。
阅读全文