- 博客(96)
- 收藏
- 关注
原创 PID学习笔记2-PID算法改进之积分项优化
本文总结了江协科技PID课程2-1视频中位置式PID控制的三种抗积分饱和方法:06积分限幅法通过硬性限制ErrorInt防止积分无限累积,适用于执行器易饱和场景;07积分分离法在误差大于阈值时清零积分,远端靠P、D快速响应,近端启用I消除静差;08变速积分法通过连续变化的系数C(|e|)实现平滑过渡,误差大时积分慢,误差小时积分快。三种方法各有优势:积分限幅是基础必备,分离法简单直接适合大步阶定位,变速积分则更平滑适合动态范围大的系统。
2025-08-10 23:39:54
281
原创 PID学习笔记1
【STM32 PID控制实现摘要】 本文基于江协科技PID课程,总结了4种电机控制回路的实现方法:1)位置式PID定速控制;2)增量式PID定速控制;3)位置式PID定位控制;4)增量式PID定位控制。核心差异在于: 控制对象:速度环测量40ms编码器脉冲增量,位置环累计脉冲数; 算法实现:位置式采用绝对输出(含显式积分项),增量式采用输出增量叠加; 参数影响:Kp决定响应速度,Ki消除稳态误差但易引发振荡,Kd抑制超调但放大噪声; 抗饱和特性:增量式天然更抗积分饱和,位置式需额外处理积分限幅。
2025-08-09 19:29:43
750
原创 MQTT与服务器通讯
摘要:本文详细介绍了MQTT 3.1.1协议的核心功能与实现要点,包括协议特性、消息模型、主题规则、QoS级别、遗嘱机制等关键技术。同时提供了基于STM32+ESP8266的物联网终端实现方案,通过温湿度传感器采集数据并上传至OneNET平台。内容涵盖协议报文解析、主题设计规范、错误处理建议,以及完整的硬件连接方案和代码实现(包括DHT11驱动、ESP8266通信、MQTT报文打包等模块),为物联网开发者提供了从协议理解到落地的完整参考。
2025-08-08 22:35:53
828
原创 CAN通信
CAN总线技术摘要 CAN(控制器局域网络)是由Bosch开发的串行通信协议,具备多主通信、高可靠性和强抗干扰能力,广泛应用于汽车电子(发动机控制、ABS等)和工业自动化领域。其物理层采用双绞线总线结构,两端需接120Ω终端电阻,电平标准为差分信号(显性/隐性逻辑)。协议层支持多种帧类型(数据/远程/错误帧),采用基于ID优先级的仲裁机制。STM32单片机内置CAN控制器(bxCAN),支持标准/扩展帧、硬件过滤和自动重传等功能。
2025-08-06 23:27:16
698
原创 4G模块(E840)给单片机发送指令
本文介绍了一个基于STM32和E8404G模块的远程控制LED系统。系统通过STM32的USART2串口与E8404G模块通信,实现4G网络数据的接收与处理。主程序通过串口中断接收E840模块数据,并在主循环中检测"ON"/"OFF"指令控制LED状态。系统采用环形缓冲区存储数据,支持格式化数据收发,可实现实时远程控制。工作流程展示了从云端/手机APP发送指令到最终控制LED的过程,包括数据转发、串口接收、指令解析等环节。
2025-08-02 00:14:37
273
原创 通过WIFI(ESP8266)给单片机发送指令
本文介绍了一个基于ESP8266 WiFi模块的远程控制系统。系统通过STM32单片机连接ESP8266模块,实现WiFi网络通信和TCP服务器连接。代码包含ESP8266初始化、串口通信、网络连接和透传模式设置等功能。主程序通过解析接收到的"ON"/"OFF"指令控制外设。系统工作流程为:终端设备通过TCP发送指令→ESP8266通过串口转发给单片机→单片机解析并执行相应控制操作。
2025-08-01 21:15:33
129
原创 WIFI模块(ESP8266连接串口2,作为服务器)
本工程实现了STM32通过USART2串口控制ESP8266 WiFi模块的基础功能,主要包括: 核心功能 ESP8266初始化(AT指令测试、模式设置) WiFi热点(AP)模式配置 TCP服务器建立(默认端口8080) 串口数据收发(中断方式) 应用场景 物联网设备无线通信 远程调试接口 WiFi数据透传中继 智能设备无线控制 工作流程 硬件连接:STM32 USART2 ↔ ESP8266 初始化:AT指令测试 → AP模式设置 → 多连接配置 → 启动TCP服务
2025-08-01 17:02:36
627
原创 WIFI模块(ESP8266连接串口2,连接TCP服务器)
摘要:本工程实现STM32通过ESP8266 WiFi模块自动连接TCP服务器的功能。系统采用72MHz主频STM32,通过USART1与PC通信(115200波特率),USART2与ESP8266通信。主程序自动完成WiFi连接(支持SSID/密码配置)、TCP服务器连接(IP/端口可配)并进入透传模式。每500ms向服务器发送测试数据,接收响应后通过串口1输出。
2025-08-01 16:28:33
740
原创 WIFI模块(ESP8266连接串口2,入网功能实现)
该代码实现了STM32通过USART2与ESP8266模块通信,自动完成WiFi连接初始化。主要功能包括:1) 通过串口1(USART1)输出调试信息;2) 自动发送AT指令配置ESP8266为STA模式并连接指定WiFi;3) 实现串口中断处理接收不定长数据;4) 提供AT命令发送和响应检测功能。系统上电后会自动完成模块检测、模式设置、WiFi连接等步骤,所有操作状态通过串口1实时输出。代码结构清晰,包含错误处理和超时机制,可直接用于嵌入式WiFi通信项目开发。
2025-08-01 15:47:03
559
原创 蓝牙模块(HC-08,串口2控制)
本系统实现了STM32通过蓝牙模块与手机APP及上位机的双向通信。硬件连接上,STM32的UART1通过USB-TTL模块连接电脑串口助手,UART2连接蓝牙模块与手机APP通信。软件设计中采用HAL库和标准库两种实现方式,均通过串口中断(RXNE+IDLE)实现不定长数据接收,其中蓝牙模块支持AT指令配置和命令控制功能。系统特点包括:1)双串口独立工作,STM32可同时与电脑和手机通信;2)支持printf重定向,便于调试;3)采用空闲中断机制实现变长数据帧接收。
2025-07-31 23:42:43
852
原创 STM32串口通讯
摘要:USART(通用同步/异步收发器)是嵌入式系统中常用的串行通信接口,支持同步(USART)和异步(UART)两种模式。异步模式下只需TX/RX两根线,通过起始位、数据位、校验位和停止位实现通信;同步模式则需额外时钟线(SCLK),适合高速场景。STM32的USART配置包括GPIO初始化(TX推挽输出、RX浮空输入)、波特率设置、数据格式定义等。
2025-07-31 16:29:39
632
原创 SPI同时控制OLED和W25Q128(实现一主多从)
摘要:本文介绍了如何使用STM32的SPI1总线分时复用控制W25Q128 Flash存储器和SSD1306 OLED屏幕。通过硬件连接和软件设计,实现了SPI总线共享而片选独立控制的方法。文中详细阐述了SPI初始化、引脚配置、外设驱动实现及分时访问流程,重点说明了CS片选管理、数据传输时序等关键点,并提供了常见问题的解决方法。该方案采用标准库实现,适用于需要SPI总线复用多个外设的应用场景。
2025-07-30 23:32:19
602
原创 SPI与W25Q通信
摘要:本文详细介绍了SPI与IIC两种串行通信协议的对比,重点分析了SPI通信协议的工作原理、四种工作模式及硬件架构。以W25Q128 SPI Flash存储器为例,阐述了其存储结构、指令集和状态寄存器,并提供了基于STM32标准库和HAL库的驱动程序实现方案,包括初始化配置、数据读写、扇区擦除等关键操作。通过代码示例展示了SPI与W25Q128的具体通信流程,强调了写使能、忙状态检测等操作要点,为嵌入式系统开发提供了实用的SPI Flash驱动参考。
2025-07-30 19:30:26
786
原创 IIC控制OLED屏幕显示
本文详细介绍了IIC通信协议的工作原理及其在OLED显示控制中的应用。IIC是一种半双工、同步串行总线协议,通过SCL时钟线和SDA数据线实现主从设备通信。文章重点阐述了IIC的总线结构、通信流程(包括起始/停止信号、地址传输、数据帧和应答机制)以及波形特性。 在应用层面,文章以STM32控制SSD1306 OLED为例,详细解析了IIC接口的硬件连接、软件模拟时序实现方法,以及OLED的初始化、显示控制等关键操作。
2025-07-30 00:36:11
573
原创 FreeRtos(基于FreeRtos的智能台灯)
本文介绍了一个基于FreeRTOS的智能灯光控制系统优化方案。系统通过红外传感器检测人体并实时测量距离,距离过近或久坐时间超过阈值会触发报警。提供了三种工作模式:智能模式(根据光照自动调节灯光)、按键模式(手动调节)和远程模式(蓝牙控制)。优化内容包括:1) 使用宏定义集中管理常量参数;2) 对系统状态结构体和变量进行封装;3) 改进模式切换的边界处理;4) 优化任务优先级和互斥机制;5) 增强代码风格和注释规范。
2025-07-27 23:59:35
257
原创 回调函数的使用
摘要:回调函数是通过函数指针传递到另一函数中的可调用函数,实现"程序反向调用自定义代码"的功能。C语言中,通过typedef定义函数指针类型,在主逻辑函数中调用回调函数实现灵活功能。示例展示了冒泡排序通过回调实现升/降序切换,以及学生查询系统通过回调实现不同查找条件。回调函数在处理事件、异步操作等场景有广泛应用,能有效提高代码的复用性和灵活性。
2025-07-27 15:40:06
213
原创 FreeRtos(基于FreeRtos的智能门锁)
摘要:本文介绍了一个基于FreeRTOS的智能门锁系统优化方案。系统通过矩阵键盘输入密码,正确时开锁,错误时提示并记录错误次数,三次错误触发蜂鸣器报警3秒。优化重点包括:1)集中管理常量参数,便于维护;2)改进枚举类型定义,提高代码可读性;3)限制全局变量作用域;4)增强消息队列发送的健壮性;5)增加任务空闲延时降低功耗;6)统一时间单位转换。系统采用多任务架构,包含键盘扫描、密码处理、显示控制等模块,密码存储在W25Q128闪存中,OLED屏幕实时显示状态信息,实现了安全可靠的门锁控制功能。
2025-07-27 14:31:26
150
原创 FreeRtos项目(基于FreeRtos的人流控制系统)
【优化摘要】本项目基于FreeRTOS实现人员通行控制系统,通过红外传感器检测人员并计数,控制LED、蜂鸣器和继电器状态。主要优化包括:1)采用计数型信号量管理通行次数,删除冗余变量;2)使用xQueueOverwrite确保LCD显示最新数据;3)精简设备控制任务的LED闪烁逻辑,改用vTaskDelayUntil精确计时;4)移除未使用的宏和冗余互斥锁;5)通过任务队列实现模块解耦,提升系统可维护性。优化后代码更简洁高效,各任务职责更明确,通信机制更合理。
2025-07-26 15:28:42
750
原创 内存管理的实现
摘要:本文系统介绍了FreeRTOS内存管理机制,重点分析了其五大内存管理算法(heap_1~heap_5)的特点与适用场景,其中heap_4因支持空闲块合并和碎片防护被推荐为通用方案。文章详细解析了pvPortMalloc/vPortFree等专用API的使用方法,对比了与标准C库malloc/free的差异,强调其确定性、线程安全和可调试优势。通过按键控制内存分配释放的实例演示,展示了如何实时监控堆状态(xPortGetFreeHeapSize)和避免内存泄漏。最后指出实际内存消耗包含管理开销和对齐填充
2025-07-24 23:42:36
658
原创 低功耗的实现
摘要:本文详细介绍了STM32在FreeRTOS系统中实现Tickless低功耗模式的方法。通过对比Sleep、Stop、Standby三种低功耗模式的特点,重点阐述了Tickless Idle模式的运行机制和时钟补偿技术。文章提供了具体的配置步骤和代码示例(基于STM32CubeMX/HAL),包括关键API说明、预处理/后处理函数实现,以及通过关闭GPIO时钟降低功耗的实际操作。测试表明,Tickless模式可显著降低功耗,但需注意任务中添加vTaskDelay()以保证休眠效果,且会影响程序烧录方式。
2025-07-24 22:04:48
1032
原创 软件定时器的实现
本文介绍了FreeRTOS软件定时器的核心概念与使用技巧。主要内容包括:1.软件定时器与硬件定时器的区别,前者基于系统Tick实现,适合非实时场景;2.定时器创建、启动、停止等API的使用方法;3.回调函数设计原则,强调不能阻塞;4.单次定时器与周期定时器的应用场景;5.实际代码示例展示按键控制定时器启停的典型用法。文章特别指出单次定时器会自动停止的特性,并提供了调试串口输出的分析说明,帮助开发者理解定时器的运行机制和常见问题。
2025-07-24 17:14:51
693
原创 任务通知的实现
FreeRTOS任务通知机制是一种轻量级的任务间同步和通信方式,通过内置的通知值和状态实现高效通信。其优势在于无需额外内存分配,资源占用小且性能高,适合高频或实时性要求高的场景。支持信号量、事件组和消息队列的简化实现,但仅限点对点通信。主要API包括xTaskNotifyGive(通知值自增)、xTaskNotify(灵活修改通知值)及其ISR版本,以及接收通知的ulTaskNotifyTake和xTaskNotifyWait。通过合理使用通知值和位操作,可模拟二值信号量、计数信号量、事件标志组等功能。该机
2025-07-24 13:54:56
590
原创 事件标志组的实现
FreeRTOS事件标志组是一种高效的任务同步机制,允许通过二进制位管理多个事件。它支持32个独立事件位,能实现多任务间的"与/或"条件触发,比信号量更适合复杂同步场景。核心API包括创建事件组、置位/清除事件位、等待事件等操作,其中xEventGroupWaitBits可配置等待任意或全部事件发生。使用时需注意位掩码定义、中断安全API区分以及事件位清除策略。示例展示了按键触发事件和任务监听事件的典型应用场景,通过位操作实现精确的事件同步控制。
2025-07-24 00:00:29
885
原创 队列集的实现
FreeRTOS队列集机制详解:实现多队列/信号量的高效事件监听 摘要:队列集是FreeRTOS提供的一种高效事件监听机制,允许单个任务同时阻塞等待多个队列或信号量的事件触发。相比传统轮询方式,队列集显著提升CPU利用率,特别适合多通道事件聚合场景。通过xQueueCreateSet创建队列集后,使用xQueueAddToSet添加空队列/信号量成员,任务通过xQueueSelectFromSet阻塞等待任一成员触发事件。
2025-07-23 21:33:26
958
原创 互斥信号量的作用
互斥信号量(Mutex)是一种用于保护临界资源的同步机制,确保同一时间只有一个任务能访问共享资源。与二值信号量相比,Mutex具有拥有者概念,支持优先级继承机制,能有效解决优先级反转问题。使用时需注意:获取和释放必须由同一任务完成。典型应用包括保护全局变量、外设操作等共享资源。通过优先级继承,当高优先级任务等待低优先级任务持有的Mutex时,系统会自动提升低优先级任务的优先级,确保高优先级任务能及时获得资源。
2025-07-23 17:29:57
562
原创 优先级反转
摘要: 优先级反转是实时系统中高优先级任务因低优先级任务占用关键资源而被阻塞,同时被中等优先级任务抢占CPU的现象,导致系统实时性受损。典型场景涉及三个不同优先级的任务,当低优先级任务持有资源时,高优先级任务被迫等待,而中优先级任务插队运行。FreeRTOS通过优先级继承协议(自动提升低优先级任务优先级)解决该问题,但该机制仅适用于互斥信号量。实验表明,优先级反转需特定条件触发(如低优先级任务先获取资源),可通过调整任务创建顺序模拟。在安全关键系统中,使用互斥信号量而非普通信号量是避免优先级反转的有效策略。
2025-07-23 15:36:39
596
原创 计数型信号量的实现
计数型信号量是一种可递增/递减的计数器,用于管理多资源或累积事件。与二值信号量不同,它允许计数大于1,适用于停车场车位管理、按键事件累积等场景。其核心机制基于队列操作:Give使计数+1,Take使计数-1,计数为0时Take阻塞。FreeRTOS提供xSemaphoreCreateCounting创建信号量,xSemaphoreTake/xSemaphoreGive进行获取/释放操作,以及中断安全版本xSemaphoreGiveFromISR。使用时需注意:中断服务程序应避免耗时操作(如printf),且
2025-07-23 14:07:50
546
原创 二值信号量的实现
本文介绍了二值信号量的概念和应用。二值信号量是一种只能取值0或1的信号量,主要用于任务同步和事件通知。其工作机制包括任务调用xSemaphoreTake()等待信号量,中断服务函数通过xSemaphoreGiveFromISR()释放信号量。文章详细解析了创建、释放和获取二值信号量的API函数,并提供了FreeRTOS中的实现示例。特别强调了使用注意事项:二值信号量只能单次释放和获取,成对出现;任务循环中必须添加延时以避免CPU资源独占。
2025-07-23 10:35:39
923
原创 消息队列(大数据发送与接收)
摘要:本文演示了FreeRTOS中使用队列进行任务间通信的示例。通过创建三个任务,task1控制LED闪烁,task3扫描按键并发送字符串指针到队列,task2接收队列消息并打印。关键点包括:1) 数组名和首元素地址的等价性(message等同于&message[0]);2) 队列存储的是字符串指针(char*),需正确设置队列项大小(sizeof(char*));3) 接收端直接使用指针访问字符串内容。示例展示了如何通过队列高效传递字符串指针而非拷贝数据。
2025-07-22 23:07:16
164
原创 消息队列(发送与接收)
FreeRTOS队列是一种线程安全的任务间通信机制,采用FIFO结构,支持任务/中断间的数据传递。队列可存储任意数据类型,提供多种API:创建队列(xQueueCreate)、发送数据(xQueueSend/xQueueSendToFront/xQueueOverwrite)、接收数据(xQueueReceive/xQueuePeek)等,并支持中断安全操作(xQueueSendFromISR)。
2025-07-22 21:55:53
553
原创 相对延时和绝对延时
FreeRTOS延时函数摘要 FreeRTOS提供了两种主要延时函数:vTaskDelay(相对延时)和vTaskDelayUntil(绝对延时)。vTaskDelay从调用时刻开始延时指定tick数,适用于简单延时但不保证周期同步;vTaskDelayUntil基于基准点进行周期性延时,能确保严格周期执行,适用于定时任务。
2025-07-22 16:46:18
870
原创 中断管理(防止printf乱码输出)
本文介绍了嵌入式系统中临界区保护和中断优先级管理的实现方法。主要内容包括:1. 中断优先级管理机制,通过BASEPRI寄存器屏蔽特定优先级中断;2. 临界区代码保护原理,使用任务/中断级临界区保护共享资源;3. 调度器挂起与恢复的实现对比;4. 实际应用中通过定义debug_printf宏,将printf操作置于临界区内,有效解决了多任务环境下串口输出乱码问题。这些方法能确保关键代码的原子执行,提高系统的可靠性和调试效率。
2025-07-22 15:35:52
852
原创 任务挂起与恢复(含中断)
摘要:本文详细介绍了FreeRTOS中的任务挂起(vTaskSuspend)与恢复(vTaskResume/xTaskResumeFromISR)函数。任务挂起会将任务移出调度队列,恢复时需区分普通任务和中断上下文。特别强调了在中断中使用恢复函数时的注意事项:必须设置NVIC优先级分组为4,中断优先级数值需≥5(对应较低的硬件优先级),且需处理返回值决定是否触发上下文切换。
2025-07-22 11:13:23
936
1
原创 FreeRTOS静态创建任务与删除
【摘要】FreeRTOS静态任务创建通过用户预先分配任务堆栈(StackType_t数组)和任务控制块(StaticTask_t)实现,使用xTaskCreateStatic()接口创建任务。相比动态创建,静态方式避免了内存碎片,适用于资源受限的嵌入式系统。完全静态模式下还需为系统任务(空闲/定时器)分配内存,并通过vApplicationGetIdleTaskMemory等回调函数告知内核。核心流程包括:1)预分配任务堆栈和TCB;2)调用静态创建API;3)配置系统任务内存。静态创建具有确定性强、可靠性
2025-07-21 23:49:57
642
原创 FreeRTOS删除任务
vTaskDelete()是FreeRTOS中用于删除任务的函数。它通过传入任务句柄来指定需要删除的任务,若参数为NULL则表示自删除当前任务。调用该函数后,任务会被从调度器移除,其分配的堆栈和控制块等资源会被自动释放,无法恢复。此函数常用于任务完成自身使命后自我删除,或由其他任务根据需要删除指定任务,以节省系统资源并提高系统运行效率。
2025-07-21 22:23:18
344
原创 FreeRTOS中动态创建任务
FreeRTOS任务动态创建方法摘要 FreeRTOS的任务是基本的执行单元,通过xTaskCreate()函数实现动态创建。创建任务时需要指定任务函数、名称、堆栈大小、参数、优先级和任务句柄。其中堆栈大小以字为单位,优先级数值越大级别越高。任务创建成功后立即进入就绪态,等待调度器分配CPU资源。示例代码展示了如何创建两个LED控制任务,分别以不同频率闪烁LED。动态创建的优势在于运行时分配资源,任务删除时自动释放,但需注意堆栈和内存管理。创建失败需检查返回值,防止资源不足导致系统异常。
2025-07-21 18:06:24
404
原创 Hash表的实现(链地址法)
哈希表是一种基于键值对的高效数据结构,通过哈希函数将键映射到数组下标实现快速访问。其核心原理包括:哈希函数设计(如取模法)、冲突处理(链地址法和开放定址法)和负载因子控制。主要操作(查找、插入、删除)在理想情况下时间复杂为O(1)。链地址法通过数组+链表结构处理冲突,将哈希值相同的元素存储在同一个桶的链表中。哈希表牺牲空间换取时间效率,适用于需要快速查找的场景,但不保证元素顺序。实现时需注意动态扩容、内存管理等问题,合理选择哈希函数和冲突解决策略对性能至关重要。
2025-07-20 12:55:50
862
原创 树的实现[特殊字符]
树是一种非线性数据结构,由n≥0个节点组成的有限集。本文系统介绍了树的基本概念、存储结构和常用操作。主要内容包括:1)树的定义:由根节点和若干互不相交的子树构成,具有层次性和递归性;2)存储结构:链式存储(二叉树和多叉树)和顺序存储(完全二叉树);3)基本操作:插入、删除、查找节点及多种遍历方式(先序、中序、后序、层序);4)树的统计:计算深度、节点数等;5)代码实现:给出了C语言实现的树结构定义和操作函数,包括递归遍历、队列辅助的层序遍历等。
2025-07-19 20:59:25
780
原创 链式队列的实现
链式队列是一种基于链表实现的先进先出(FIFO)数据结构,通过带头结点的单链表实现。其主要特点包括:入队操作在链表尾部(O(1)时间复杂度),出队操作在链表头部(O(1)时间复杂度),动态内存分配使队列长度不受限制。与顺序队列相比,链式队列无"假溢出"问题,空间利用率更高,适合长度变化大的场景。核心操作包括初始化、入队、出队、判空等,通过维护front和rear指针实现高效操作。代码示例展示了完整的链式队列实现,包括节点插入删除、判空处理等关键细节。
2025-07-19 15:21:11
606
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人