事件起因

因为给PX4测试缺少遥控器,手撸了一套支持PPM的遥控器系统,这篇文章将在接收机上遇到的问题分享一二,供大家借鉴。

1.需求分析

接收机需要输出至少8通道的PPM信号,可以将*通PPM信号分隔为17段,其中,8段的时间为可变时间间隔,用于携带信号,8段为相同的时间间隔,用于定位脉冲位置,最后一段是帧间隔,为一段2ms以上的低电平,用于区分不同的帧数据。无线通信部分,使用成熟的24L01驱动程序,连SPI接口在内共占用6个IO口。

2.实现过程

有几种比较常见的错误思路,一是使用微秒定时实现精确控制,二是使用PWM生成器改装,主要是因为PPM信号,是一种周期恒定,但是周期内部几路的PWM信号占空比不同的信号,于是我们不能使用传统的PWM信号,在每一次的结束中断里加入占空比的改变来实现PPM信号的输出,这样的PPM信号每一路都是最大值,根本不能区分,我们要做的是,同时改变PWM信号的占空比和周期长度,只有这种方式才能实现可被解析的PPM信号。
因此就有两种方法,一是使用PWM结束中断,在一周期PWM信号结束的同时,改变其占空比和周期,这适合于STM32这种定时器选项很多的单片机,还有一种比较简单的办法,就是使用我上面所说的17(19段)段输出法,只使用一个定时器中断,编写一个状态机来实现对中断时间的自动更改,来实现PPM信号,我这里使用了第二种方案,但是只实现了17段PPM,只有7通道信号,已经足够我调试使用,对8通道有需求的,可以自行更改程序。

3.配置和程序代码



一定要关闭自动重装,这种方式的关键就在于手动重装定时器,自动重装理论上会延后一个周期。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{//if(htim->Instance == TIM3)
//{
//HAL_GPIO_WritePin(PPM_GPIO_Port, PPM_Pin, GPIO_PIN_SET);
//HAL_TIM_Base_Start_IT(&htim14);//开始1ms计时
//}
//HAL_GPIO_WritePin(PPM_GPIO_Port, PPM_Pin, GPIO_PIN_RESET);    if(i1<8)
{if(k1 == 0)
{
TIM14->ARR = 1000;
k1 = 1;
HAL_GPIO_WritePin(PPM_GPIO_Port, PPM_Pin, GPIO_PIN_SET);
}
else
{
TIM14->ARR = ARR1[i1];
i1++;
k1 = 0;
HAL_GPIO_WritePin(PPM_GPIO_Port, PPM_Pin, GPIO_PIN_RESET);
}
}
else
{
i1 =0;
TIM14->ARR = j1;
HAL_GPIO_WritePin(PPM_GPIO_Port, PPM_Pin, GPIO_PIN_RESET);
}   HAL_TIM_Base_Start_IT(&htim14);
//k1++;//20000微秒大定时器,保障50HZ输出
//4500 -20000us
//225 - 1000us
}

定时器中断回调函数如上图,就是简单的使用状态机来设定不同的定时器值,然后手动开启定时器中断,建议将要使用的数据在主循环或者其他任务中提前计算好,中断回调函数执行周期大约为1000hz,太多的计算会导致周期很难调整。
中断函数的内容会影响周期时间,这种情况下微调各个参数数值即可,比如可以调整固定高电平(1000)或者帧间隔时间(j1)。

STM32F030F4P6 HAL库 PPM信号输出 24L01 PPM接收机制作相关推荐

  1. 【STM32】HAL库——定时器PWM输出

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  2. 舵机PWM,SBUS,PPM信号转模拟电压的方案

    PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务和交流.---------------- 案例场景 有个内 ...

  3. PWM,SBUS,PPM信号转模拟电压的方案

    PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务.---------------- 案例场景 有个内部采用 ...

  4. STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  5. 2.STM32F407之HAL库——星星点灯

    使用STM32CubeMX配置工程+MDKARM编写代码实现LED灯的控制 一.LED 二.配置STM32CubeMX 三.引脚配置属性详解 四.MDK设置+代码编写 五.下载验证   如何使用STM ...

  6. STM32 通过定时器产生PPM信号

    标题STM32 通过定时器产生PPM信号 说明: 该代码基于STM32F103VET6 和STD标准库实现.若需要在其他单片平台使用需要调整IO,和定时器,底层代码. 定时器要达到us级定时. 实现原 ...

  7. 【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  8. 单片机模拟输出PPM信号

    PPM信号就是将多个PWM信号放在一起传输,一个PPM的周期为20ms,其中一个通道信号的范围为1~2ms,所以一个PPM信号,最多可以传输10个通道的PWM信号. PPM信号以0.5ms的低电平信号 ...

  9. STM32解析航模遥控器的PPM信号

    一.前言 通常遥控器能输出i-BUS.s-BUS.PPM.PWM信号,其中i-BUS.s-BUS需要配套的电平反向器(硬件取反),PWM信号占用引脚较多,对比而言PPM信号使用起来更为方便. 航模遥控 ...

最新文章

  1. c语言大作业菜单管理,C语言大作业:编写菜单控制猜商品价格程序
  2. 身为程序员,你接过最奇葩的需求是什么?丨Q言Q语
  3. 如何自学python编程-零基础如何自学编程?
  4. java面试题在线做_java考试题目及答案也可以当面试题
  5. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3
  6. cmd命令行怎样运行python_在CMD命令行中运行python脚本的方法
  7. Linux 内核漏洞可用于逃逸 Kubernetes 容器
  8. ORACLE SQL优化大全
  9. java8中Lambda表达式写法详解
  10. Sort exceeded memory limit of 104857600 bytes 解决方案
  11. Visual Tracking via Adaptive Structural Local Sparse Appearance Model
  12. U3D DotH教程3
  13. Error in invoking target 'agent nmhs' of makefile
  14. 一、熟悉新闻推荐系统基本流程
  15. 现在常用的java框架有哪些
  16. java闭锁_Java并发工具类(闭锁CountDownLatch)
  17. java verify_JAVA结合testng断言verify(断言失败不中断继续执行)
  18. 每天学点英语语法-重头开始8
  19. Unity通过协程实现回合制战斗
  20. mysql靶场_BWVS靶场搭建

热门文章

  1. 小米5升级Linux内核,小米5 刷机LineageOS 14.1的详细教程
  2. 微信朋友圈新增仅最近一个月可见;OpenAI 发布音乐生成网络 MuseNet
  3. 2019下半年,快手准备赚多少钱?
  4. Android系统字体
  5. Biopython操作DNA,RNA和蛋白质序列
  6. 以太坊钱包开发-下载、编译 go-ethereum,搭建 eth 私有链
  7. 玩家必备:QQ宠物升级所需时间明细表(转)
  8. 第十二章:使用C语言(Python语言)操作Sqlserver2019数据库
  9. 【C++基础】头文件定义问题导致的重定义问题
  10. Python人脸识别—我的眼里只有你