我是靠谱客的博主 想人陪手机,最近开发中收集的这篇文章主要介绍STM32嵌入式基础开发07-使用PS2手柄遥控麦克纳姆轮小车(7_PS2_Veh)1 博客内容2 Simulink控制代码3 轮端电机控制芯片4 主程序(Main.c)5 小车控制头文件(VehCtrl.h)6 小车控制程序(VehCtrl.c)7 结果展示,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • <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个电机,功能描述图:
在这里插入图片描述
      轮端电机芯片控制输入(5个):
在这里插入图片描述

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 结果展示

在这里插入图片描述
在这里插入图片描述

>> 更多相关内容,点击Morven_Xie博客概览

最后

以上就是想人陪手机为你收集整理的STM32嵌入式基础开发07-使用PS2手柄遥控麦克纳姆轮小车(7_PS2_Veh)1 博客内容2 Simulink控制代码3 轮端电机控制芯片4 主程序(Main.c)5 小车控制头文件(VehCtrl.h)6 小车控制程序(VehCtrl.c)7 结果展示的全部内容,希望文章能够帮你解决STM32嵌入式基础开发07-使用PS2手柄遥控麦克纳姆轮小车(7_PS2_Veh)1 博客内容2 Simulink控制代码3 轮端电机控制芯片4 主程序(Main.c)5 小车控制头文件(VehCtrl.h)6 小车控制程序(VehCtrl.c)7 结果展示所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部