51单片机实现类似于Arduino中micros()、millis()函数功能并用于接收ppm信号

2023-05-16

最近想要给小车添加航模遥控器遥控功能,毕竟航模遥控器拿在手里还是很有质感,手感很不错的。选择使用ppm信号,ppm信号相关参考:PPM相关
Arduino中micros()函数返回一个单位为无符号长整形的变量表示开机时间,符号为us。用于测量某段时间很是方便,上文分析的飞控代码中也是使用micros()函数对ppm信号进行解码,所以萌生了在51上封装类似函数的想法。和arduino不同的是,millis()函数本例返回值为浮点型
使用STC15W4K56S4单片机,24MHz主频,定时器进行12分频。

unsigned int times_L=0;
unsigned int times_H=0;
unsigned int xdata channelnum[3][8];
extern unsigned int xdata channel[8];

void Timer1Init(void)
{
	AUXR &= 0xBF;		    //定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x00;				//设置定时初始值
	TH1 = 0x00;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	ET1=1;
	TR1 = 1;				//定时器1开始计时
}

void time1() interrupt 3{
	if(times_L==65535){
		times_L=0;         	//L溢出,H进位
		times_H++;
	}
	else times_L++;
}

unsigned long int micros(){
	unsigned char TH,TL;
	TL=TL1;             	//读取定时器1低8位
	TH=TH1;              	//定时器1高8位
	return (times_L<<15)+(TH<<7)+(TL>>1);  //返回us数times_L*65536/2+TH1*256/2+TL1/2
}

float millis(){
	unsigned char TH,TL;
	TL=TL1;             	//原理同micros()
	TH=TH1;
	return (times_H*2147483.648)+(times_L*32.768)+(TH*0.128)+(TL*0.0005);
}

void int0_init(){
    IT0 = 1;             	//设置INT0的中断类型
    EX0 = 1;              	//使能INT0中断
}

void int0() interrupt 0{
	unsigned long int now;
	unsigned int diff;
	static unsigned long int last;
	static unsigned char num=0,ch=0;
	
	now=micros();       	//读取当前us
	diff=now-last;   	    //计算两次进入中断时间差值
	last=now;    	        //last从新赋值用于下一次计算
	if(diff>3000||ch>7){    //判断此帧是否结束
		num++;
		if(num>=3){
			num=0;
			ch_filtering();
		}
		ch=0;
	}
	else if(diff>900&&diff<2100){  //记录有效值
		channelnum[num][ch]=diff;
		ch++;
	}
}

void ch_filtering(){               //对通道值进行滤波
	unsigned char i;
	for(i=0;i<8;i++)channel[i]=(channelnum[0][i]+channelnum[1][i]+channelnum[2][i])/3;
}

不过与参考文章不同,实测FS-IA6B接收机低电平时间为400us
在这里插入图片描述
网上有的实例使用两个外部中断或者使用电平变化方式进入中断,即无论有上升沿还是下降沿都进行中断,这时低电平固定时间不同可能会使最终计算结果不准确。通道值为低电平时间加高电平时间,所以只使用下降沿或上升沿中断可直接测得通道值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机实现类似于Arduino中micros()、millis()函数功能并用于接收ppm信号 的相关文章

  • ROS--机器人小车仿真rviz

    URDF练习 需求描述 创建一个四轮圆柱状机器人模型 xff0c 机器人参数如下 底盘为圆柱状 xff0c 半径 10cm xff0c 高 8cm xff0c 四轮由两个驱动轮和两个万向支撑轮组成 xff0c 两个驱动轮半径为 3 25cm
  • ROS--URDF集成Gazebo仿真小车和rviz结合

    ROS URDF集成Gazebo仿真小车 实现流程 需要编写封装惯性矩阵算法的 xacro 文件 为机器人模型中的每一个 link 添加 collision 和 inertial 标签 xff0c 并且重置颜色属性 在 launch 文件中
  • 使用D435i深度相机运行ORB-SLAM3

    下载安装链接 下载ORB SLAM3地址 xff1a git clone https github com UZ SLAMLab ORB SLAM3 git eigen3多版本安装 xff1a https blog csdn net wei
  • keil5使用一个父工程打开多个子工程文件

    1 首先工程文件需要在同样的文件夹里 2 打开keil5 xff0c 选择Project New Multi Project Workspace 3 将工程文件建立在刚刚的总文件夹里面 xff0c 命名保存 4 弹出此页面 xff08 Cr
  • ​Android动态加载so!这一篇就够了!

    作者 xff1a Pika 链接 xff1a https juejin cn post 7107958280097366030 对于一个普通的android应用来说 xff0c so库的占比通常都是巨高不下的 xff0c 因为我们无可避免的
  • HTTP是什么

    HTTP是什么 HTTP是什么 HTTP协议是Hyper Text Transfer Protocol xff08 超文本传输协议 xff09 的缩写 是用于从万维网 xff08 WWW World Wide Web xff09 服务器传输
  • error: array has incomplete element type ‘char []‘

    原代码 xff1a void explain input char int char a 报错 xff1a error array has incomplete element type 39 char 39 原因 xff1a 可以用二维数
  • STM32串口接收十六进制数转为十进制数(包含负数)

    外部设备传输给STM32单片机十六进制数 例如0x09c4 代表2500 0xff38 代表 200 xff08 并不是65336 xff0c 因为这是有符号的 xff09 串口接收处理函数 接收到 5A A5 06 83 55 00 01
  • 无人机-3无人机ROS应用与开发

    一 ROS是什么 二 为什么要学习ROS 三 怎么学习ROS https www cnblogs com masbay p 10745170 html TF坐标系指机器人在现实世界会有坐标的变换 xff0c ROS已经将其算成固定的程序 x
  • ROS入门-4.安装ROS系统(ubuntu20.04版本安装ros的noetic版本)

    ubuntu20 04版本安装ros的noetic版本 1 添加软件源2 添加密钥3 更新4 安装ROS5 初始化rosdep6 设置环境变量7 测试ROS安装是否成功 1 添加软件源 2 添加密钥 3 更新 4 安装ROS 5 初始化ro
  • 数学建模-12.预测模型

    灰色预测 灰色系统 GM 1 1 模型 xff1a Grey Model GM 1 1 原理介绍 呢么 xff0c 准指数规律的检验 xff1f 发展系数 a 与预测情形的探究 发展系数越小预测的越精确 GM 1 1 模型的评价 在使用GM
  • 数学建模-数学规划模型

    数学规划模型 一 概述 1 什么是数学规划 xff1f 运筹学的一个分支 xff0c 用来研究在给定条件下 即约束条件 xff0c 如何按照某一衡量指标 xff08 目标函数 xff09 来寻求计划 管理工作中的最优方案 即求目标函数在一定
  • 机器学习西瓜书学习记录-第四章 决策树

    第4章 决策树 4 1基本流程 决策树 xff0c 一类常见机器学习方法 xff0c 希望从给定训练集学得一个模型用以对新示例进行分类 一般 xff0c 一棵决策树包含一个根结点 若干个内部结点和若干个叶结点 xff1b 叶结点对应于决策结
  • 机器学习西瓜书学习记录-第五章 神经网络

    第5章 神经网络 5 1神经元模型 神经网络中最基本的成分是神经元模型 M P神经元模型 xff0c 又称 阈值逻辑单元 在模型中 xff0c 神经元接收到来自n个其他神经元传递过来的输入信号 xff0c 这些输入信号通过带权重的连接进行传
  • 机器学习西瓜书学习记录-第六章 支持向量机

    第6章 支持向量机 移步b站学习 学习贴
  • SurfaceFlinger模块

    SurfaceFlinger是一个系统服务 xff0c 作用就是接受不同layer的buffer数据进行合成 xff0c 然后发送到显示设备进行显示 SurfaceFlinger进程是什么时候起来的 xff1f 在之前的Android低版本
  • STM32-串口通信实验

    一 通信接口背景知识 1 通信的两种方式 xff1a 并行通信 传输原理 数据各个位同时传输 优点 速度快缺点 占用引脚资源多 串行通信 传输原理 数据按位顺序传输 优点 占用引脚资源少缺点 速度相对较慢 2 串行通信 按照数据传送的方向
  • UDP介绍,编程流程

    介绍 xff1a 面向无连接的用户数据报协议 xff0c 不需要建立任何连接 xff0c 目的主机接收后不需要确认 UDP特点 xff1a 相比TCP速度快一些简单的应用程序直接使用 不需要加密对于海量数据不采用UDP广播和多播必须采用UD
  • 数据结构-线性表的链式存储(包含代码实现)

    线性表的链式表示和实现 链式存储结构 结点在存储器中的位置是任意的 xff0c 即逻辑上相邻的数据元素在物理上不一定相邻线性表的链式存储结构又称为非顺序映像或链式映像 用一组物理位置任意的存储单元来存放线性表的数据元素这组存储单元既可以是连
  • Android6.0以上高危权限动态申请

    1 在项目的Manifest xml中添加静态权限 拨打电话 lt uses permission android name 61 34 android permission CALL PHONE 34 gt 发送短信 lt uses pe

随机推荐

  • Linux入学—共享文件夹(保姆教程)

    序言 自从上学期上完课以来就没有用过Linux xff0c 最近因为学习传感器数据上传云端的需要 xff0c 安装了Linux xff0c 在开始装jdk的时候需要下载jdk的压缩包 xff0c 需要通过windows上传到Ubuntu 之
  • Ubuntu下安装java环境及idea

    前言 一 JDK的安装 二 配置环境 1 在 系统中配置java环境 三 idea社区版的安装 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 由于自己的学习需要 xff0c 这里需要用到在Linux系统下的Java
  • stm32f103 光敏传感器BH1750 实现串口回显

    在制作智能花盆的过程中 xff0c 使用了光敏传感器BH1750 因为在网上找了很多都是关于51的 xff0c 32方面的比较少 xff0c 所以这里记录一下BH750的驱动代码 链接 xff1a https pan baidu com s
  • STM32中HAL库使用-串口接收(一)

    1 中断接收 1 1先看中断接收的流程 xff08 以 USART2 为例 xff09 在启动文件中找到中断向量 USART2 IRQHandler 找到 USART2 IRQHandler 的函数定义 可以看到这里又转到另一个函数里去了
  • STM32中HAL库使用-串口发送(二)

    2 中断发送 2 1发送中断的触发流程 由于在STM32中usart2的入口中断只有一个 xff1a 就是上图的中断向量表中红框标出来的 其他的所有中断其实都是从这里出发的 xff0c 我们再和捋接收一样捋一遍发送 首先是USART2 IR
  • Ubuntu20.04下编译安装ORBSLAM2_with_pointcloud_map总结

    与此物大战六个小时 xff0c 终于解决所有问题 xff0c 写此短文记录一下 一 在github上下载源码后 xff0c 解压缩 xff0c 如下 进行g2o with orbslam2的编译 1 报错信息 xff1a ORBSLAM2
  • Android使用ASM修改函数

    目录 参考文章 Android 编译插桩 xff08 一 xff09 xff1a ASM https github com yxhuangCH CSLearn blob master android Android 20 E7 BC 96
  • ORB_SLAM2配置——基于Ubuntu20.04+ROS+gazebo仿真

    一 引言 ORB SLAM2 xff0c 它是基于单目 双目或RGB D相机的一个完整的SLAM系统 xff0c 其中包括地图重用 回环检测和重定位功能 这个系统可以适用于多种环境 xff0c 无论是室内小型手持设备 xff0c 还是工厂环
  • opencv 打开双目摄像头只能采集一个摄像头的问题,及左右目图像分割成两幅图

    一 opencv 打开双目摄像头只能采集一个摄像头的问题 本人采用单USB接口的双目摄像头 xff0c 总是只打开左摄像头的图 xff0c 经摸索后发现主要就是分辨率的问题 xff0c 如果分辨率设置正确 xff0c 便可以打开左右目合成图
  • 基于opencv(c++)和matlab的usb双目相机标定

    本人由于实际需要入手了一款双目免驱usb摄像头 xff0c 因为需要做深度估计 xff0c 故需要标定内参 xff0c 双目相机标定主要是为了获得摄像头的内参 f 1 dx 1 dy cx cy 畸变参数 k1 k2 k3 p1 p1 和外
  • 解决在编译各类改版orbslam时的undefined reference to ****************************问题

    如上面这个问题 xff0c 可以参考这个链接 xff1a 参考链接 参考上面的链接 xff0c 我作出的修改具体为 xff08 1 xff09 移动所缺少的文件 xff08 如本例的libopencv core so 4 2 0 xff09
  • 贝叶斯滤波与卡尔曼滤波(一)

    一 绪论 贝叶斯滤波 xff1a 通过概率统计的方法 xff08 贝叶斯公式 xff09 xff0c 对随机变量进行处理 xff0c 来减小他的不确定度 这里所指的随机变量和教材中所说的变量并不是一回事 xff0c 贝叶斯滤波中所提到的随机
  • 学习ROS-Academy-for-Beginners-noetic,修改记录

    一 编译安装ROS Academy for Beginners noetic 可以参考我之前的博客ROS Academy for Beginers noetic安装教程 之后可以看到里面提供了很多例程 xff0c 包括 软件包 内容 rob
  • STM32的C与汇编语言混合编程

    目录 一 在keil5里面利用C语言调用汇编函数 1 建立新工程 2 编辑代码 C语言代码编辑 xff1a 汇编语言编辑 3 编译调试 二 改写汇编程序 1 C程序改写 2 汇编程序改写 3 编译调试 三 在汇编程序中调用C语言中的函数 一
  • 网络数据传输时的大小端问题

    socket网络字节序以及大端序小端序 不同CPU中 xff0c 4字节整数1在内存空间的存储方式是不同的 4字节整数1可用2进制表示如下 xff1a 00000000 00000000 00000000 00000001 有些CPU以上面
  • linux知识点——CMakeLists.txt中调用自己编写的so库

    文章目录 1 问题2 解决2 1 cmake文件方法2 2 暴力链接库方法 3 例子3 1 生成libposelib so3 2 调用so库3 3 find package原理 参考 xff1a https blog csdn net qq
  • jetson tx2刷机教程 (成功安装ubuntu18.04+Jetpack4.6.2+CUDA10.2+CUDNN8.2)

    TX2 刷机需要准备一台ubuntu系统的电脑 xff0c 没有ubuntu系统电脑在Windows电脑中安装虚拟机也可 本文教程直接使用的是ubuntu系统的电脑 主机端 xff08 电脑端 xff09 环境配置 在主机上安装sdkman
  • 新能源汽车的三十年黄金赛道,Android程序员认准车载就对了!

    前言 中汽协预计 xff0c 2023年中国 汽车市场总销量为2760万辆 xff0c 同比增长3 其中 xff0c 国内乘用车累计销量预计为2380万辆 xff0c 同比增长1 3 xff1b 商用车累计销量预计为380万辆 xff0c
  • STM32-USART串口初始化配置

    一 串行通信的基本概念 1 同步通信和异步通信 通信 xff0c 最少要两个对象 xff0c 一个收 xff0c 一个发同步通信 xff1a 通信双方根据同步信号进行通信的方式 异步通信 xff1a 数据传输速度匹配依赖于通信双方有自己独立
  • 51单片机实现类似于Arduino中micros()、millis()函数功能并用于接收ppm信号

    最近想要给小车添加航模遥控器遥控功能 xff0c 毕竟航模遥控器拿在手里还是很有质感 xff0c 手感很不错的 选择使用ppm信号 xff0c ppm信号相关参考 xff1a PPM相关 Arduino中micros 函数返回一个单位为无符