写一段STM32F103C8T6的循迹避障小车代码
时间: 2023-09-26 13:05:53 浏览: 75
STM32F103C8T6单片机前轮转向小车黑线循迹避障运动程序源代码.rar
5星 · 资源好评率100%
循迹避障小车是一种常见的嵌入式应用场景,下面是一份STM32F103C8T6的循迹避障小车代码,仅供参考:
```
#include "stm32f10x.h"
#include "delay.h"
#define IN1 GPIO_Pin_0
#define IN2 GPIO_Pin_1
#define IN3 GPIO_Pin_2
#define IN4 GPIO_Pin_3
#define ENA GPIO_Pin_6
#define ENB GPIO_Pin_7
#define LED GPIO_Pin_13
#define LSA GPIO_Pin_4
#define LSB GPIO_Pin_5
#define LSC GPIO_Pin_6
#define LSD GPIO_Pin_7
void GPIO_Configuration(void);
void PWM_Configuration(void);
void Car_Run(void);
void Car_Back(void);
void Car_Left(void);
void Car_Right(void);
void Car_Stop(void);
void Car_Adjust(void);
int main(void)
{
GPIO_Configuration();
PWM_Configuration();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1 && GPIO_ReadInputDataBit(GPIOA, LSD) == 0)
{
Car_Run();
}
else if(GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 1 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1 && GPIO_ReadInputDataBit(GPIOA, LSD) == 0)
{
Car_Left();
}
else if(GPIO_ReadInputDataBit(GPIOA, LSA) == 1 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0 && GPIO_ReadInputDataBit(GPIOA, LSD) == 0)
{
Car_Left();
}
else if(GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0 && GPIO_ReadInputDataBit(GPIOA, LSD) == 1)
{
Car_Right();
}
else if(GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 1 && GPIO_ReadInputDataBit(GPIOA, LSD) == 1)
{
Car_Right();
}
else if(GPIO_ReadInputDataBit(GPIOA, LSA) == 0 && GPIO_ReadInputDataBit(GPIOA, LSB) == 0 && GPIO_ReadInputDataBit(GPIOA, LSC) == 0 && GPIO_ReadInputDataBit(GPIOA, LSD) == 0)
{
Car_Adjust();
}
else
{
Car_Stop();
}
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
GPIO_InitStructure.GPIO_Pin = IN1 | IN2 | IN3 | IN4 | ENA | ENB;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LSA | LSB | LSC | LSD;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void PWM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 1MHz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
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_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
void Car_Run(void)
{
GPIO_SetBits(GPIOA, IN1);
GPIO_ResetBits(GPIOA, IN2);
GPIO_SetBits(GPIOA, IN3);
GPIO_ResetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 500);
TIM_SetCompare2(TIM3, 500);
}
void Car_Back(void)
{
GPIO_ResetBits(GPIOA, IN1);
GPIO_SetBits(GPIOA, IN2);
GPIO_ResetBits(GPIOA, IN3);
GPIO_SetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 500);
TIM_SetCompare2(TIM3, 500);
}
void Car_Left(void)
{
GPIO_SetBits(GPIOA, IN1);
GPIO_ResetBits(GPIOA, IN2);
GPIO_ResetBits(GPIOA, IN3);
GPIO_ResetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 200);
TIM_SetCompare2(TIM3, 800);
}
void Car_Right(void)
{
GPIO_ResetBits(GPIOA, IN1);
GPIO_ResetBits(GPIOA, IN2);
GPIO_SetBits(GPIOA, IN3);
GPIO_ResetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 800);
TIM_SetCompare2(TIM3, 200);
}
void Car_Stop(void)
{
GPIO_ResetBits(GPIOA, IN1);
GPIO_ResetBits(GPIOA, IN2);
GPIO_ResetBits(GPIOA, IN3);
GPIO_ResetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 0);
TIM_SetCompare2(TIM3, 0);
}
void Car_Adjust(void)
{
GPIO_SetBits(GPIOA, IN1);
GPIO_ResetBits(GPIOA, IN2);
GPIO_ResetBits(GPIOA, IN3);
GPIO_SetBits(GPIOA, IN4);
TIM_SetCompare1(TIM3, 500);
TIM_SetCompare2(TIM3, 500);
}
```
这份代码使用了STM32F103C8T6的GPIO和PWM模块,实现了对小车的控制。在GPIO配置函数中,通过配置GPIOA和GPIOB的引脚模式为输出和输入上拉模式,分别控制了小车马达和循迹传感器的输入输出。在PWM配置函数中,使用了TIM3模块实现了PWM信号的输出,从而调节小车的速度和方向。在主函数中,通过读取循迹传感器的输入,来判断小车应该执行的动作,如前进、后退、左转、右转等。同时,也实现了小车的停止和调整功能。
阅读全文