笔记目录
一.整体思路
富斯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,<