boringhex.top博客

非典型程序员的小破站

从头开始组建电子实验室

本文译自 Electronics Lab Equipment: Kitting out a Lab from Scratch

焊台

廉价焊台/烙铁和Weller之间的焊接体验质量存在巨大差异。我强烈推荐直接使用优质Weller烙铁。即使用过了广受欢迎的Hakko,我也可以确定Weller的传热速度和热控制非常出色,并且经过数小时的焊接后,笔柄仍然保持凉爽。焊台质量取决于在0402或更小元件连接到大型接地平面的PCB上快速工作的能力。Weller可以在一秒内取下元件,而大多数焊台只会稍微加热这个小焊盘。Weller很昂贵,但我试过的大约六个顶级竞品中没有一个能与之媲美。

如果不想购买Weller,您至少需要一个配备可互换烙铁头的60W焊台,这样可以轻松购买替换零件。选择可互换烙铁头时,烙铁头越过烙铁的部分越短越好。较短的烙铁头意味着烙铁头将尽可能靠近温度传感器和热源,因此冷却速度不会那么快,在处理较粗的导线或具有较大接地平面的PCB时,焊台设定的温度将更接近烙铁头上的实际温度。

  1. 低预算

WE1010 70W

阅读全文 »

从头开始组建电子实验室

本文译自 Electronics Lab Equipment: Kitting out a Lab from Scratch

随着多次国际迁徙以及在几家公司(或其分支机构)工作,尤其是在没有强大电子工程团队的情况下,我不得不为自己和客户设置多个电子实验室。那些计划进行内部测试的初创公司也需要建立实验室并获取适当的设备。有时,这一切都在非常有限的预算内进行,而在其他情况下,我有几百万美元的预算可供使用。在这篇文章中,我将尝试涵盖不同预算范围,因此,无论您是业余爱好者、一家大型公司/组织打算拓展到尖端电子领域,还是介于两者之间,您都将找到从零开始建立新实验室所需的设备。

以下所选设备基于以下假设:

  • 您主要致力于数字电子学,而不是射频模块或高端音频。
  • 您在内部手工制作和修复原型。
  • 您使用微控制器、FPGA或其他数字处理器,需要同时调试代码和硬件。

如果您刚开始涉足电子学作为爱好,那么这份清单上的一切可能有些过剩;这是大量的工具和硬件。然而,如果您正在设计和制造产品,即使只是为了自己的使用,我认为您最终会发现自己拥有这里列出的所有东西,即使是作为一个业余爱好者或电子工程学生。

预算选项对于学生和爱好者可能会很有用,但可能在性能或使用便捷性上不及专业设备。专业人士将更愿意使用中高档工具,虽然它们更昂贵,但在节省劳动力方面会得到回报。有一些额外资金用于购买好工具的认真的业余爱好者可能会考虑中档选项而非预算选项。所有选项都基于我希望在目标受众手中看到的东西;建议侧重于每美元的总体性能和能力,包括相关的工资,而不仅仅是试图花费很多钱(对于高端选项)或尽量少花钱(对于低端选项)。

我非常犹豫推荐具体的品牌,但如果我偶尔这样做,那是因为我已经尝试过许多竞争品牌,而且不愿意使用其他任何东西。例如,在测试设备方面,这是因为该品牌在该市场细分中以最合理的价格提供最佳规格。通常,我不会购买或推荐某个东西,仅仅因为某个特定品牌生产它,因为我更关心的是工作的正确工具。

绝对基础工具

这些是我认为每个人都应该在自己桌子上准备的组件和工具。无论您是在制作航空航天部件还是组装自己的第一个PCB,这里的一切都适用于您。

手工具

  1. 基板工具夹(不带放大镜)

基板工具夹

超便宜但非常有用。用来固定导线、电路板和元件,超级方便。在放大镜上选择第三个鳄鱼夹。将热收缩套管放在钳口上以保护导线绝缘层和电路板。

阅读全文 »

引言

在现代科技的推动下,锂电池已经成为各种电动设备和能源存储系统的首选能源媒介。然而,锂电池在充电和放电过程中存在一系列潜在的安全隐患,同时其性能和寿命也受到一些限制。为了解决这些问题,锂电池管理系统(BMS)应运而生。

BMS不仅仅是一个简单的监控系统,更是一种智能化的电池管理解决方案,它通过各种传感器、控制器和复杂的算法,实现对电池的精确监测和智能控制。本文将深入解读BMS的工作原理、功能以及在不同应用中的关键作用,以期为读者提供对BMS的全面理解。

1. BMS的基本概念

1.1 什么是BMS

锂电池管理系统,简称BMS,是一种专为锂电池设计的电子系统。其核心任务是监测和管理电池的各项运行参数,以确保电池系统的安全、稳定和高效运行。

BMS通常包括硬件和软件两个部分。硬件部分主要由电池组内的传感器、控制器和连接电池的接口组成,用于实时采集电池的各项数据。而软件部分则负责数据处理、算法运算和决策控制,通过对数据的分析和处理,实现对电池系统的优化管理。

1.2 BMS的作用

BMS的作用可谓多方面,主要包括:

1.2.1 电池保护

BMS通过实时监测电池的电压、电流、温度等参数,防止电池过充、过放、过温等情况的发生。这有效保护了电池系统的安全性。

1.2.2 性能优化

通过对电池单体的均衡充放电控制,BMS可以提高电池组的整体性能,确保每个电池单体都能够充分发挥作用,延长电池的使用寿命。

1.2.3 电池状态估算

BMS通过复杂的算法,估算电池的剩余容量(SOC)和健康状况(SOH),为用户提供准确的电池状态信息,避免电池由于不准确的状态估算而导致的意外情况。

1.2.4 故障诊断

BMS能够实时监测电池系统的运行状态,一旦发现异常情况,可以迅速做出反应,进行故障诊断和隔离,确保电池系统的可靠性。

阅读全文 »

在实际项目中,环形缓冲区的设计要比之前讲到的原型稍微复杂一些,需要一些接口函数来实现数据结构封装。GitHub上有个大帅哥写了一个轻量的环形缓冲区库,可以学习参考,也可以直接集成到自己的项目中,功能已经非常完善。

LwRB

特点

  • 使用C语言编写(C11),与size_t兼容的大小数据类型
  • 独立于平台,没有特定于体系结构的代码
  • 先进先出(FIFO)缓冲区实现
  • 无动态内存分配,数据为静态数组
  • 使用优化的内存复制而不是循环来读取/写入内存中的数据
  • 在作为单个写入和单个读取条目的管道时线程安全
  • 在作为单个写入和单个读取条目的管道时中断安全
  • 适用于在缓冲区和应用程序内存之间进行零拷贝的DMA传输
  • 支持数据的查看、读取跳过和写入前进
  • 实现事件通知的支持
  • 用户友好的MIT许可证
阅读全文 »

2024第一天,继续给自己加点料。

导言

C语言环形缓冲区是一种常用的数据结构,它提供了一种高效的方式来存储和处理数据。本文将深入解析C语言环形缓冲区的定义、原理和应用,并提供一些实际的代码示例。

一、什么是环形缓冲区

环形缓冲区,也称为循环缓冲区或环形队列,是一种具有固定大小的缓冲区,其特点是当缓冲区已满时,新的数据将覆盖最旧的数据。它主要由两个指针(头指针和尾指针)和一个固定大小的数组组成。

二、环形缓冲区的原理

1. 数据结构

环形缓冲区的主要数据结构是一个数组,用于存储数据。此外,还需要两个指针来标识缓冲区的头和尾。

1
2
3
4
5
6
7
#define BUFFER_SIZE 10

typedef struct {
int buffer[BUFFER_SIZE];
int head;
int tail;
} CircularBuffer;
阅读全文 »

这两天在逛社区时,偶然看到一个程序员竞争力矩阵,感觉不管是选择卷,还是选择躺,搞技术的都应该渐进式提高自己的能力,对自己的能力发展做一个计划,而这个表格则可以作为一个路标参考,让我们在技术上不断进步。

这个竞争力矩阵涵盖了计算机科学、软件工程、编程、经验和知识等多个方面。

计算机科学

数据结构

  • Level 0: 不了解数组和链表的区别
  • Level 1: 能够在实际编程任务中解释和使用数组、链表、字典等基本数据结构
  • Level 2: 熟悉基本数据结构的空间和时间权衡,如数组 vs 链表,能够解释哈希表的实现原理并处理冲突,了解优先队列及其实现方式等
  • Level 3: 掌握高级数据结构,如B树、二项堆、斐波那契堆、AVL/红黑树、伸展树、跳表、Trie等

算法

  • Level 0: 无法找到数组中数字的平均值
  • Level 1: 掌握基本的排序、搜索和数据结构遍历和检索算法
  • Level 2: 理解树、图、简单的贪心算法和分治算法,并能够理解这些矩阵级别的相关性
  • Level 3: 能够识别和编写动态规划解决方案,熟悉图算法和数值计算算法,能够识别NP问题等

系统编程

  • Level 0: 不了解编译器、链接器或解释器是什么
  • Level 1: 基本了解编译器、链接器和解释器,理解汇编代码以及硬件层面的工作原理,了解虚拟内存和分页等知识
  • Level 2: 理解内核模式与用户模式、多线程、同步原语及其实现方式,能够阅读汇编代码,了解网络工作原理、网络协议和套接字级编程等知识
  • Level 3: 理解整个编程栈,包括硬件(CPU + 内存 + 缓存 + 中断 + 微码)、二进制代码、汇编语言、静态和动态链接、编译、解释、JIT编译、垃圾回收、堆栈、内存寻址等知识
阅读全文 »

FreeRTOS 中断处理的基础概念

在 FreeRTOS 中,中断处理是通过中断服务例程(ISR,Interrupt Service Routine)实现的。中断服务例程是一个在中断发生时由操作系统调用的函数。FreeRTOS 提供了一些用于在中断处理中使用的函数,以确保在中断上下文中正确使用实时操作系统。

中断服务例程的注册和处理

FreeRTOS 允许用户在中断服务例程中注册中断处理函数。这可以通过 xTaskGetSchedulerState 函数来判断系统的状态,以决定是否需要调用 FreeRTOS 的中断处理函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "FreeRTOS.h"
#include "task.h"

void vISRHandler(void)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;

// 中断处理代码

// 通知等待的任务发生了事件
vTaskNotifyGiveFromISR(/*任务句柄*/, &xHigherPriorityTaskWoken);

// 如果有任务的优先级高于当前运行的任务,需进行任务切换
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

int main(void)
{
// 注册中断服务例程
registerISRHandler(vISRHandler);

// 创建任务
xTaskCreate(vTaskFunction, "Task", 1000, NULL, 1, NULL);

// 启动调度器
vTaskStartScheduler();

return 0;
}
阅读全文 »

简介

CH348Q是沁恒出品的一款USB转8路串口的芯片,USB为2.0接口,其中4路串口支持流控,另外4路不支持流控,之前介绍过一款开源USB转8路串口的板子,文章链接:https://mp.weixin.qq.com/s/KsrV3nwemQyq3tdv7Lky_g;

今天再开源一款USB转4路RS422+4路RS485电路板,电路板采用分层设计,分为上下两层,下层是USB转4路RS422,上层是4路RS485,两层采用铜柱链接,如图:

RS422

RS485

实物图如下:

实物图

一般来讲,我们若使用多路422或485的时候,采用的方法就是使用多个USB转接模块,那样常遇到不知道串口号和模块的对应关系,尤其在无人值守的自启动程序中,这个就非常尴尬。

但是这个模块可以轻松识别到每一路的串口号,不需要每回启动都要选择串口,具体方法请看我以前发过的文章

阅读全文 »

FreeRTOS 是一个开源的实时操作系统,提供了丰富的时间管理和定时器功能,用于实现任务调度、延时等操作。在本文中,我们将深入探讨 FreeRTOS 的时间管理和定时器相关的内容。

时间管理

FreeRTOS 提供了以下几种与时间相关的管理功能:

1. vTaskDelay函数

vTaskDelay 函数用于使任务进入阻塞状态,以实现延时功能。延时的时间以 FreeRTOS 的时钟节拍(tick)为单位。

1
2
3
4
5
6
7
8
9
#include "FreeRTOS.h"
#include "task.h"

void vTaskFunction(void *pvParameters)
{
// 任务执行的代码

vTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1000 毫秒
}

2. vTaskDelayUntil 函数

vTaskDelayUntil 函数用于设置任务的周期性执行,它在指定的绝对时间执行任务,而不是相对于当前时间的相对延时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "FreeRTOS.h"
#include "task.h"

void vTaskFunction(void *pvParameters)
{
TickType_t xLastWakeTime = xTaskGetTickCount();

for (;;)
{
// 任务执行的代码

// 等待下一个周期
vTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000));
}
}
阅读全文 »

在嵌入式系统中,任务管理是一个重要的部分,它涉及到任务之间的通信和同步,信号量,队列,互斥锁和事件标志组等概念。本文将以FreeRTOS为例,详细讲解这些内容。

1. 任务间通信与同步概述

在FreeRTOS中,任务是由一个或多个函数组成的独立的执行流,它们可以独立的运行和调度。任务之间的通信和同步是任务管理的核心内容之一。任务间的通信是指一个任务向另一个任务传递信息,而同步则是指多个任务按照一定的顺序执行。FreeRTOS提供了多种任务间通信和同步的机制,包括信号量,队列,互斥锁和事件标志组等。

2. 信号量的使用与实例

信号量(Semaphore)是FreeRTOS中一种常用的同步机制,主要用于任务间和中断服务例程(ISR)间的通信。它们被用来保护共享资源,使得只有一个任务或者中断服务例程可以访问共享资源,避免了资源冲突的问题。

FreeRTOS中的信号量主要有两种类型:计数信号量和二值信号量。

  1. 计数信号量(Counting Semaphore):是一种可以持有多个“计数”或者“票”的信号量。例如,如果你有一些共享资源,每个资源都需要独立的访问控制,你就可以使用一个初始计数等于资源数量的计数信号量。当一个任务需要访问一个资源时,它会尝试“获取”一个信号量。如果信号量计数大于0,那么信号量计数减1,任务继续执行。如果计数为0,那么任务就会阻塞,直到信号量计数大于0。当任务不再需要访问资源时,它应该“释放”信号量,信号量计数加1。

  2. 二值信号量(Binary Semaphore):是一种只有两个值(01)的特殊信号量。它通常被用作任务之间或者任务与中断服务例程之间的同步机制。当信号量的值为1时,任务可以获取信号量并继续执行。当信号量的值为0时,任务尝试获取信号量会被阻塞,直到信号量的值变为1。二值信号量也可以被用作互斥量(Mutex),用于保护共享资源的访问。

在FreeRTOS中,信号量的操作主要有创建(xSemaphoreCreateBinary, xSemaphoreCreateCounting等函数)、获取(xSemaphoreTake函数)和释放(xSemaphoreGive函数)。在中断服务例程中,获取和释放信号量的函数有所不同,分别为xSemaphoreTakeFromISRxSemaphoreGiveFromISR

阅读全文 »
0%