笔记目录

  • 一.整体思路
  • 二.富斯i6遥控器
    • 1.富斯i6刷十通道
    • 2.富斯i6玩模拟器
  • 三.cubemx配置
    • 1.时钟和sys配置
    • 2.串口配置
    • 3.输入捕获的配置
    • 4.PWM输出配置
    • 5.中断配置
    • 6.IO口配置
    • 7.生成代码
  • 四.程序
    • 1.printf重映射
    • 2. 脉冲捕获和pwm输出
    • 3.更改遥控器配置
  • 展示
  • 代码
  • 学习时间

一.整体思路

富斯i6遥控器发送指令

接收器接收->stm32解析接收器接受的pwm波形->stm32调整pwm并传给L298N->驱动电机
(这里使用的接收器是FS-iA6,没有PPM输出只有PWM输出)

二.富斯i6遥控器

1.富斯i6刷十通道

参考资料: https://www.moz8.com/forum.php?mod=viewthread&tid=63118

软件及固件下载

链接:https://pan.baidu.com/s/1mYgsdUY5MKstdEMBARQfIw
提取码:6666
复制这段内容后打开百度网盘手机App,操作更方便哦

2.富斯i6玩模拟器

需要买一个加密狗。
穿越机模拟器适用于windows(我只试过win10)

下载地址:链接:https://pan.baidu.com/s/14yvS_LbgzKS6NVhknLtkxw 提取码:6666 复制这段内容后打开百度网盘手机App,操作更方便哦

三.cubemx配置

这里使用的是正点原子的精英板(stm32f103ZET6)
硬件连线:

1.时钟和sys配置



2.串口配置

3.输入捕获的配置


4.PWM输出配置


5.中断配置

6.IO口配置

因为要用L298N除了两个pwm信号线之外还需要四根线。

7.生成代码


四.程序

1.printf重映射

打开生成好的代码,在usart.c程序中的/* USER CODE BEGIN 0 *//* USER CODE END 0 */之间加入以下代码就可以使用printf了

#include "stdio.h"
#if 1
//#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{ int handle;
}; FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{ x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(uint8_t)ch;      return ch;
}
#endif

2. 脉冲捕获和pwm输出

输入捕获程序参考:https://www.pianshen.com/article/367541452/
pwm程序参考:http://news.eeworld.com.cn/mcu/ic464736.html

在main.c中添加头文件

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

在main.c中进行通道使能

 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//启动。置1  CCER的输出使能位bit4HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//CCER的bit0HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);

/* USER CODE BEGIN 4 */中填写捕获处理以及调整pwm的代码
这里只用到了遥控器的通道一和通道二,通过串口可以看出遥控器最大量程为50。

输入捕获:49(低)-74(中)-99(高)

电机pwm范围是:0(低)-999(中)-0(高)

通过一系列的计算得到了下面的程序

/* USER CODE BEGIN 4 */
uint16_t    Channel1HighTime, Channel2HighTime, Channel3HighTime, Channel4HighTime;
uint16_t    Channel1Period, Channel2Period, Channel3Period, Channel4Period;
uint8_t     Channel1Edge = 0, Channel2Edge = 0, Channel3Edge = 0, Channel4Edge = 0;
uint16_t    Channel1Percent, Channel2Percent, Channel3Percent, Channel4Percent;
uint16_t    Channel1PercentTemp[3] = {0, 0, 0};
uint8_t     Channel1TempCount = 0;
uint16_t    Channel1RisingTimeLast=0, Channel1RisingTimeNow, Channel1FallingTime;
uint16_t    Channel2RisingTimeLast=0, Channel2RisingTimeNow, Channel2FallingTime;
uint16_t    Channel3RisingTimeLast=0, Channel3RisingTimeNow, Channel3FallingTime;
uint16_t    Channel4RisingTimeLast=0, Channel4RisingTimeNow, Channel4FallingTime;uint16_t    Channel1pwm, Channel2pwm, Channel3pwm, Channel4pwm;void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function Should not be modified, when the callback is needed,the __HAL_TIM_IC_CaptureCallback could be implemented in the user file*/if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){if(Channel1Edge == 0){Channel1RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);//获取上升沿时间点__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);//切换捕获极性HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);Channel1Edge = 1;if(Channel1RisingTimeLast == 0){Channel1Period = 0;}else{if(Channel1RisingTimeNow > Channel1RisingTimeLast){Channel1Period = Channel1RisingTimeNow - Channel1RisingTimeLast;}else{Channel1Period = Channel1RisingTimeNow + 0xffff - Channel1RisingTimeLast + 1;}}Channel1RisingTimeLast = Channel1RisingTimeNow;}else if(Channel1Edge == 1){Channel1FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);if(Channel1FallingTime < Channel1RisingTimeNow){Channel1HighTime = Channel1FallingTime + 0xffff - Channel1RisingTimeNow + 1;}else{Channel1HighTime = Channel1FallingTime - Channel1RisingTimeNow;}if(Channel1Period != 0){Channel1Percent = (uint8_t)(((float)Channel1HighTime / Channel1Period) * 1000);Channel1pwm=(19.98*Channel1Percent-979.02);//Channel1pwm=39.96*Channel1Percent-2957.04;}Channel1Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){if(Channel2Edge == 0){Channel2RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);Channel2Edge = 1;if(Channel2RisingTimeLast == 0){Channel2Period = 0;}else{if(Channel2RisingTimeNow > Channel2RisingTimeLast){Channel2Period = Channel2RisingTimeNow - Channel2RisingTimeLast;}else{Channel2Period = Channel2RisingTimeNow + 0xffff - Channel2RisingTimeLast + 1;}}Channel2RisingTimeLast = Channel2RisingTimeNow;}else if(Channel2Edge == 1){Channel2FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);   __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);if(Channel2FallingTime < Channel2RisingTimeNow){Channel2HighTime = Channel2FallingTime + 0xffff - Channel2RisingTimeNow + 1;}else{Channel2HighTime = Channel2FallingTime - Channel2RisingTimeNow;}if(Channel2Period != 0){Channel2Percent = (uint8_t)(((float)Channel2HighTime / Channel2Period) * 1000);Channel2pwm=(39.96*Channel2Percent-2957.04);//printf("Channel1 = %d    Channel1pwm = %d\r\n", Channel1Percent,Channel1pwm);//printf("Channel2 = %d  Channel2pwm = %d\r\n", Channel2Percent,Channel2pwm);if(Channel2Percent<74)   //后退{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_RESET);
//                      if(Channel1Percent<74)
//                          {
//                          __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, Channel1pwm);
//                      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);
//                          }
//                          else if(Channel1Percent==74) //后退
//                          {__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("后退");
//                          }
//                          else
//                          {
//                          __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);
//                      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, Channel1pwm);
//                          }}else if(Channel2Percent==74)   //停止{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);printf("停止");}else  {HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_6,GPIO_PIN_SET);if(Channel1Percent<74)  //左转{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel1pwm);printf("左转 %d",Channel1pwm);}else if(Channel1Percent==74)  //前进{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2,999-Channel2pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("前进");}else   //右转{__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2,Channel1pwm);__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 999-Channel2pwm);printf("右转 %d\r\n",1000-Channel1pwm);}}}Channel2Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3){if(Channel3Edge == 0){Channel3RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);Channel3Edge = 1;if(Channel3RisingTimeLast == 0){Channel3Period = 0;}else{if(Channel3RisingTimeNow > Channel3RisingTimeLast){Channel3Period = Channel3RisingTimeNow - Channel3RisingTimeLast;}else{Channel3Period = Channel3RisingTimeNow + 0xffff - Channel3RisingTimeLast + 1;}}Channel3RisingTimeLast = Channel3RisingTimeNow;}else if(Channel3Edge == 1){Channel3FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);  __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);if(Channel3FallingTime < Channel3RisingTimeNow){Channel3HighTime = Channel3FallingTime + 0xffff - Channel3RisingTimeNow + 1;}else{Channel3HighTime = Channel3FallingTime - Channel3RisingTimeNow;}if(Channel3Period != 0){Channel3Percent = (uint8_t)(((float)Channel3HighTime / Channel3Period) * 1000);//printf("Channel3 = %d    ", Channel3Percent);}Channel3Edge = 0;}}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4){if(Channel4Edge == 0){Channel4RisingTimeNow = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);Channel4Edge = 1;if(Channel4RisingTimeLast == 0){Channel4Period = 0;}else{if(Channel4RisingTimeNow > Channel4RisingTimeLast){Channel4Period = Channel4RisingTimeNow - Channel4RisingTimeLast;}else{Channel4Period = Channel4RisingTimeNow + 0xffff - Channel4RisingTimeLast + 1;}}Channel4RisingTimeLast = Channel4RisingTimeNow;}else if(Channel4Edge == 1){Channel4FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);    __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);if(Channel4FallingTime < Channel4RisingTimeNow){Channel4HighTime = Channel4FallingTime + 0xffff - Channel4RisingTimeNow + 1;}else{Channel4HighTime = Channel4FallingTime - Channel4RisingTimeNow;}if(Channel4Period != 0){Channel4Percent = (uint8_t)(((float)Channel4HighTime / Channel4Period) * 1000);//printf("Channel4 = %d\r\n", Channel4Percent);}Channel4Edge = 0;}}
}/* USER CODE END 4 */

3.更改遥控器配置



展示

VID20210406215438

代码

点这里下载

学习时间

2021.4.6


用富斯i6遥控器控制船相关推荐

  1. 图文并茂详细教程之——富斯I6遥控器电压回传模块的安装和使用(苍穹四轴)

    摘自:https://mp.weixin.qq.com/s/Avo1RlEkWL-qLLJ2S7RA6w 图文并茂详细教程之--富斯I6遥控器电压回传模块的安装和使用 CJKK 苍穹四轴DIY 201 ...

  2. arduino遥控器控制灯开关以及亮度

    遥控器控制灯的开关,能能通过按ch进行,其他的键无法进行操作. 在控制亮度的情况下,可以通过ch+和ch-加减亮度的数值进行增加或降低亮度.同样,在灯没有亮的情况之下是不允许调节亮度的,当然,灯也不会 ...

  3. 如何使用Logitech Harmony遥控器控制智能家居设备

    On some remotes, you may also have home control buttons that you can use with devices like Philips H ...

  4. arduino 红外遥控器控制LED灯

    /* 日期:2016.9.1 功能:红外遥控器控制LED灯 开,关,闪烁,呼吸 元件:跳线公公头 * 5led 220欧电阻红外接收管,红外遥控 接线:红外灯面向自己从左到右分别接 IO3 ,GND ...

  5. Arduino用遥控器控制LED灯开关和亮度

    最近在学习物联网,毕竟现在人工智能包括无人驾驶,自动避障等行业的火热,所以在这里分享学习笔记 工具: 硬件:Arduino,遥控器,红外线,传感器,网上有卖不是很贵十几块钱 软件:Mixly 步骤 一 ...

  6. html控制树莓派小车,用家里旧的红外遥控器控制树莓派小车

    0x01 前言 红外遥控是一种无线.非接触控制技术,在工业控制.航空航天.家电等领域都得到了广泛应用.大部分的电视的遥控器,空调遥控器就都是红外遥控.在baidu上检索了树莓派小车的各种控制方案,没有 ...

  7. 最简单DIY蓝牙PS2遥控器控制蓝牙智能小车

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 文章目录 51单片 ...

  8. 基于Arduino的红外遥控器控制MP3播放

    基于Arduino的红外遥控器控制MP3播放(MP3音乐模块.红外接收模块.红外遥控器) ✨通过红外遥控器来控制音乐播放

  9. 技术分享 | 遥控器控制(Joystick)

    一.遥控器控制 在真实飞行过程中,我们使用真实的遥控器作为控制无人机的主要操作来源,遥控器始终拥有最高的权限,精湛的遥控器操作手法可以保证无人机安稳着陆,但对于很多非专业人士来说,遥控的操作技巧是需要 ...

最新文章

  1. 选本还是从缓存设计理念选择更好
  2. Redis 通用 key 命令
  3. sobol敏感性分析 matlab代码
  4. ubuntu 安装自动解决依赖冲突
  5. python双向索引什么意思_python字典支持双向索引吗
  6. IIS/ASP.NET 管道
  7. java数组对角线的和_java – 2d数组对角线填充
  8. 怎么解决tomcat端口占用问题?
  9. FlashFTP教程
  10. textarea高度自适应且不出现滚动条
  11. linux下制作dos启动u盘启动,linux dos启动盘怎样做
  12. 含参积分求导/积分上限函数求导/
  13. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别
  14. 除了啤酒与尿布 大数据又助电商玩口碑营销
  15. 【微信网页授权】SpringBoot+uniapp实现网页授权获取用户基本信息
  16. Java实现旅行商问题
  17. 27年台湾珍珠鲜奶茶品牌Sharetea将引进上海
  18. 南昌大学计算机考研学硕,南昌大学电子信息工程专硕考研心得
  19. web前端常用网址大全
  20. Python每日bug定时发送飞书群

热门文章

  1. java实现迷宫问题
  2. 【区块链】以太坊L2扩容方案与零知识证明
  3. knn分类算法实现手写体数字识别python
  4. java棋盘覆盖_棋盘覆盖问题实现
  5. vue 条件判断绑定内联样式
  6. 计算机主板的风扇控制,主板风扇调速知识【图文详解】
  7. medoo update mysql_更新方法:Update API-Medoo使用指南
  8. 第十八章 使用系统监视器 -设置系统监视器选项
  9. 免费的PDF转Word工具(简单易用)
  10. 甲骨文中国乱象:渠道混乱售后屡遭投诉