STM32F030F4P6 HAL库 PPM信号输出 24L01 PPM接收机制作
事件起因
因为给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接收机制作相关推荐
- 【STM32】HAL库——定时器PWM输出
前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...
- 舵机PWM,SBUS,PPM信号转模拟电压的方案
PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务和交流.---------------- 案例场景 有个内 ...
- PWM,SBUS,PPM信号转模拟电压的方案
PWM,SBUS,PPM信号转模拟电压的方案 -----------------本文由"麦粒电子"撰写,并提供相应产品服务.---------------- 案例场景 有个内部采用 ...
- STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)
01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...
- 2.STM32F407之HAL库——星星点灯
使用STM32CubeMX配置工程+MDKARM编写代码实现LED灯的控制 一.LED 二.配置STM32CubeMX 三.引脚配置属性详解 四.MDK设置+代码编写 五.下载验证 如何使用STM ...
- STM32 通过定时器产生PPM信号
标题STM32 通过定时器产生PPM信号 说明: 该代码基于STM32F103VET6 和STD标准库实现.若需要在其他单片平台使用需要调整IO,和定时器,底层代码. 定时器要达到us级定时. 实现原 ...
- 【STM32】HAL库 STM32CubeMX教程七---PWM输出(呼吸灯)
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...
- 单片机模拟输出PPM信号
PPM信号就是将多个PWM信号放在一起传输,一个PPM的周期为20ms,其中一个通道信号的范围为1~2ms,所以一个PPM信号,最多可以传输10个通道的PWM信号. PPM信号以0.5ms的低电平信号 ...
- STM32解析航模遥控器的PPM信号
一.前言 通常遥控器能输出i-BUS.s-BUS.PPM.PWM信号,其中i-BUS.s-BUS需要配套的电平反向器(硬件取反),PWM信号占用引脚较多,对比而言PPM信号使用起来更为方便. 航模遥控 ...
最新文章
- c语言大作业菜单管理,C语言大作业:编写菜单控制猜商品价格程序
- 身为程序员,你接过最奇葩的需求是什么?丨Q言Q语
- 如何自学python编程-零基础如何自学编程?
- java面试题在线做_java考试题目及答案也可以当面试题
- 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 3
- cmd命令行怎样运行python_在CMD命令行中运行python脚本的方法
- Linux 内核漏洞可用于逃逸 Kubernetes 容器
- ORACLE SQL优化大全
- java8中Lambda表达式写法详解
- Sort exceeded memory limit of 104857600 bytes 解决方案
- Visual Tracking via Adaptive Structural Local Sparse Appearance Model
- U3D DotH教程3
- Error in invoking target 'agent nmhs' of makefile
- 一、熟悉新闻推荐系统基本流程
- 现在常用的java框架有哪些
- java闭锁_Java并发工具类(闭锁CountDownLatch)
- java verify_JAVA结合testng断言verify(断言失败不中断继续执行)
- 每天学点英语语法-重头开始8
- Unity通过协程实现回合制战斗
- mysql靶场_BWVS靶场搭建
热门文章
- 小米5升级Linux内核,小米5 刷机LineageOS 14.1的详细教程
- 微信朋友圈新增仅最近一个月可见;OpenAI 发布音乐生成网络 MuseNet
- 2019下半年,快手准备赚多少钱?
- Android系统字体
- Biopython操作DNA,RNA和蛋白质序列
- 以太坊钱包开发-下载、编译 go-ethereum,搭建 eth 私有链
- 玩家必备:QQ宠物升级所需时间明细表(转)
- 第十二章:使用C语言(Python语言)操作Sqlserver2019数据库
- 【C++基础】头文件定义问题导致的重定义问题
- Python人脸识别—我的眼里只有你