基于STM32F103C8T6避障小车的代码模板

本文详细介绍了如何使用STM32F103C8T6微控制器来开发一款避障小车。内容涵盖了硬件连接、传感器接口编程、电机控制算法以及避障算法的实现,为读者提供了完整的代码模板和实践指导。
#include "stm32f10x.h"
#include "delay.h"
#include "pwm_output.h"

void RCC_Configuration(void);
void Moto_Configuration(void);
void SuperWave_Configuration(void);
uint32_t SuperWave_Distance(void);
void Car_Up(void);  //前进
void Car_Right(void);  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
void Car_Left(void);  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
void Car_Stop(void);  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机


int main(void)
{
	vu32 n=0;

	
	 RCC_Configuration();
   Moto_Configuration();
  SuperWave_Configuration();
	
	
	SystemInit(); //配置系统时钟为72M   
	
	TIM1_PWM_Init(); //TIM1 PWM波输出初始化,并使能TIM1 PWM输出
    TIM1->CCR2 =28000;  //右轮
		 TIM1->CCR3 =27000;  //左轮
	while(1)
	{
		if(SuperWave_Distance()<=30)
	 {
		 Car_Stop();
		 delay_ms(5);
		 
		 Car_Left();
		 delay_ms(1000);
		 Car_Up();
		 delay_ms(5000);
		 
		 Car_Right();
		 delay_ms(1000);
		 Car_Up();
		 delay_ms(10000);	
		 
		 Car_Right();
		 delay_ms(1000);
		 Car_Up();
		 delay_ms(10000);	
		 
		 Car_Left();
		 delay_ms(1000);
		 Car_Up();
		 delay_ms(5000);	 	 
	 }
	 else
	 {
		 Car_Up();
	 }

	}
}

void RCC_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
	        |RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
}

void SuperWave_Configuration(void) //超声波管脚配置
{	
	GPIO_InitTypeDef GPIO_InitStructure;
//	EXTI_InitTypeDef EXTI_InitStructure;
//	NVIC_InitTypeDef NVIC_InitStructure;
	
	//触发信号
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	
	//返回信号接收
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	//返回信号触发中断
//	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
	
//EXTI_InitStructure.EXTI_Line = EXTI_Line8;
//EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
//EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//EXTI_Init(&EXTI_InitStructure);

//EXTI_InitStructure.EXTI_Line = EXTI_Line8;
//EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//EXTI_Init(&EXTI_InitStructure);

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
//NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//NVIC_Init(&NVIC_InitStructure);
	
}

u32	SuperWave_Distance(void) //超声波测距
{

	u32 n=0,distance=0;
	bool TestControl=true;
	
	//触发20us
		GPIO_SetBits(GPIOB,GPIO_Pin_9);
	  delay_us(20);
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==RESET) //等待反馈信号
	{
	}
	while(TestControl)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==SET)
		{
			delay_us(10);
			n++;
			if(n>400)     //限定测距最大68cm。即4000us的来回总传播时间
			{
				TestControl=false;
			}
		}
		else
		{
			TestControl=false;
		}
	}

	distance=((float)n/100.0)*34.0/2.0; //距离CM

	return distance;
}


void Moto_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

void Car_Up(void)  //前进
{
	//左电机正转
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	
		//右电机反转

	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
	
}

void Car_Right(void)  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{	
	//左电机正转
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
	
		//右电机静止

	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
	
}


void Car_Left(void)  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{
		//左电机静止
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
		//右电机反转

	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}

void Car_Stop(void)  //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{
		//左电机静止
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	
		//右电机静止

	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}





 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@@@皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值