【单片机项目】制作一辆基于STM32的智能小车——A4950电机驱动

A4950电机驱动模块特性

  • 2路电机驱动输出,单板典型最大电流2A
  • 驱动板工作电压范围:7.6V~30V
  • 驱动频率:500Hz~300KHZ
    在这里插入图片描述
    模块接口说明
  1. VM:驱动模块的电源
  2. VCC:接5V输入,不要接3.3V会影响性能
  3. GND:接地引脚

电机A的两个线分别接AOUT1、AOUT2,电机B的两个线分别接BOUT1、BOUT2。控制电机时,直接将PB6、PB7(PB8、PB9)接不同占空比的PWM。由于AIN1和AIN2(BIN1和BIN2)之间存在压差,电机可以转动,并且压差越大,转速越快。凭此我们通过调节PWM控制小车速度以及方向。

这里我们使用TIM4的1、2、3、4通道

timer.h

#ifndef __TIMER_H
#define __TIMER_H  
#include "sys.h"

void pwm_init(u16 arr,u16 psc);

#endif

timer.c

#include "timer.h"
void pwm_init(u16 arr,u16 psc)
{
 GPIO_InitTypeDef GPIO_Initure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef TIM4_CHxHandler;//定时器4通道x句柄
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
 
 GPIO_Initure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//配置IO
    GPIO_Initure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Initure.GPIO_Speed=GPIO_Speed_50MHz; 
    GPIO_Init(GPIOB,&GPIO_Initure);
 GPIO_Initure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
 GPIO_Init(GPIOB,&GPIO_Initure);
 
 	TIM_TimeBaseStructure.TIM_Period = arr;//配置定时器
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 
	
	TIM4_CHxHandler.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM4_CHxHandler.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM4_CHxHandler.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性高
																		 
	TIM_OC1Init(TIM4, &TIM4_CHxHandler); 		//配置pwm通道
	TIM_OC2Init(TIM4, &TIM4_CHxHandler);	
	TIM_OC3Init(TIM4, &TIM4_CHxHandler);	
	TIM_OC4Init(TIM4, &TIM4_CHxHandler);
	
	
	TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);//预装载使能
	TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
	TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
	
	TIM_Cmd(TIM4,ENABLE);  //使能定时器
	

}

motor.h

#ifndef __MOTOR_H
#define __MOTOR_H	 
#include "sys.h"

void motor_forth(void);
void motor_back(void);
void motor_left(void);
void motor_right(void);
void motor_stop(void);

#endif

motor.c

#include "motor.h"
#include "delay.h"

//TIM_SetCompare1,2对应左边电机,TIM_SetCompare3,4对应右边电机

void motor_forth()//前行
{
	TIM_SetCompare1(TIM4,599);
	TIM_SetCompare2(TIM4,899);
	TIM_SetCompare3(TIM4,593);
	TIM_SetCompare4(TIM4,899);		
}

void motor_back()//后退
{
	TIM_SetCompare1(TIM4,899);
	TIM_SetCompare2(TIM4,700);
	TIM_SetCompare3(TIM4,899);
	TIM_SetCompare4(TIM4,700);	
}

void motor_left()//左转
{
	TIM_SetCompare1(TIM4,899);
	TIM_SetCompare2(TIM4,700);
	TIM_SetCompare3(TIM4,750);
	TIM_SetCompare4(TIM4,899);	
			delay_ms(565);
			motor_stop();	
}


void motor_right()//右转
{
	TIM_SetCompare1(TIM4,750);
	TIM_SetCompare2(TIM4,899);
	TIM_SetCompare3(TIM4,899);
	TIM_SetCompare4(TIM4,700);	
			delay_ms(593);
			motor_stop();	
}

void motor_stop()
{
	TIM_SetCompare1(TIM4,899);
	TIM_SetCompare2(TIM4,899);
	TIM_SetCompare3(TIM4,899);
	TIM_SetCompare4(TIM4,899);	

}


下面是裸机跑的主函数————(私奔?裸奔??)
main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "motor.h"
#include "timer.h"
/************************************************************************/


 int main(void)
 {	
	SystemInit();
	delay_init();	    //延时函数初始化	  nms<=1864  
	LED_Init();		  	//初始化与LED连接的硬件接口
	pwm_init(899,0);
	motor_stop();
	delay_ms(1800);
	delay_ms(1800);
	while(1)
	{
		LED=0;
		motor_forth();
		delay_ms(1500);

		LED=1;
		motor_stop();
		delay_ms(1500);
		
		LED=0;
		motor_left();
		delay_ms(900);
		
		LED=1;
		motor_stop();
		delay_ms(1500);
		
		LED=0;
		motor_forth();
		delay_ms(1000);
		
		LED=1;
		motor_stop();
		delay_ms(1500);
		
		LED=0;
		motor_right();
		delay_ms(900);
		
		LED=1;
		motor_stop();
		delay_ms(1500);
	}
 }

主函数功能是测试电机运作是否正常,以及调试出合适的PWM输出。

STM32避障小车结合强化学习是一个非常有趣的项目,它涉及到嵌入式系统、传感器技术以及机器学习等领域。下面将为你详细介绍: ### STM32简介 STM32是由STMicroelectronics生产的一系列基于ARM Cortex-M内核的32位微控制器单元(MCU)。它们因其高性能、低成本和广泛的外设支持而广受欢迎。 ### 避障小车的基本原理 对于一款普通的避障小车来说,通常会配备超声波测距模块或其他类型的红外线距离感应装置来检测前方是否有障碍物,并通过电机驱动轮子转向以避开障碍物。这类系统的控制逻辑相对简单固定,例如当遇到障碍物时就向左转直到无障碍为止。 ### 强化学习的应用 然而,在引入了“强化学习”这一先进的算法之后,则可以使我们的机器人具备更智能的行为模式! #### 环境设定 - **状态空间**:包括但不限于当前速度、方向角及各个传感器反馈的距离信息等。 - **动作集合**:比如加速前进、减速停止或是调整左右舵机角度来进行转弯操作等有限种离散的选择。 - **奖励函数设计**:这是最关键的部分之一。为了训练出理想的策略模型,我们需要精心规划每一时刻给予环境反馈的具体数值——如果成功绕过了一个静态物体并且保持直线行驶较长时间可以给正分;反之撞到墙上则扣除分数... 经过一段时间的学习过程后,理论上就能让这辆由stm32单片机作为核心处理器的小型自动驾驶汽车学会如何高效地穿越复杂地形啦~
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值