STM32小车四路pwm源程序,可寻迹,oled显示,蓝牙通信,在手机端显示时间可,pid调节

这个c8t6小车是我参加学校电赛的时候做的,目前具有红外寻迹,oled实时显示时间,蓝牙通信,在手机端上显示小车运动时间,还有加入了mpu6050模块和pid算法,实现了小车在跷跷板上的平衡。小车的照片和原理图都放在附件里了,大家可以看一看。
制作出来的实物图如下

在这里插入图片描述
电路图·
电机部分的程序,其他的在我·附件里

**

  • @par Copyright ©: 2010-2019, Shenzhen Yahboom Tech

  • @file app_motor.c

  • @author liusen

  • @version V1.0

  • @brief 小车运动控制函数

  • @details

  • @par History 见如下说明

  • version: liusen_20170717

*/

#include “app_motor.h”

#include “sys.h”

#include “bsp_motor.h”

#define LeftMotor_Go() {GPIO_SetBits(Motor_Port, Left_MotoA_Pin); GPIO_ResetBits(Motor_Port, Left_MotoB_Pin);GPIO_SetBits(Motor_Port1, Left_MotoA1_Pin); GPIO_ResetBits(Motor_Port1, Left_MotoB1_Pin);}//反转

#define LeftMotor_Back() {GPIO_ResetBits(Motor_Port, Left_MotoA_Pin); GPIO_SetBits(Motor_Port, Left_MotoB_Pin);GPIO_ResetBits(Motor_Port1, Left_MotoA1_Pin); GPIO_SetBits(Motor_Port1, Left_MotoB1_Pin);}//正转

#define LeftMotor_Stop() {GPIO_ResetBits(Motor_Port, Left_MotoA_Pin); GPIO_ResetBits(Motor_Port, Left_MotoB_Pin);GPIO_ResetBits(Motor_Port1, Left_MotoA1_Pin); GPIO_ResetBits(Motor_Port1, Left_MotoB1_Pin);}//停止

#define RightMotor_Go() {GPIO_SetBits(Motor_Port, Right_MotoA_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB_Pin);GPIO_SetBits(Motor_Port, Right_MotoA1_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB1_Pin);}//反转

#define RightMotor_Back() {GPIO_ResetBits(Motor_Port, Right_MotoA_Pin); GPIO_SetBits(Motor_Port, Right_MotoB_Pin);GPIO_ResetBits(Motor_Port, Right_MotoA1_Pin); GPIO_SetBits(Motor_Port, Right_MotoB1_Pin);}//正转

#define RightMotor_Stop() {GPIO_ResetBits(Motor_Port, Right_MotoA_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB_Pin);GPIO_ResetBits(Motor_Port, Right_MotoA1_Pin); GPIO_ResetBits(Motor_Port, Right_MotoB1_Pin);}//停止

#define LeftMotorPWM(Speed) TIM_SetCompare2(TIM4, Speed); //左前

#define RightMotorPWM(Speed) TIM_SetCompare1(TIM4, Speed); //右前

#define Left1MotorPWM(Speed) TIM_SetCompare3(TIM4, Speed); //左后

#define Right1MotorPWM(Speed) TIM_SetCompare4(TIM4, Speed); //右后

/**

  • Function Car_Run

  • @author liusen

  • @date 2017.07.17

  • @brief 小车前进

  • @param[in] Speed (0~7200) 速度范围

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_Run(int Speed)

{

LeftMotor_Go();

RightMotor_Go();

LeftMotorPWM(Speed);

RightMotorPWM(Speed);

Left1MotorPWM(Speed);

Right1MotorPWM(Speed);

}

/**

  • Function Car_Back

  • @author liusen

  • @date 2017.07.17

  • @brief 小车后退

  • @param[in] Speed (0~7200) 速度范围

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_Back(int Speed)

{

LeftMotor_Back();

RightMotor_Back();

LeftMotorPWM(Speed);

RightMotorPWM(Speed);

Left1MotorPWM(Speed);

Right1MotorPWM(Speed);

}

/**

  • Function Car_Left

  • @author liusen

  • @date 2017.07.17

  • @brief 小车左转

  • @param[in] Speed (0~7200) 速度范围

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_Left(int Speed)

{

LeftMotor_Stop();

RightMotor_Go();

LeftMotorPWM(0);

RightMotorPWM(Speed);

Left1MotorPWM(0);

Right1MotorPWM(Speed);

}

/**

  • Function Car_Right

  • @author liusen

  • @date 2017.07.17

  • @brief 小车右转

  • @param[in] Speed (0~7200) 速度范围

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_Right(int Speed)

{

LeftMotor_Go();

RightMotor_Stop();

LeftMotorPWM(Speed);

RightMotorPWM(0);

Left1MotorPWM(Speed);

Right1MotorPWM(0);

}

/**

  • Function Car_Stop

  • @author liusen

  • @date 2017.07.17

  • @brief 小车刹车

  • @param[in] void

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_Stop(void)

{

LeftMotor_Stop();

RightMotor_Stop();

LeftMotorPWM(0);

RightMotorPWM(0);

Left1MotorPWM(0);

Right1MotorPWM(0);

}

void Car_Back_Left(int Speed)

{

LeftMotor_Stop();

RightMotor_Back();

LeftMotorPWM(0);

RightMotorPWM(Speed);

Left1MotorPWM(0);

Right1MotorPWM(Speed);

}

void Car_Back_Right(int Speed)

{

LeftMotor_Back();

RightMotor_Stop();

LeftMotorPWM(Speed);

RightMotorPWM(0);

Left1MotorPWM(Speed);

Right1MotorPWM(0);

}

/**

  • Function Car_SpinLeft

  • @author liusen

  • @date 2017.07.17

  • @brief 小车左旋

  • @param[in] LeftSpeed:左电机速度 RightSpeed:右电机速度 取值范围:(0~7200)

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_SpinLeft(int LeftSpeed, int RightSpeed)

{

LeftMotor_Back();

RightMotor_Go();

LeftMotorPWM(LeftSpeed);

RightMotorPWM(RightSpeed);

Left1MotorPWM(LeftSpeed);

Right1MotorPWM(RightSpeed);

}

/**

  • Function Car_SpinRight

  • @author liusen

  • @date 2017.07.17

  • @brief 小车右旋

  • @param[in] LeftSpeed:左电机速度 RightSpeed:右电机速度 取值范围:(0~7200)

  • @param[out] void

  • @retval void

  • @par History 无

*/

void Car_SpinRight(int LeftSpeed, int RightSpeed)

{

LeftMotor_Go();

RightMotor_Back();
加粗样式
Right1MotorPWM(RightSpeed);

LeftMotorPWM(LeftSpeed);

RightMotorPWM(RightSpeed);

}

1.时钟源 外部时钟 2.GPIO (实验:点亮LED灯,获取引脚的电平高低,将对应引脚置高置低)。 3.PWM-脉宽调制 主要是调节占空比(在小车中用来实现小车的加减速)。 4.TIMX定时器 5.红外遥控 主要运用了EXTI(外部中断/事件控制器),系统延时(系统滴答定时器SysTick)。 6.超声波避障 了解了超声波工作的原理,主要运用了TIM2定时器(用来定时测距),GPIO口。 7.红外探测 通过对障碍物和光的感应来返回电平的状态,从而达到避障和巡线效果。 8.测速码盘 (通过检测码盘上的凹槽数来获取脉冲数,通过计算公式得到小车当前速度) TIM3定时器(定时测速)。 9.PID算法 为了使小车的速度更快的达到目标值,获取更稳定的速度。 10.系统的使用 我们在小车内加入系统,对小车的数据获取,状态实现任务化,使小车内的运作更加有序。我们主要使用μC/OS-II系统内核来实现系统。在实现过程中,我们了解了系统的任务调度以及任务运行和处理器之间的关系(多任务同时运行)。 μC/OS-II内核中的任务控制块,任务状态,以及多任务和任务的优先级类似操作系统中的进程操作。 11.任务间的通信 主要用到信号量(主要就是PV操作 P操作:占用资源。V操作:释放资源);邮箱(邮箱可以使一个任务或者中断服务子程序向另一个任务发送指针型的变量,通常该指针指向包含了“消息”特定的数据结构)。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值