ppm理解与代码实现

article/2025/9/14 17:10:06

PWM指的是脉宽调制,狭义说就是舵机信号中正脉冲宽度,就是高电平宽度来表示控制量大小,PPM是脉冲和脉冲之间间隔调制,狭义的说,对于遥控器输出或者接收机输出而言,两个脉冲上升沿之间间隔表示控制量大小.在遥控设备的传统中PWM通常是单通道的控制量,而PPM则是以帧为单位,帧内每个脉冲间隔表示一个通道的控制量,然后两帧之间还有一个长一点的低电平,这个信号曾经用于同步,作为帧和帧之间的划分

 

脉宽和数值

PPM信号规定的脉宽变化范围是1000us~2000us
一般航模遥控器中:
方向、油门之类的双向控制,中间值是1500us,两个方向的极值分别是1000us和2000us;
模式切换按钮,分别在1000us和2000us之间切换。
注:
1、航模遥控器中,双向控制项目一般都会有个中间值调节旋钮,如果调节了中间值不是1500us,那么另外两个方向的极值也会随着变化。总之输出范围是围绕着中间值±500的范围。
2、PPM信号可直接接到舵机,而一般舵机的脉宽范围是500us~2500us,对应角度0°~180°。所以一般由PPM直接控制的舵机,旋转角度范围在45°~135°。

ppm时序图

 

2018030119352898

 

 

           这是因为航模遥控器不能同时传输多路通道,只能单路传输,然后分给各个通道。遥控器的无线信号类似于上面信号的第一行,解调后变成了下面各路通道信号。
注意,各个通道的高电平信号是一个紧挨着一个的,而不是每个通道固定分配2ms的时间。
在对接收机解码时发现,实际各个通道的正脉冲并不是一个紧挨着一个出现有的接收机各个通道输出的高电平连接比较近,而有的接收机在上一个通道正脉冲结束后要等较长的时间下一个通道的高电平才出现,在此期间所有的通道都是低电平。

由于单路信号最长是2000us,周期20ms,所以理论上可以容纳10路。而由于需要进行同步,实际上遥控器最多只能容纳9路信号。
记住:接收机输出的每帧信号(20ms)里,理论上最后必然有至少2ms的时间里,所有的通道都输出低电平,单片机解码时就是利用这一点来判断一帧信号结束的。

 

 

 

精度

20180301195340935

 

PPM和电调

PPM信号可直接输出给舵机,而在航模中经常会用PPM信号控制电机(有刷和无刷),它们是不能直接用PPM信号控制的,此时需要电调。
电调具有接收PPM信号和驱动电机的功能,不同的电机驱动方式不同(有刷和无刷,有感也无感)。简单地说,电调的作用是接收PPM信号,转换成我们希望的电机驱动信号,并通过内部的电机驱动电路实现对电机的控制。

 

接下来是ppm在stm32中的代码:

 

 void PPM_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 ;//GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//输入下拉
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


}


uint16 PPM_Sample_Cnt=0;
uint16 PPM_Isr_Cnt=0;
u32 Last_PPM_Time=0;
u32 PPM_Time=0;
u16 PPM_Time_Delta=0;
u16 PPM_Time_Max=0;
uint16 PPM_Start_Time=0;
uint16 PPM_Finished_Time=0;
uint16 PPM_Is_Okay=0;
uint16 PPM_Databuf[8]={0};


/***************************************************
函数名: void EXTI9_5_IRQHandler(void)
说明: PPM接收中断函数
入口: 无
出口: 无
备注: 程序初始化后、始终运行
****************************************************/
extern u32 TIME_ISR_CNT;
void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
//系统运行时间获取,单位us
    Last_PPM_Time=PPM_Time;
    PPM_Time=1000*10*TIME_ISR_CNT
                   +TIM2->CNT/2;//us
    PPM_Time_Delta=PPM_Time-Last_PPM_Time;
    //PPM中断进入判断
    if(PPM_Isr_Cnt<100)  PPM_Isr_Cnt++;
   //PPM解析开始
    if(PPM_Is_Okay==1)
    {
    PPM_Sample_Cnt++;
    //对应通道写入缓冲区
    PPM_Databuf[PPM_Sample_Cnt-1]=PPM_Time_Delta;
    //单次解析结束
      if(PPM_Sample_Cnt>=8)
        PPM_Is_Okay=0;
    }
    if(PPM_Time_Delta>=2050)//帧结束电平至少2ms=2000us
    {
      PPM_Is_Okay=1;
      PPM_Sample_Cnt=0;
    }
  }
  EXTI_ClearITPendingBit(EXTI_Line8);
}


这里的中位死区是50;      

void PPM_RC()
{
#ifdef RC_PPM
 if(PPM_Databuf[0]<=1480)  Roll_Control=(1450-PPM_Databuf[0])*50/400;
 else if(PPM_Databuf[0]>=1520)  Roll_Control=(1550-PPM_Databuf[0])*50/400;
 else Roll_Control=0;


 if(PPM_Databuf[1]<=1450)  Pitch_Control=(1450-PPM_Databuf[1])*50/400;
 else if(PPM_Databuf[1]>=1550)  Pitch_Control=(1550-PPM_Databuf[1])*50/400;
 else Pitch_Control=0;


 Target_Angle[0]=-Pitch_Control;
 Target_Angle[1]=-Roll_Control;


 Temp_RC=(PPM_Databuf[2]-1100);
 if(Temp_RC<=5)     Throttle_Control=0;
 else if(Temp_RC>=1000)  Throttle_Control=1000;
 else Throttle_Control=Temp_RC;


 if(PPM_Databuf[3]<=1450)  Yaw_Control=-(PPM_Databuf[3]-1450)*150/400;
 else if(PPM_Databuf[3]>=1550)  Yaw_Control=-(PPM_Databuf[3]-1550)*150/400;
 else Yaw_Control=0;
 if(Yaw_Control>=150) Yaw_Control=150;
 else if(Yaw_Control<=-150) Yaw_Control=-150;


 RC_NewData[0]=Throttle_Control;//遥感油门原始行程量
 Throttle_Rate=Get_Thr_Rate(Throttle_Control);
 Throttle_Control=Throttle_Base+Throttle_Control;
#endif




  if(Throttle_Control==1000
       &&Yaw_Control>=80
         &&Roll_Control<=-40
           &&Pitch_Control<=-40)
    Unlock_Makesure_Cnt++;






  if(Throttle_Control==1000
      &&Yaw_Control<=-70
        &&Roll_Control>=40
          &&Pitch_Control<=-40)
       Lock_Makesure_Cnt++;


   if(Throttle_Control==1000
      &&Yaw_Control<=-70
        &&Roll_Control>=40
          &&Pitch_Control<=-40
            &&Lock_Makesure_Cnt>250*1)//持续2S
  {
      Controler_State=Unlock_Controler;
      Lock_Makesure_Cnt=0;


      Auto_ReLock_Cnt=250*6;//持续10S
      Auto_Relock_Flag_Set=0;
  }


  if(Controler_State==Unlock_Controler
     &&Auto_Relock_Flag_Set==0//自动上锁位未设置
      &&Throttle_Control==1000
       &&Pitch_Control==0
        &&Roll_Control==0
         &&Yaw_Control==0)//解锁后遥感回中
  {
      Auto_Relock_Flag=1;//解锁初始时开启自动上锁标志位
      Auto_Relock_Flag_Set=1;//单次解锁后,只置位一次
  }




  if(Auto_Relock_Flag==1)
  {
   if(Throttle_Control==1000
     &&Pitch_Control==0
       &&Roll_Control==0
         &&Yaw_Control==0
          &&Controler_State==Unlock_Controler)//自动上锁计数器
    {
     Auto_ReLock_Cnt--;
     if(Auto_ReLock_Cnt<=0)  Auto_ReLock_Cnt=0;


    }


  }


}

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/YIMRerkb.shtml

相关文章

[图像处理] PPM、PGM、PBM图像格式剖析

今天突然需要用到PPM这个图像文件格式&#xff0c;之前没见过&#xff0c;在此记录一下。 PPM、PGM、PBM这三个图像文件格式很少见&#xff0c;其实也不难&#xff0c;分别用于彩色图像、灰度图像、二值图像。这里以PPM格式为例。 PPM格式有两种类型&#xff1a;字节码和ASCII。…

PPM文件格式详解

PPM图像格式是由Jef Poskanzer 在1991年所创造的。 PPM&#xff08;Portable Pixmap Format&#xff09;还有两位兄长&#xff0c;大哥名叫「PBM」&#xff0c;二哥人称「PGM」&#xff0c;他们三兄弟各有所长&#xff0c;下面为你们一一介绍&#xff1a; PBM 是位图&#xf…

什么是ppm,如何转化到西格玛水平

本文共678字&#xff0c;预计阅读需要2.5分钟 我们经常听到&#xff0c;如果一家公司的质量水平达到了六个西格玛水平&#xff0c;那么也就意味着在100万次出错机会中出现的缺陷数不会超过3.4个&#xff0c;也就是3.4ppm。那ppm到底是什么呢&#xff1f; ppm是英文parts per mi…

PPM信号介绍

原文地址&#xff1a;http://nicekwell.net/blog/20161223/ppmxin-hao-jie-shao.html 我们知道PWM信号可以控制舵机&#xff0c;一般信号周期是20ms&#xff0c;脉宽在500us~2500us之间。   实际上这种pwm信号不仅可以控制舵机&#xff0c;航模中使用的电调&#xff08;有刷和…

晶振PPM指标、频率和时间偏差

目录 PPM的含义频率随温度的变化振荡器的分类 PPM的含义 PPM是Parts Per Million的缩写&#xff0c;定义为百万分之一&#xff0c;1ppm即是一百万分之一。 PPM是晶振、TCXO等振荡器的一个重要参数&#xff0c;它代表频率误差的精准度&#xff0c;PPM值越小越精准。 频率随温度…

Laravel快速接入JWT用户认证(多用户认证)tymon/jwt-auth

JWT应用 创建新项目安装快速接入创建 Token 完成接口多用户认证创建 Admin JWT 是 JSON Web Token 的缩写&#xff0c;它是一个规范&#xff0c;让用户和服务器之间传递安全可靠的信息。 创建新项目 创建一个 Laravel的新项目&#xff0c;我们依然推荐大家使用 LTS 的版本&am…

JIT是什么

什么是JIT 一些其他解释的网站&#xff1a;http://www.sohu.com/a/169704040_464084 1、动态编译&#xff08;dynamic compilation&#xff09;指的是“在运行时进行编译”&#xff1b;与之相对的是事前编译&#xff08;ahead-of-time compilation&#xff0c;简称AOT&#xf…

JWT入门教程

简介 JWT&#xff0c;JSON Web Token&#xff0c;开放的、行业标准(RFC 7519)&#xff0c;用于网络应用环境间安全传递声明。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务器获取资源&#xff0c;也可以增加一些额外的…

JT项目-1

DAY01 学习京淘的意义 1 为什么选择电商项目作为java培优部分的重要项目 火(用户量广) 技术难点多,高(高并发,高可用)尤其是在中国 谷歌是全球并发最高的网站 学习成本低(无需精通业务部分) 2 学习完京淘项目对我们的就业有什么好处 代替1-2年工作经验 技术就业范…

JWT --- 入门学习

不知道为什么,不用springboot test测试或者启动类启动,会报这个错误,找不到类路径 1.常见的认证机制 basic auth &#xff1a; 每次请求都会携带用户的username&#xff0c;password&#xff0c;易被黑客拦截。 Cookie auth : 我们请求服务器&#xff0c;创建一个session对象,…

Jetty

本文介绍一个使用Jetty开发的Web的小例子。 Jetty是一个开源的servlet容器&#xff0c;它为基于Java的web容器&#xff08;例如JSP和servlet&#xff09;提供运行环境。可以把它理解为和Tomcat一样&#xff0c;不过Jetty更小更轻量级。如果想更深入学习Jetty推荐看&#xff1a…

JWT入门详解

目录 一、JWT简介 1.什么是JWT&#xff1f; 2.为什么要使用JWT&#xff1f; 二、JWT的工作原理 三、JWT的组成 1.Header&#xff08;头部&#xff09; 2.Payload(载荷) Reserved claims(保留) Public claims&#xff08;公有&#xff09; Private claims(私有) 3.s…

Ubuntu系统搭建后端Websocket服务器--基于Apache Tomcat

目录 一、概述二、基本安装2.1 Java安装2.2 Apache Tomcat安装2.3 Eclipse EE安装 三、正式部署3.1 创建一个简单java web项目3.2 服务端部署3.3 运行3.4 局域网连接Websocket 一、概述 本文针对Ubuntu系统&#xff08;Win10下的虚拟机&#xff09;进行详述&#xff0c;本文测…

部署Nginx+Tomcat+Php-fpm+mariadb主主

要求 1、前端1台Nginx&#xff0c;均衡后端2台php-fpm&#xff0c;均衡后端2台Tomcat&#xff0c;2台MYSQL采用主主架构&#xff0c;用户通过域名访问前端Nginx 域名v1.jd.com v2.jd.com访问到Discuz和Jforum不同的网站。 2、将第一道题目的部署步骤和架构图画出来。架构图上要…

【JavaWeb】WEB开发概述以及Tomcat

&#x1f50e;这里是【JavaWeb】&#xff0c;关注我学习JavaWeb不迷路 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ &#x1f440;专栏介绍 【JavaWeb】 目前主要更新JavaWeb&#xff0c;一起…

tomcat环境搭和管理及实现jsp通过tomcat连接mysql

25.1 什么是Tomcat 官方网站&#xff1a;http:#tomcat.apache.org/ Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持…

Tomcat的Https设置及Http自动跳转Https (Linux环境下)

1.场景还原 近期项目中要对信息传输过程中进行安全加密&#xff0c;那么第一时间浮现笔者脑海的当然是https,接下来笔者将介绍如何在web服务器Tomcat中配置Https及Http自动跳转Https 2.Https相关介绍 Https是由NetScape公司设计的一个基于Http的加密传输协议&#xff0c;可以这…

六、Tomcat集群

TOMCAT集群 目录 TOMCAT集群 1 1 集群 1 1.1 什么是集群 1 1.2 集群的特性 1 1.3 集群的分类 1 1.4 TOMCAT集群配置的优缺点 2 1.5 APACHETOMCAT 2 1.6 环境说明 2 2 软件安装 3 2.1 安装说明 3 2.2 JDK安装 3 2.3 APACHE安装 4 2.4 TOMCAT安装 4 3 集群配置 6 3.1 APACHEMOD_J…

Mycat环境搭建和管理及实现jsp通过tomcat连接mysql

一、什么是tomcat 官方网站&#xff1a;http://tomcat.apache.org/ Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持…