STM32嵌入式基础开发07-使用PS2手柄遥控麦克纳姆轮小车(7_PS2_Veh)
目录
- <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,MotEn2GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz; //设置输出速率50MHzGPIO_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,MotEn1GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz; //设置输出速率50MHzGPIO_Init(GPIOA,&GPIO_InitStruct); //初始化外设GPIOA寄存器GPIO_ResetBits(GPIOA, GPIO_Pin_15);}void Motor_EN(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_15); //PA15_MotorAB_ENGPIO_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占空比输出 PA0TIM_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占空比输出 PA2TIM_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占空比输出 PB6TIM_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占空比输出 PB8TIM_SetCompare4(TIM4,TIM4_CCR4); //设置TIM4 CH4占空比输出 PB9
}
7 结果展示
>> 更多相关内容,点击Morven_Xie博客概览
STM32嵌入式基础开发07-使用PS2手柄遥控麦克纳姆轮小车(7_PS2_Veh)相关推荐
- 基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究
学校:浙江工业大学 队伍名称:浙工大鸿泉全向 SOLO 队参赛队员:杨一帆.袁启恒.何志涛 带队教师:陈国定.褚衍清 简 介: 本文详细介绍了全向行进组智能车的制作方案.该方案以南京沁恒公司的 CH3 ...
- 基于STM32的麦克纳姆轮小车的寻迹实现
个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-27.html 本项目用STM32F407,麦克纳姆轮小车,八路 ...
- 基于arduino及PS2的麦克纳姆轮遥控小车
实物展示 1.选材用料 2.设计原理 2.代码展示 #include <PS2X_lib.h> #include<AFMotor.h> #define PS2_DAT 13 / ...
- STM32嵌入式基础开发附C-STM32-CAN通讯
目录 1 博客内容 2 STM32芯片.TJA1050.上位机 3 CAN环回模式.轮询/中断接收模式 4 程序原理 5 主程序(Main.c) 6 CAN程序(CAN.c) 7 CAN头文件(CAN ...
- 树莓派小车,从基础上手到完整工程(二)——麦克纳姆轮
搭一个树莓派小车 树莓派小车 麦克纳姆轮 树莓派小车 麦克纳姆轮 po一张原理图,安装的时候注意轮子方向. 我把电机控制部分的代码大致封装了一下,后续可以自行添加其他功能. motor.py impo ...
- Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...
- PS2手柄遥控控制灯开关(arduino)
PS2手柄遥控控制灯开关(arduino) 使用的材料 arduino板子: ps2遥控手柄; 一个5V供电的LDE: 连线 首先按照遥控手柄底座上的英文,你会发现一共有六根线,分别是GND,VCC, ...
- 应邀ITGeGe在线教育社区嵌入式基础开发讲师
最近,被一家IT在线公司邀请去做嵌入式基础课程的讲师,我感觉非常荣幸,虽然我还是菜鸟一个,难得有这样的企业会看得起我,这也是对我的一个磨练吧,可以培养我继续不断学习技术的动力,同时还能将技术通过自身的 ...
- PS2手柄遥控Arduino小车
使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下. PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通 ...
- Linux嵌入式驱动开发零基础入门集合(STM32过渡到Linux嵌入式)
Linux嵌入式驱动开发01--第一个驱动Hello World(附源码) Linux嵌入式驱动开发02--驱动编译到内核 Linux嵌入式驱动开发03--杂项设备驱动(附源码) Linux嵌入式驱动 ...
最新文章
- kerberos java实现,基于kerberos实现jaas登录
- C#创建MQTT客户端接收服务器信息
- 74HC165的使用
- IDEA在jsp页面写out.print()代码报错
- PyTorch基础-猫狗分类实战-10
- CodeForces - 1486B Eastern Exhibition(二维中位数)
- CSS3给页面打标签
- comsol积分函数_COMSOL教程- 巧用PDE、ODE耦合方程实现变量的时间积分或者空间微分...
- 通过conda或者pip安装包时出现There was a problem confirming the ssl certificate报错
- Mysql数据库读写分离的实现
- 服务器的安全措施有哪些呢?
- 怎么设置计算机网络访问权限,Win7无Internet访问权限怎么解决?
- C++模拟手机通信录管理系统
- 在线支付功能实现代码
- Codeforces 300D Painting Square dp
- ios射击类游戏简单代码射击
- Mac配置docker镜像源
- 怎么取消微信送票服务器,智行火车票如何关闭微信自动扣费服务 微信怎么关闭智行火车票自动扣费授权...
- Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again
- 析构函数什么时候会调用?
热门文章
- Windows下设置Mongodb用户名密码
- 联想笔记本键盘排线_联想笔记本键盘维修全过程
- 【2021亲测有效】彻底解决Google地球、Google Earth、谷歌地球启动无法连接到登录服务器、启动黑屏、无法查看历史影像图的方法
- android编程入门
- 博士申请 | 皇家墨尔本理工大学鲍芝峰教授招收数据挖掘方向全奖博士生
- 无线网络密码破解方法
- 思科路由器配置命令(详细命令总结归纳)
- linux计划任务管理: cron定时任务,详解
- windows server 2008 远程终端激活
- spss26没有典型相关性分析_【spss典型相关分析】数学建模__SPSS_典型相关分析