目录

  • <font size=3 face="微软雅黑">1 博客内容
  • <font size=3 face="微软雅黑">2 Simulink控制代码
  • <font size=3 face="微软雅黑">3 轮端电机控制芯片
  • <font size=3 face="微软雅黑">4 主程序(Main.c)
  • <font size=3 face="微软雅黑">5 小车控制头文件(VehCtrl.h)
  • <font size=3 face="微软雅黑">6 小车控制程序(VehCtrl.c)
  • <font size=3 face="微软雅黑">7 结果展示


1 博客内容

      博客内容基于STM32F103 RET6芯片,通过Simulink逻辑生成嵌入式代码,实现PS2手柄遥控PS2手柄遥控麦克纳姆轮小车。Simulink代码使用 TIM3四个通道对应的PA6、PA7、PB0、PB1引脚电压输出。程序结果:实现PS2手柄遥控麦克纳姆轮小车行驶。软件V型开发及Simlulink建模参考博客→软件工程师chhttty:机甲大师机器人控制(Simulink) 。代码下载:https://gitee.com/morven_x/ps2_-veh。

2 Simulink控制代码

      
参见Chhttty博客。

3 轮端电机控制芯片

      参考德州仪器 (TI)DRV8848芯片技术手册 ,1个芯片控制2个电机,功能描述图:

开源esp32麦克纳姆轮小车 stm32麦克纳姆轮程序_arm


      轮端电机芯片控制输入(5个):

开源esp32麦克纳姆轮小车 stm32麦克纳姆轮程序_stm32_02

4 主程序(Main.c)

      代码。

//================================================
//    名称:  Main.c
//    作者:  Morven_X
//    版本:  1.1
//    编制:  2021/01/29 20:16
//    更新:  2021/01/31 12:38
//    功能:  基于STM32F103 RET6芯片,PS2手柄遥控PS2手柄遥控麦克纳姆轮小车
//    简介:  TIM2_CCR1,TIM2_CCR2,TIM2_CCR3,TIM2_CCR4由u8调整int,输出正常
//    Email:  morven_xie@163.com
//================================================

# include "stm32f10x.h"
# include "LED1.h"
# include "Delay.h"
# include "PWM.h"
# include "SPI.h"
# include "VehCtrl.h"
# include "MTSR_MotionSolve.h"



//串口1以波特率9600输出接收到的数据
int PS2_LX,PS2_LY,PS2_RX,PS2_RY,PS2_KEY;
int main(void)
{ 
	JTAG_Init();
	
	Stm32_Clock_Init(9);            //=====系统时钟设置
	Delay_Init();                   //=====延时初始化
	LED_Init();                     //===== LED 连接的硬件接口

	uart_init(72,9600);  
	VehCtrl_MotorEn_Int();
	Delay_ms(100);   
	Motor_EN();
	
	PWM_TIM2_Init();               //TIM2_PWM输出初始化
	PWM_TIM4_Init();  

	Delay_ms(1000);                //=====延时等待初始化稳定
	
	PS2_Init();					   //=====ps2驱动端口初始化
	PS2_SetInit();		 		   //=====ps2配置初始化,配置“红绿灯模式”,并选择是否可以修改
	
	MTSR_MotionSolve_initialize();
	Manual_Code_initialize();
	
	
	
	GPIO_SetBits(GPIOC, GPIO_Pin_3);    //设置LED高电平输出
	Delay_ms(100);
	GPIO_ResetBits(GPIOC, GPIO_Pin_3);  //设置LED高电平输出
	Delay_ms(100);
	GPIO_SetBits(GPIOC, GPIO_Pin_3);   //设置LED高电平输出
	
	MotA_Interface(VeOUTR_int32_BLWheel);
	MotB_Interface(VeOUTR_int32_FLWheel);
	MotC_Interface(VeOUTR_int32_BRWheel);
	MotD_Interface(VeOUTR_int32_FRWheel);
	
	while(1)
		{	
			PS2_Interface();
			MTSR_MotionSolve_step();

			MotA_Interface(VeOUTR_int32_BLWheel);
			MotB_Interface(VeOUTR_int32_FLWheel);
			MotC_Interface(VeOUTR_int32_BRWheel);
			MotD_Interface(VeOUTR_int32_FRWheel);
			
			PS2_LX=PS2_AnologData(PSS_LX);    
			PS2_LY=PS2_AnologData(PSS_LY);
			PS2_RX=PS2_AnologData(PSS_RX);
			PS2_RY=PS2_AnologData(PSS_RY);
			PS2_KEY=PS2_DataKey();	

			Delay_ms(20);

		} 
}

5 小车控制头文件(VehCtrl.h)

#ifndef  _VehCtrl_H
#define  _VehCtrl_H

# include "stm32f10x.h"


extern char PS2Buf[10];

extern u8 VeINPR_uint8_PS2MODE;
extern u8 VeINPR_uint8_PS2LX;
extern u8 VeINPR_uint8_PS2LY;
extern u8 VeINPR_uint8_PS2RX;
extern u8 VeINPR_uint8_PS2RY;

void VehCtrl_MotorEn_Int(void);
void Motor_EN(void);

void PS2_Interface(void);
void Manual_Code_initialize(void);


void MotA_Interface(int val);
void MotB_Interface(int val);
void MotC_Interface(int val);
void MotD_Interface(int val);



#endif

6 小车控制程序(VehCtrl.c)

# include "stm32f10x_gpio.h"
#	include "VehCtrl.h"
#	include "SPI.h"

char PS2Buf[10];

u8 VeINPR_uint8_PS2MODE;
u8 VeINPR_uint8_PS2LX;
u8 VeINPR_uint8_PS2LY;
u8 VeINPR_uint8_PS2RX;
u8 VeINPR_uint8_PS2RY;



int  TIM2_CCR1,TIM2_CCR2,TIM2_CCR3,TIM2_CCR4;
int  TIM4_CCR1,TIM4_CCR2,TIM4_CCR3,TIM4_CCR4;


void VehCtrl_MotorEn_Int(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //使能C口GPIO时钟
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;     	 //选择推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;				//指定引脚PC0,MotEn2
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;		//设置输出速率50MHz
	GPIO_Init(GPIOC,&GPIO_InitStruct);					//初始化外设GPIOC寄存器
	GPIO_ResetBits(GPIOC, GPIO_Pin_0);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能A口GPIO时钟
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;     	 //选择推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;			     //指定引脚PA15,MotEn1
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;	     //设置输出速率50MHz
	GPIO_Init(GPIOA,&GPIO_InitStruct);					 //初始化外设GPIOA寄存器
	GPIO_ResetBits(GPIOA, GPIO_Pin_15);
	
}


void Motor_EN(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_15);                    //PA15_MotorAB_EN
	GPIO_SetBits(GPIOC, GPIO_Pin_0);                     //PC0_MotorAB_EN
}


/*手写代码初始化*/
void Manual_Code_initialize(void)
{
	VeINPR_uint8_PS2MODE = 0;
	VeINPR_uint8_PS2LX = 128;
	VeINPR_uint8_PS2LY = 128;
	VeINPR_uint8_PS2RX = 128;
	VeINPR_uint8_PS2RY = 128;
}


/* PS2接口 */
void PS2_Interface(void)
{
	void PS2_ReadData(void);

	if(PS2_AnologData(1) == 115)
	{
		VeINPR_uint8_PS2MODE = 1;
	}else
	{
		VeINPR_uint8_PS2MODE = 0;
	}
	/* LX,LY,RX,RY */	
	
	VeINPR_uint8_PS2LX = PS2_AnologData(PSS_LX);
	VeINPR_uint8_PS2LY = PS2_AnologData(PSS_LY);
	VeINPR_uint8_PS2RX = PS2_AnologData(PSS_RX);
	VeINPR_uint8_PS2RY = PS2_AnologData(PSS_RY);
	
}

/* 电机驱动接口函数 */

void MotA_Interface(int val)
{
	if(val>20)
	{
		TIM2_CCR1=val+1000;	TIM2_CCR2=0;
		
	}
	else if(val<-20)
	{
		val=-val;
		TIM2_CCR1=0;		TIM2_CCR2=val+1000;          //50%的启动值,参见TI芯片参考手册
	}
	else
	{
		TIM2_CCR1=0;		TIM2_CCR2=0;
	}
	
	TIM_SetCompare1(TIM2,TIM2_CCR1);                     //设置TIM2  CH1占空比输出  PA0
	TIM_SetCompare2(TIM2,TIM2_CCR2);                     //设置TIM2  CH2占空比输出  PA1
}

void MotB_Interface(int val)
{
	
	if(val>20)
	{
		TIM2_CCR3=0;		TIM2_CCR4=val+1000;          //50%的启动值
	}
	else if(val<-20)
	{
		val=-val;
		TIM2_CCR3=val+1000;	TIM2_CCR4=0;
	}
	else
	{
		TIM2_CCR3=0;		TIM2_CCR4=0;
	}
	
		TIM_SetCompare3(TIM2,TIM2_CCR3);                 //设置TIM2  CH1占空比输出  PA2
		TIM_SetCompare4(TIM2,TIM2_CCR4);                 //设置TIM2  CH2占空比输出  PA3
}

void MotC_Interface(int val)
{
	if(val>20)
	{
		TIM4_CCR1=0;		TIM4_CCR2=val+1000;          //50%的启动值
	}
	else if(val<-20)
	{
		val=-val;
		TIM4_CCR1=val+1000;	TIM4_CCR2=0;
	}
	else
	{
		TIM4_CCR1=0;		TIM4_CCR2=0;
	}
	
		TIM_SetCompare1(TIM4,TIM4_CCR1);                 //设置TIM4  CH1占空比输出  PB6
		TIM_SetCompare2(TIM4,TIM4_CCR2);                 //设置TIM4  CH2占空比输出  PB7
}

void MotD_Interface(int val)
{
	if(val>20)
	{
		TIM4_CCR3=val+1000;	TIM4_CCR4=0;
	}
	else if(val<-20)
	{
		val=-val;
		TIM4_CCR3=0;		TIM4_CCR4=val+1000;          //50%的启动值
		
	}
	else
	{
		TIM4_CCR3=0;		TIM4_CCR4=0;
	}
	
	
		TIM_SetCompare3(TIM4,TIM4_CCR3);                 //设置TIM4  CH3占空比输出  PB8
		TIM_SetCompare4(TIM4,TIM4_CCR4);                 //设置TIM4  CH4占空比输出  PB9	
}

7 结果展示

开源esp32麦克纳姆轮小车 stm32麦克纳姆轮程序_初始化_03


开源esp32麦克纳姆轮小车 stm32麦克纳姆轮程序_stm32_04