我是靠谱客的博主 想人陪手机,最近开发中收集的这篇文章主要介绍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 结果展示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复