- 博客(85)
- 资源 (3)
- 问答 (3)
- 收藏
- 关注
原创 Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容
就是拿运放搭一个可调的LDO 稳压器,类似下面这个功能框图里的感觉。本来应该非常简单,没什么好说的,没想到遇到了非轨到轨运放输出电压饱和的问题。
2024-08-11 00:57:45
935
原创 Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件
就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子,用了4MB 的Flash,默认的Micropython 固件是2MB 的,所以只能自己编译固件。
2024-07-05 06:56:39
857
原创 下载和安装AD19 - Altium Designer 19.1.9 Build 167
虽然有AD24 的安装资源,但是我比较喜欢19 这个数字[doge]
2024-05-26 04:27:04
1147
原创 Altium Designer 中键拖动,滚轮缩放,并修改缩放速度
首先用`#HotIf WinActive("ahk_exe x2.exe")` 检测AD 的窗口,按键映射只会对AD 生效。`MButton::RButton` 就是把鼠标中键映射成右键,从而可以用中键拖动图纸,不过这么一来,所有中键上的功能就都用不了了。下面的`WheelDown::` 和`WheelUp::` 用来加速缩放速度,AD 默认的滚轮缩放太慢了。这几句代码就是接收并拦截发给AD 的滚轮事件,然后,只要用户滚轮滚了一格,就给AD 连续发三次滚轮事件,让AD 认为鼠标已经滚了三格,缩放速度自然
2024-05-26 02:28:16
1323
原创 TM1650 并联在I2C 信号线的处理方法
目的是可以并联多个TM1650 在标准I2C 总线上,并且不影响其他标准I2C 器件。思路就是拿个额外的开关控制每一片TM1650 的使能,就像SPI 的CS 信号那样。
2024-05-13 03:20:31
556
原创 串口单线半双工转换电路
用来把单线半双工模式的串口转换成双线,然后才能连接到普通的双线USB 串口模块,比如CH340 之类的。。他在Arduino 上用软件模拟串口功能,利用这个电路,可以进一步减少串口占用的引脚,ARM 单片机一般都有硬件单线半双工模式,就不用折腾软件时序了,不过软件串口可以在所有IO 引脚上实现通信,某些情况下还是方便的。
2024-05-02 22:12:29
1543
1
原创 STM32F103 USB 端口的电阻配置
参考ST 官方的STLINK V2 电路图,DP,DM 上串的是0 Ω 电阻,所以103 系列芯片应该是内置了匹配电阻,外置的22Ω 可以去掉了。因为,USB 连接上以后,单片机可能没有立即准备好USB 通讯,如果上拉电阻硬连接到3.3V,主机那边立即就检测到了连接,开始枚举设备,单片机就来不及响应。另外,不知道这里为什么要用一个NPN 三极管控制上拉,结果不得不把5V 引过来拉高三极管基极,还得配个电阻分压电路,直接用个PNP 应该完全没问题才对。控制,所以
2024-04-27 22:35:03
654
原创 基于链表的滑动中值滤波器实现思路
基本上,中值滤波,或者说滑动中值滤波,需要做三件事:1. 在新数据添加到窗口的同时,将最旧的数据删除;2. 对窗口中的数据排序;3. 找出中位数;
2024-04-25 03:44:08
676
原创 A1322 电烙铁发热芯热电偶温度与电压数据
温度是用另外的热电偶测温表测量,热电偶贴在发热芯表面。为了或多或少减小误差,电压是在温度比较稳定的时候记录的。室温25 ~ 26摄氏度,所以热电偶的冷端温度大致就是这个室温。从室温26 ℃开始,到450 ℃,看起来还挺线性的,当然,这只是我手头这一根1322 的数据,这种便宜东西参数肯定稳定不了。取温度范围100 到300,电压是3.9 到12.9,斜率为。两根红色线是发热丝,另外两根是热电偶线,透明线是正极,不能搞错了。顺便一说,A1321 是电阻测温,和A1322 完全不一样。
2024-04-21 00:12:29
732
原创 贴片滚珠振动开关 / 振动传感器的用法
比如,用引脚电平变化中断接收信号,中断函数记录一次抖动事件后关闭引脚中断,从而避免快速跳变让单片机卡在中断里,主函数可以在从容处理完别的任务后重启引脚中断。或者每次采样一段时间的抖动,单片机比较闲的时候就启动引脚中断一段时间,持续记录抖动次数,之后再关闭引脚中断,去处理别的事。这种波形和按键按下时的抖动很像,通常是要给它过滤掉的,但现在就得无损失的把信号送给单片机,不能添加电容滤波,不然会大大降低灵敏度。就是有个小滚珠会接通开关两边的电极,振动时滚珠会在内部蹦跳,开关状态就会发生快速变化,从而检测振动。
2024-04-17 00:57:01
545
原创 使用稳压管和三极管射极输出器电路驱动PMOS
栅极驱动电压通过6.8V 稳压管D2 和串联的10k 电阻得到,当下方的NPN 三极管导通时,PNP 三极管Q13 的基极电压大约是30V - 6.8V,以电源正极为参考,就是-6.8V;另外,图中的1K 电阻两端电压是6.1V,那么MOS 管导通后,流过PNP 三极管的常态电流就是6.1mA,而三极管的CE 电压是30 - 6.1 = 23.9V,那么PNP 三极管上的功耗就有大约0.15W,不算很小,需要关注一下发热。如果想减少PNP 管上的功耗,只能增大放电电阻的阻值,那MOS 关断就更慢了。
2024-04-16 05:20:26
710
原创 LTC4054 充电指示灯转灯电路
由于这个芯片只有引脚,不像4056 那样两个引脚能分别接一个LED,要实现充电指示就必须自己整整外围电路。先说明一下,网上常见的这种接法:一个LED 直连引脚,我试了是不行的,即使充满电,LED 始终会微亮。不知道是不是我买的芯片的问题,或许给加个上拉电阻就能解决,但是按你胃,我整了个稍微复杂一点的方案。
2024-04-10 11:30:35
923
原创 实现精简的通用环形缓冲器或环形队列
老实说太简单了,没什么好说的。成员函数的命名参考了C++ 的STL,push和pop应该不用解释,front指头部,back是尾部。
2024-04-07 02:59:01
267
原创 热电偶测温仪UT320D 拆机
性能应该还好吧,毕竟是便宜货。本来打算看看学习一下热电偶电路的前端设计,用什么滤波器、保护电路之类的,结果比较失望。
2024-03-31 21:37:47
320
原创 Python 正则分割字符串并提取匹配的记号和关键词
需求是:原字符串内含有特殊记号,比如,其中_{CC}VCCVDD,这种感觉,方便之后单独处理下标。re库里官方的split函数太“简陋”了,不太好使。
2024-01-26 11:27:23
403
原创 Python 获取字符串前部空格数量或空格片段
有个比较奇怪的需求,就是把字符串前部的空格片段单独提取出来,而不是像往常一样用。把前部的空白都切除掉,这样就能获得第一个非空白字符,然后用。在原字符串里把空白部分切出来。可以用正则表达式,比如。
2024-01-24 08:31:02
731
原创 下载和安装AD14 - Altium Designer 14.3.20.54863
这个版本应该还支持XP 系统[doge],总之就是想安装一下,没什么特别的意义。
2023-12-29 23:49:26
2044
原创 精简体积的OLED 基础驱动库 - OLED_BASIC
1. 目前支持SPI 接口的SSD1316 和I2C 接口的SSD1306,想扩展支持相似的其他SSD 这一家子型号难度应该不大,似乎主要是初始化代码上有区别;2. 不是u8g2 库的替代;3. 不需要显示缓冲区,几乎没有额外的RAM 占用;4. 只支持文本和整数输出函数,不支持矩形以外的绘图功能;5. 想显示图片的话,只要把图片当作大一点字符来用就行,自定义一个单独的字库放进去;6. 自定义字库的部分特意做的很简单,不用像U8G2 库那样还要整一堆编码上的劳什子,取模软件输出的数组直接放进代码就
2023-08-21 17:27:37
456
翻译 PID 算法实现的细节问题处理 - 从新手级别开始逐步完善
翻译自Arduino PID 库作者的系列博客文章:[Improving the Beginner’s PID](http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/)。作者的结论应该经过了不少人的实际检验,而且文章讲得平易近人,不需要太多的理论基础。
2023-08-03 22:33:03
735
原创 简单的按键监听函数 - 按键消抖和长按、双击事件
用一个简单的C 语言函数实现对单个按键的监听,预定可以用在各种芯片平台上,arduino,C51,stm32 等,对硬件没特别的要求。首先明确这个函数要实现的功能,以及调用它的代码要如何响应各种按键事件。上面说的“时间” 都是指函数调用的次数,也就是轮询按键的次数。较短时间或较长时间,意思就是经过的轮询次数的多少。具体是多长时间,取决于调用者调用函数的间隔。这样做是为了减少依赖,不需要有一个时间函数用来提供时间戳,可以用最简单的延时函数循环调用,从而实现更好的通用性。
2023-07-21 15:00:03
1096
原创 有刷直流电机的续流、反向电压和H 桥驱动频率 - 伊朗电系法师视频观后感
从以上这些因素考虑,似乎PWM 频率是越高越好,但就和DC-DC 电源的开关频率一样,频率越高,单位时间开关次数越多,MOS 管就有越多的时间待在过度区间里,从而导致MOS 管的发热增加,整体的效率降低。频率太高还会降低占空比的调节等级数,也就是降低了PWM 分辨率,知道单片机上PWM 原理的人应该都明白这一点。
2023-07-06 02:45:15
5024
原创 ADC 读取电位器旋钮,用回差消除临界值档位跳动
就是比如,用电位器当旋钮做风扇调速,划分出10 个速度档位,对应10 个ADC 转换结果的阈值。如果直接比较阈值,当旋钮拧到临近阈值的地方时,ADC 结果的微小跳动会导致风扇档位在两个级别之间不停左右横跳,因此想到了利用回差来消除抖动。
2023-06-17 23:46:50
3304
原创 可调电源LM317 的内部原理 - 特殊的电压跟随器
简单来说,LM317 内部的参考电压的使用方法是比较特别的,它并不是像简单的电压比较器一样,比较ADJ 引脚和参考电压,如果参考电压比较大就提高输出电压。如果是这样基于比较的原理,那么当ADJ 被强制拉到0V 时,LM317 应该会让输出电压达到最大以尽可能提高ADJ,而实际上此时它的输出电压是1.25V,就是内部参考电压的值。于是就清楚了,直接反馈VOUT 不行,但是给VOUT 乘上一个比例,反馈电压就和VOUT 错位了,反馈值总比输出小,如果没有1.25V 的直流偏置,输出永远保持为零。
2023-06-15 23:00:45
4098
2
原创 STM32 实现简单定时任务调度器,动态创建任务,两种思路实现流水灯
代码实现和硬件没关系,所以并不限于STM32,Arduino 之类的其他地方也能用,只要有一个能获取时间的函数就行,或者说,只要有一个会随着时间自动增加的变量就行,时间单位无所谓,所以确实想的话,拿到电脑上也能用。
2023-06-06 19:27:45
4225
原创 二级指针骚操作实现链表虚拟头节点
重点是不用像其他文章里那样,用一个普通节点当头节点,节省一点空间占用,反正我觉得有点骚。就不详细交代技术背景了,简而言之,就是链表中第一个节点前没有节点了,只有一个指向它的指针,所以不能像其他节点一样对第一个节点进行删除操作,代码中必须判断这个特例,详细的参考。可以用一个普通节点当作头节点来指向第一个节点,从而让第一个节点也有前一个节点,统一操作,如下图:但是头节点里会有一个没用的数据域,浪费空间,所以才想到用二级指针。
2023-06-03 20:10:56
536
原创 用C++ 包装STM32 官方固件库 - 链式调用改写初始化结构体
在继续之前,先说明一下,当然,这么包一层肯定会付出一些代价,包括运行时间和空间占用,后面会有编译结果比较。有官方库“珠玉在前”,我觉得相比之下,这层包装付出的代价并不显著,有兴趣可以看看常用的GPIO 初始化函数在固件库里是怎么实现的,可以说是资源浪费的典范[doge]。另一方面,固件库里都是C 函数,函数实现都分开放在.c 文件里,编译器内联的可能性应该不大,因此就算是简单的给引脚设置个电平,用固件库也会产生额外的函数调用,所以很多人是在宏里自己写寄存器操作的。用C++ 的话,这种简单的函数放在头文件里,
2023-06-01 21:23:56
827
原创 HK32F030MF4P6 引脚分配辅助表格
也适用于HK32F0301MF4P6。官方的SDK 里附带了一个IO SELECT.xlsx 表格,就是用来辅助做引脚功能分配的,不太好用,因为里面用了复选框控件,兼容性不好。于是基于官方的文件,重新设计了一个表格:功能没区别,只是方便的显示出所有引脚的复用功能,标记出已经分配的引脚,避免冲突。标记功能全是用条件格式做的,兼容性好多了,相对更美观。可以随便调整单元格的大小,不会像复选框控件一样错位。
2023-06-01 16:40:30
551
原创 自制Arduino 风格开发板 - HK32F030MF4P6 紧凑开发板
模仿Arduino Nano 做一个HK32F030M 的紧凑开发板,排针间距和Arduino Nano 相同,整体尺寸略小,适合插在面包板上。兼容HK32F030MF4P6 和0301M,板载CH340N 串口和DS1307 时钟模块。。尺寸4.2 X 1.8cm,因为引脚数量更少,本来板子是可以更短一点的,但是没必要。
2023-05-29 17:54:32
1724
1
原创 Arduino 单片机程序中处理时间戳、时间溢出和延时问题
这个话题对其他单片机也适用,就是用来计时的变量万一溢出了该怎么整,类似那个经典的千年虫问题。实际上这个问题在日常生活中也很常见,比如,时钟上的小时最大值为23,从0 开始,每过24 小时归零一次,只按时钟上的小时数来记录时间,最多只能计24 小时。时间超过最大值后归零就是所谓的溢出问题。一种常见的设计是用比较时间戳的方法来预约一个延时任务,比如在1 点整的时候开始一个2 小时的延时任务,1 + 2 = 3,所以任务预约在3 点执行,当前时间大于3 时这个任务就该执行了。
2023-05-28 20:31:48
2960
原创 Real-Time C++ 嵌入式C++ 程序设计(三)
在C++ 中,局部变量可以在第一次使用的地方声明,它们不一定需要放在函数的开头。这可以提高代码可读性并促进编译器优化。例如,下面的代码在使用i、j和k前才声明了整型变量。use_i(i);use_j(j);k < 10;} }实现范围操作。
2023-05-25 21:31:08
682
原创 Real-Time C++ 嵌入式C++ 程序设计(一)
翻译自 Real-Time C++ Efficient Object-Oriented and Template Microcontroller Programming 4th Edition - Kormanyos, Christopher,这书涉及了从C++11 到C++20 的内容,主要介绍使用C++ 的模板、面向对象等特性设计嵌入式程序。书里的示例代码都是公开的:https://github.com/ckormanyos/real-time-cpp。
2023-05-25 15:48:25
807
原创 快速找出PATH 路径下重复的命令程序文件
RT,就是想找出命名冲突的可执行文件。日积月累的,PATH 环境变量里乱七八糟堆了一堆东西,很可能想叫一个命令出来,结果实际执行的是另一个地方的程序。
2023-05-18 02:08:08
288
原创 STM32 编译期检查EXTI 中断函数是否正确定义
检查中断函数的目的是避免被低级错误浪费时间,比如,一开始用PA0 引脚输入中断信号,中断函数写的是,后来引脚换成PA2 了,但是中断函数忘记改。
2023-05-10 22:08:24
585
原创 用CD4051 实现八档位可变 / 可编程增益同相比例运放电路
CD4051 相当于一个单刀八掷的开关,一个公共端对应另一边八个档位,如下图。左边的Z 就是公共端的“单刀”,右边Y0 到Y7 是“八掷”,用A0、A1、A2 三位选择这八个档位。基于CD4051 的变增益电路实现的原理是一致的,只是细节上的处理大致有两种方式。
2023-04-23 14:32:41
4532
2
原创 快速找出满足所需比值的一对电阻值 - Python 函数实现
性能大概算不上快速,但是能用,而且这种寻找最优组合的问题,基本上也只有暴力搜索这一条路可走吧。
2023-04-20 16:04:47
600
2
原创 C++ 特性简化STM32 风格固件库的GPIO 操作,使用HK32F030M
首先要处理的就是引脚定义的问题。这个引脚的Port 指针引脚的Pin时钟一类的宏,有几个固件库函数也要用到,于是常见的写法就是像上面的代码那样,一个引脚要定义好几个宏,东一榔头西一棒槌的,连最简单的给引脚置高电平都得同时引用和// 51 单片机 LED1 = 1;心智负担明显小多了,时间和精力也是很宝贵的,除了AVR,倒是和STM32 的风格差不多[doge]。// 分配PA0 引脚为LED1 LED1 = PA0;// 点亮LED1,置高电平 setpin(LED1);
2023-04-15 00:02:39
594
翻译 Cortex M0 和M0+ 的简单说明 - 《Cortex M0/M0+ 权威指南》 英文版PDF 资料
ARM® Cortex-M0 处理器和 Cortex-M0+ 处理器都是 32 位处理器。它们的寄存器组内部寄存器、数据路径和总线接口都是 32 位。它们都有一个主系统总线接口,因此被认为是冯·诺依曼总线架构。Cortex-M0+ 处理器具有可选的单周期 I/O 接口,主要用于更快地访问外设 I/O 寄存器。
2023-04-13 19:36:37
3204
BPG 图片格式转换工具。
2022-08-31
Circuit Wizard 2 教育版,电路仿真和设计软件
2022-05-27
汇编中用db 初始化栈中数据,运行结果与预期不符
2015-07-31
C程序内存不能为read错误,包含文件和内存操作
2015-07-01
向JS数组无重复添加一列随机数出错
2015-06-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人