目录

  • <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)相关推荐

  1. 基于 RT-Thread的麦克纳姆轮小车循迹运动控制算法开发和研究

    学校:浙江工业大学 队伍名称:浙工大鸿泉全向 SOLO 队参赛队员:杨一帆.袁启恒.何志涛 带队教师:陈国定.褚衍清 简 介: 本文详细介绍了全向行进组智能车的制作方案.该方案以南京沁恒公司的 CH3 ...

  2. 基于STM32的麦克纳姆轮小车的寻迹实现

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-27.html 本项目用STM32F407,麦克纳姆轮小车,八路 ...

  3. 基于arduino及PS2的麦克纳姆轮遥控小车

    实物展示 1.选材用料 2.设计原理 2.代码展示 #include <PS2X_lib.h> #include<AFMotor.h> #define PS2_DAT 13 / ...

  4. STM32嵌入式基础开发附C-STM32-CAN通讯

    目录 1 博客内容 2 STM32芯片.TJA1050.上位机 3 CAN环回模式.轮询/中断接收模式 4 程序原理 5 主程序(Main.c) 6 CAN程序(CAN.c) 7 CAN头文件(CAN ...

  5. 树莓派小车,从基础上手到完整工程(二)——麦克纳姆轮

    搭一个树莓派小车 树莓派小车 麦克纳姆轮 树莓派小车 麦克纳姆轮 po一张原理图,安装的时候注意轮子方向. 我把电机控制部分的代码大致封装了一下,后续可以自行添加其他功能. motor.py impo ...

  6. Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)

    文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...

  7. PS2手柄遥控控制灯开关(arduino)

    PS2手柄遥控控制灯开关(arduino) 使用的材料 arduino板子: ps2遥控手柄; 一个5V供电的LDE: 连线 首先按照遥控手柄底座上的英文,你会发现一共有六根线,分别是GND,VCC, ...

  8. 应邀ITGeGe在线教育社区嵌入式基础开发讲师

    最近,被一家IT在线公司邀请去做嵌入式基础课程的讲师,我感觉非常荣幸,虽然我还是菜鸟一个,难得有这样的企业会看得起我,这也是对我的一个磨练吧,可以培养我继续不断学习技术的动力,同时还能将技术通过自身的 ...

  9. PS2手柄遥控Arduino小车

    使用手柄遥控小车是经常要用到的,看到PS2手柄很6,就拿来尝试一下. PS2手柄是索尼的PlayStation2游戏机的遥控手柄,因为这款手柄性价比较高,按键丰富,方便扩展到其它应用中,后来有人将其通 ...

  10. Linux嵌入式驱动开发零基础入门集合(STM32过渡到Linux嵌入式)

    Linux嵌入式驱动开发01--第一个驱动Hello World(附源码) Linux嵌入式驱动开发02--驱动编译到内核 Linux嵌入式驱动开发03--杂项设备驱动(附源码) Linux嵌入式驱动 ...

最新文章

  1. kerberos java实现,基于kerberos实现jaas登录
  2. C#创建MQTT客户端接收服务器信息
  3. 74HC165的使用
  4. IDEA在jsp页面写out.print()代码报错
  5. PyTorch基础-猫狗分类实战-10
  6. CodeForces - 1486B Eastern Exhibition(二维中位数)
  7. CSS3给页面打标签
  8. comsol积分函数_COMSOL教程- 巧用PDE、ODE耦合方程实现变量的时间积分或者空间微分...
  9. 通过conda或者pip安装包时出现There was a problem confirming the ssl certificate报错
  10. Mysql数据库读写分离的实现
  11. 服务器的安全措施有哪些呢?
  12. 怎么设置计算机网络访问权限,Win7无Internet访问权限怎么解决?
  13. C++模拟手机通信录管理系统
  14. 在线支付功能实现代码
  15. Codeforces 300D Painting Square dp
  16. ios射击类游戏简单代码射击
  17. Mac配置docker镜像源
  18. 怎么取消微信送票服务器,智行火车票如何关闭微信自动扣费服务 微信怎么关闭智行火车票自动扣费授权...
  19. Springboot关于 Circular view path [xxx]: would dispatch back to the current handler URL [xxx] again
  20. 析构函数什么时候会调用?

热门文章

  1. Windows下设置Mongodb用户名密码
  2. 联想笔记本键盘排线_联想笔记本键盘维修全过程
  3. 【2021亲测有效】彻底解决Google地球、Google Earth、谷歌地球启动无法连接到登录服务器、启动黑屏、无法查看历史影像图的方法
  4. android编程入门
  5. 博士申请 | 皇家墨尔本理工大学鲍芝峰教授招收数据挖掘方向全奖博士生
  6. 无线网络密码破解方法
  7. 思科路由器配置命令(详细命令总结归纳)
  8. linux计划任务管理: cron定时任务,详解
  9. windows server 2008 远程终端激活
  10. spss26没有典型相关性分析_【spss典型相关分析】数学建模__SPSS_典型相关分析