用富斯i6遥控器控制船

您所在的位置:网站首页 富斯ia6b接收机ibus怎么接 用富斯i6遥控器控制船

用富斯i6遥控器控制船

2024-02-28 12:55| 来源: 网络整理| 查看: 265

笔记目录 一.整体思路二.富斯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的输出使能位bit4 HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//CCER的bit0 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);

在/* 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 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 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 // __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 __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 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 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3