嵌入式总结(一)
红外通信原理
红外通信的整个工作过程
发送过程
数据 -> 编码 -> 调制 -> 发送电路
数据:假设发送的数据为 0XA5,二进制为:10100101
编码:用脉冲宽度编码(Pulse Width Encoding)来表示二进制数据。每个数据位由一系列的脉冲组成,逻辑0和逻辑1分别由不同的脉冲宽度表示。现假设如下:
逻辑0为:0.5ms高 + 0.5ms低; 逻辑1为:1ms高 + 0.5ms低;
- 调制:就是把编码数据放到一定频率的载波上面,即使用数据调制载波,形成一串脉冲信号
- 发送电路:即:红外灯珠对脉冲信号的发送 + 脉冲信号的放大
接收过程
接收电路 -> 解调 -> 解码 -> 数据
- 接收电路:接收发过来的红外信号
- 解调:当红外接收管接收到调制信号时,输出高电平,否则输出为低电平
- 解码:解调后将得到的一系列脉冲变为二进制
- 数据:解码后即可得到发来的数据,即 0XA5 (二进制为:10100101)
优缺点
红外通信的优点:抗电磁干扰、成本低
红外通信的缺点:传输效率低,易受到环境光干扰导致传输误码
ADC数据常用的处理
为什么要对采样的数据进行处理呢?直接拿来用不行吗?
因为任何系统都会存在干扰,进行数据处理就是为了尽量避免因外界干扰引起的误差。
常用的两种滤波方法
- 多次采样加权取平均,在写程序的时候可以运用一些技巧:首先我们ADC采集8次数据并且对这8次数据累加(可以每1ms调用该函数),累加完成后将累加结果右移3位得到最后的采样结果。
当然这个方法还可以进一步改善,比如取样10次,然后去掉最大值和最小值,再对剩下的8次进行取平均。
但因为需要多次采样,更新数据的时间会很长,比如取样8次,每1ms取样一次,那么更新数据就需要8ms时间,所以对采样的数据实时性要求不是很高的系统才可以用这种方法
- 中值滤波法(可用在实时性比较高的系统):实现思想就是取5个数据,每次采样的新数据替换掉最老的数据;然后把中间的那个数据当做是采样数据,这样不仅可以有效抑制干扰,而且响应速度快。
十大滤波方法及代码实现
1 |
|
程序顺序执行、定时器任务执行及各种RTOS的优缺点及原理
程序顺序执行优缺点
顺序执行:是指程序按照代码的书写顺序依次执行,每个任务必须等待前面的任务执行完成后才能执行。这种执行方式简单明了,易于理解和调试,但执行效率相对较低,因为程序需要等待前面的任务完成后才能开始执行下一个任务。
并发执行:是指程序中的多个任务可以同时执行,不必等待前面的任务完成。这种执行方式可以提高执行效率,充分利用计算机的资源,但也会带来一些问题,如竞争条件、死锁等。
程序顺序执行的特征主要包括顺序性、封闭性、可再现性、可控制性、自上而下、确定性:
顺序性:程序按照编写的顺序一步一步地执行,每一步完成后才能进入下一步,直到程序执行完毕。这一特征确保了程序执行的顺序性,即程序的操作严格按照程序所规定的顺序执行,每个操作必须在下一操作开始之前结束。
封闭性:程序在封闭的环境下执行,即程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它。程序一旦开始执行,其执行结果不受外界因素影响。
可再现性:程序的顺序执行是可重复的,即每次执行都按照相同的顺序和方式执行,结果也应该是相同的。只要程序执行时的环境和初始条件相同,当程序重复执行时,无论它是从头到尾不停顿地执行,还是“停停走走”地执行,都将获得相同的结果。
可控制性:程序的顺序执行是可控制的,即可以通过程序中的控制语句(如条件语句、循环语句)来改变程序的执行顺序和方式。
自上而下:程序的顺序执行是自上而下的,即从程序的第一行开始执行,直到最后一行结束。
确定性:程序执行的结果与它的执行过程无关。换言之,就是程序无论是从头到尾地执行,还是“停停走走”地执行,都不会影响所得结果。
定时器任务执行的优缺点
定时器的工作原理是基于时序控制的模块,它的作用是按照程序预定的时序点,定时触发动作,从而起到程序控制的作用,它可以按照一定的时序,定时触发某些事件
优点:
- 可以增加程序的灵活性
- 可以降低程序的复杂度(可以用它来控制单片机的某些动作,这样可以减少程序中的指令数)
- 可以提高程序的稳定性(它可以按照一定的时序触发某些事件,从而提高程序的可靠性)
缺点:
- 容易出现程序错误(它可以按照一定的时序触发某些事件,但是这种触发事件可能会出现误差,从而导致程序错误)
- 会降低单片机的运行效率(按照一定的时序编程会占用一定的单片机处理时间,从而降低单片机的运行效率)
主要用途:
延时调节:可以用来对某种设备进行延时调节,控制某种设备的工作时间,从而达到控制设备的效果
定时控制:可以用来定时控制多种设备,按照一定的时序控制设备,从而获得更加精确的控制效果
事件触发:可以触发某种事件,按照一定的时序触发某种事件,从而达到控制程序的作用
系统调度:可以用来调度系统的操作,按照一定的时序来进行系统的调度控制,从而达到最佳的操作效果
RTOS的优缺点
RTOS,全称 Real-Time Operating System ,即 实时操作系统。它是一种专门用于实时系统的操作系统,主要目的是提供及时响应和高可靠性。RTOS的核心在于其任务调度功能,它能严格按照优先级分配CPU时间片,确保实时任务得到及时处理。
RTOS技术的概念及特点:
- 实时性:RTOS的最主要特征是对实时性的支持。它能够确保系统在规定的时间内对事件作出响应,包括硬实时系统(需要对任务响应时间进行硬性保证)和软实时系统(对任务的响应时间有一定的容忍度)。
- 任务调度:RTOS包含一个任务调度器,能够有效地管理多个任务的执行。它负责按照优先级或其他调度算法,决定哪个任务在何时执行。
- 任务管理:RTOS提供任务管理功能,允许开发者创建、删除、挂起和恢复任务。任务是系统中的基本执行单元,可以看作是一个独立的线程。
- 中断服务例程: RTOS通常支持中断服务例程,以处理来自外部设备或其他任务的中断请求。中断服务例程是一段能够在中断事件发生时迅速执行的代码。
- 实时时钟:RTOS提供实时时钟服务,用于测量和记录时间,帮助任务和事件的时间同步。
- 同步和通信机制:为了实现任务之间的合作和通信,RTOS提供了同步和通信机制,如信号量、消息队列、互斥锁等。
- 资源管理:RTOS能够有效地管理和分配系统资源,包括内存、外设等,以确保任务能够按照预期的方式协同工作。
- 可裁剪性:RTOS通常具有可裁剪的特性,允许用户根据具体应用的需求选择性地启用或禁用某些功能,以减小系统的开销。
优点:
- 系统结构更清晰:当代码量较大时,RTOS会提供一个稳定的、结构清晰的框架,方便后续的开发与维护。
- 模块化和高内聚:使用RTOS写任务可以做到更加模块化,高内聚,低耦合,有利于代码的学习和技术提升。
- 中间件丰富:RTOS中间件比较多,可以方便移植使用,减少开发者的工作量。
- 趋势和适应性:随着32位CPU市场的扩大,RTOS的使用也成为一个趋势,尤其在一些特定的行业如工控、医疗、航空军工等,RTOS的强实时性和高稳定性使其更具优势。
缺点:
- 资源开销:RTOS本身会占用一些系统资源,包括内存和处理器时间。
- 学习曲线:学习RTOS可能需要一些时间,特别是对于初学者。
- 不适用于所有应用:对于一些简单的嵌入式应用,引入RTOS可能会显得过于庞大和不必要。
RTOS与裸机如何选择:
- 实时性需求: 如果系统对实时性能要求较高,特别是在响应时间上有硬性要求,RTOS可能更为适用。
- 开发周期:对于较为简单的项目,裸机开发可能更快速。
- 复杂性:如果项目较为复杂,多任务、同步和通信需求较多,RTOS可能提供更好的抽象和管理。
- 资源约束:如果系统资源有限,裸机开发可能更为合适,因为RTOS本身会占用一些额外的资源。
IIC
模拟iic和硬件iic区别
I2C协议可以被模拟和硬件实现:
模拟I2C是用两条GPIO(General Purpose Input Output)管脚的软件模拟的,将一个GPIO设置为数据线SDA,另外一个设置为时钟线SCL。
硬件I2C则是通过一个I2C控制器实现的,该控制器被建立在微控制器芯片或单独的I2C芯片中,通过集成的硬件内部逻辑和电路来控制时序和数据格式,实现I2C总线通信。
I2C协议传输时分为两类线,一类为时钟线SCL,另一类为数据线SDA。时钟线由主节点产生,用于同步数据传输,数据线用于传输真正的数据。
模拟I2C的主要限制是不能在高速模式下运行,并且有可能出现线路噪音、误码等问题。
硬件I2C通信更加可靠,并且具有更高的性能。
硬件控制器内置在微控制器芯片或者单独的I2C芯片中,在控制器的支持下,可以实现高速数据传输,避免了SCL和SDA之间的相互影响。此外,在硬件I2C中,处理信号和协议的复杂算法已经内置在控制器中,不需要用户自己实现,简化了通信过程,提高了可靠性。
软件I2C作为一个模拟方法,还存在另一个重要的缺点就是不同于硬件I2C,模拟I2C的芯片在同时进行通信时需要耗费大量的CPU资源,对内存和处理器速度的要求更高。
反过来,硬件I2C通常可以在任何操作系统和平台上轻松使用,这种通信协议不需要使用大量的额外的内存或处理器周期。
代码实现
1 | /** |
注意
- 根据传输的位来拉
SCL
与SDA
线电平:若该位为1,则拉高SCL
与SDA
线电平,否则就拉低 SCL
与SDA
需默认拉高,以释放总线状态,准备好传输数据- IIC起始信号:
SCL
高电平,SDA
下降沿(注:起始后需把SCL也拉低,使主机占用总线准备发送数据);IIC结束信号:SCL
高电平,SDA
上升沿; - 主机发送:每次发送1位,循环8次即可发送一个字节;在发送数据时,应先拉高
SCL
(从机在SCL
高电平期间读取SDA
),再拉低SCL
(主机开始发送下一位数据) - 从机接收:在接收前,应先拉高
SDA
,避免主机抢占SDA
,导致数据出错;为存储接收到的数据,需拉高SCL
,使主机在SCL
高电平期间读取SDA
,每读取一位就存入提前申请好的变量中;读完后即可得到一个字节的数据。然后拉低SCL
,使从机可写入SDA
,这样即可实现从机发送。 - 应答信号:主机把应答位数据放到
SDA
线;然后先拉高SCL
,以读取应答位;再拉低SCL
,开始下一个时序模块;
有刷电机的驱动方式,转速调节;频率对转速和电流的影响
有刷电机转动原理
组成:定子、转子、电刷、换向器
原理:外接电源给电机通电,电流经过电刷流向与换向器连接的线圈(转子),电流流过线圈产生磁场;产生的磁场与定子磁场互斥,则转子转动;
转子转动半圈后若无外力,由于转子磁场与定子磁场同性相吸,则趋于稳定,不再转动;但由于换向器的存在导致线圈中电流流向与之前相反(因为换向器位置与之前相反,而换向器与线圈相连,故线圈中电流流向与之前相反),故而又与此刻的定子磁场互斥,又使转子转动;
以上步骤不停循环就导致转子持续转动。
有刷电机转速受哪些因素影响
电压、负载、磁通量等;其中,电压与电流是影响电机转速为重要的因素
如何调节有刷电机转速
- 调节电压,有刷电机的转速与电压成正比,因此可以通过调节电压来改变电机的转速。但是需要注意,过高或过低的电压都会对电机造成损害,因此需要根据电机的额定电压来调节电压。
- 调节电流,电机的转速还与其所受的负载有关,因此可以通过调节电流来改变电机的转速。增加电流可以提高电机的转速,但是需要注意电机的额定电流,避免电机过载。
- 更换齿轮更换不同大小的齿轮可以改变电机的输出转速。一般来说,大齿轮可以降低电机的转速,小齿轮则可以提高电机的转速。
- 调节磁通量调节磁通量也可以影响电机的转速。增加磁通量可以提高电机的转速,但是需要注意电机的磁通量和饱和磁通量,以避免电机工作不稳定或过载。
频率对转速和电流的影响
增加频率会增加转速
二分法
代码实现
1 | // 数组 |
问题
- 二分法为什么会陷入死循环?
判断条件选取的不对,多一个 =
就有可能陷入死循环;另外数组最好为单数,双数极可能陷入死循环
- 为什么
while (left <= right)
用<=
不用<
?
因为 right
的值为 数组元素个数 - 1
,这时 left
与 right
是可以相等的
- 为什么取中间数要写成
int mid = left + (right - left) / 2;
这样?
因为若 left + right
很大的时候会发生整形溢出,这样写可以尽量避免
- 为什么判断条件写成
if (arr[mid] >= x && arr[mid + 1] <= x)
这样?
因为数组元素为 unsigned short
型,不会出现浮点数,且数组元素不是等差为1的等差数列,不是非此即彼,可能会出现 arr[mid] >= x && arr[mid + 1] <= x
这种情况
- 建议:遇到死循环将
left
right
mid
打印出来看看
队列
代码实现
1 |
|
注意
- 队列(数组)的长度一般都要比要存入的数据长度大不少
- 使用该操作,队列(数组)的最后一个元素不会被使用,这就是第一点的原因
六轴陀螺仪工作原理,数据处理
参考链接
锂电池充放电原理
锂电池充电有四个阶段
涓流充电、恒流充电、恒压充电、充电结束
充电初期采用恒流充电,电池电压增加,当到达一定值后,再采用恒压充电,电流逐渐降低,直到到达设定值,完成充电过程。
阶段1:涓流充电
涓流充电用来先对完全放电的电池单元进行预充 — 恢复性充电。
在电池电压低于满电电压时,先采用最大xxc(一般为0.1C)的恒定电流对电池进行充电。
0.1C即 恒流充电电流的十分之一
阶段2:恒流充电
当电池电压上升到涓流充电阈值以上时,提高充电电流进行恒流充电。
恒流充电的电流一般在0.2C至 1.0C之间。恒流充电时的电流并不要求十分精确,准恒定电流也可以。
阶段3:恒压充电
当电池电压上升到满电电压时,恒流充电结束,开始恒压充电阶段。
阶段4:充电终止
充电结束