- 博客(35)
- 收藏
- 关注
原创 基于stm32的平衡车
本文介绍了一种基于STM32的动量轮控制系统设计方案。系统采用STM32f103c8t6作为主控芯片,通过定时器输入捕获检测电机转速,并输出PWM波控制DRV8833驱动芯片。姿态检测由MPU6050传感器实现,采用卡尔曼滤波融合加速度计和陀螺仪数据以提高精度。通信方面使用IIC总线与传感器交互,并采用蓝牙模块实现手机远程控制。系统采用PID双环控制算法调节电机转速,通过动态调整PWM占空比实现稳定控制。整体方案实现了对动量轮转速的精确测量和控制,同时保证了系统姿态检测的准确性。
2025-11-18 18:15:37
987
原创 FREERTOS
FreeRTOS是一款轻量级开源实时操作系统内核,专为资源受限的嵌入式系统设计。它具有任务管理、内存管理、消息队列等核心功能,支持优先级和轮转调度算法,采用双向链表实现高效任务调度。相比商业RTOS,FreeRTOS完全免费、可移植且可裁剪,特别适合RAM资源有限的小型单片机系统。其优势包括实时响应、任务优先级管理防止资源冲突、灵活的内存分配方式(动态/静态),以及对任务数量无限制等特点。系统通过任务控制块(TCB)管理任务,采用创新的链表结构实现调度,兼顾了实时性和资源效率。
2025-11-13 18:37:55
407
原创 嵌入式(8)——EEPROM
摘要:EEPROM是一种掉电后数据不丢失的可擦写存储芯片,支持随机地址读写和写保护功能。其配置包括型号、页大小、控制引脚等参数。通过I2C接口实现简单读写操作:写操作需要发送设备地址、目标地址和数据;读操作则先发送地址,再读取数据。示例代码展示了基本的EEPROM读写函数实现方式。
2025-09-25 00:30:00
148
原创 嵌入式(7)——i2C
I2C总线是一种串行通信协议,用于连接微控制器和外设。它支持多主机操作,兼容标准和快速模式,并可与SMBus/PMBus协议互通。当硬件缺少I2C支持时,可通过GPIO模拟实现:1)用两个IO口分别模拟SCL时钟线和SDA数据线;2)按协议时序实现起始/停止信号;3)通过位操作完成字节收发;4)包含ACK/NACK应答机制。文中提供了完整的软件模拟实现代码,包括引脚控制、时序延迟、数据读写等关键函数。这种模拟方法可在无专用硬件的场景下实现I2C通信功能。
2025-09-24 00:30:00
248
原创 嵌入式(5)——ADC
STM32系列MCU的12位逐次逼近型ADC具有18个通道,支持16路外部和2路内部信号采集。其主要特性包括:12位分辨率、多模式转换(单次/连续/扫描/间断)、数据对齐方式可选、模拟看门狗功能、最高14MHz输入时钟。支持自校准、DMA传输和中断触发,转换时间最快1μs(56MHz时钟)。工作电压2.4-3.6V,输入范围VREF-≤VIN≤VREF+。HAL库提供了简化的API接口,如HAL_ADC_Start()启动转换,HAL_ADC_GetValue()获取结果值。该ADC模块适用于需要高精度模拟
2025-09-23 00:00:00
247
原创 嵌入式(3)——RTC实时时钟
RTC实时时钟是一种独立定时器,可为系统提供时钟和日历功能。其核心特性包括:32位可编程计数器、断电后通过备用电源VBAT保持计时、可编程预分频系数及三种时钟源选择。RTC模块位于后备区域,系统复位时数据不会丢失。在软件实现上,需注意控制寄存器访问权限,并通过特定操作使能后备区域访问。代码示例展示了如何设置RTC时间、日期以及通过串口传输实时数据,同时提到需要软件校准日期的问题,最后通过备份寄存器验证实现数据持久化。
2025-09-22 00:00:00
669
原创 嵌入式(4)——DAC
本文介绍了DAC(数字/模拟转换器)的主要特性及应用。DAC支持8/12位模式,具有双通道独立/同步转换功能,支持左右对齐、波形生成和DMA传输。通过HAL库可便捷实现DAC配置,关键函数包括设置输出电压值HAL_DAC_SetValue()和启动转换HAL_DAC_Start()。DAC模块需外接VREF+参考电压以提高精度,适用于需要高精度模拟输出的应用场景。
2025-09-21 14:06:04
157
原创 嵌入式(2)——HAL_GetTick()
本文介绍了HAL_GetTick()函数在嵌入式系统中的计时功能,该函数以毫秒为单位记录系统运行时间。文章展示了两个应用示例:1)通过时间变量控制GPIO端口定时翻转;2)结合HAL_Delay()函数估算程序执行时间并控制LED。这些示例演示了如何利用HAL_GetTick()实现精确的时间控制和程序计时功能。
2025-09-21 13:31:30
343
原创 嵌入式篇——GPIO
GPIO 是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。所有的GPIO引脚都有基本的输入输出功能。
2025-09-21 13:27:13
698
原创 力扣212
#include<iostream>#include<vector>using namespace std;int maxProfit(vector<int>& prices){ int min=prices[0];//买入的最小值 int max = 0;//最大利润 for (int i = 1; i < prices.size(); i++) { max = max < prices[i] - min ? prices[i] - min : max; min
2025-04-17 10:33:28
208
原创 用最简单的方式了解单例模式
单例模式就类似于一个小按钮,每次点击这个按钮就会创建一次对象,以次来调用类里面的函数。二:在函数内创建一个static AAA stance。(sendMsg为类AAA中的函数)一:创建一个返回值为对象的函数。例如:(类名:AAA)三:返回该stance。
2025-04-17 10:27:55
548
原创 时间复杂度和空间复杂度
O() 大O法表示的是算法运行的快慢(类似于运行次数的抽象归类)O(n*logn),这样的包括快速排序——一种速度很快的排序方法。O(logn),也叫对数时间,这样的时间复杂度常用于二分查找。O(n^2),这样的算法包括选择排序——一种较慢的排序方法。3、如果最高阶数存在,且系数不为1,则去除该项数的常数。2、在修改后的运行次数函数中,只保留最高阶数。常见的复杂度类型,以及常见的大O复杂度。O(n),也叫线性时间,常用于简单查找。1、用常数1取代运行中的所有加法常数。常数阶、对数阶、线性阶、平方阶、
2025-04-15 21:30:31
438
原创 继承类在QT里面的应用(一)
客户端与服务器创建链接后,在CLIENT内创建TcpSocket,便于pdu通信协议写入tcpsocket,被服务器接收。(4) 客户端创建消息接收函数,抓取响应PDU,做出响应的结果(例如:MessageBox::info……(1) 该ui类必须继承CLIENT,作为该类的子类,这样才能调用client内创建的tcpsocket。(3) 服务器创建消息接收函数,经过数据库函数处理后,创建对应的“RESPOND”响应pdu。创建新的UI类时,如何在该UI类内调用tcpsocket来实现服务器响应?
2025-04-14 09:29:13
226
原创 C++中的构造函数
构造函数在创建对象时,编译器会自动调用函数,无需手动调用。构造函数和类名相同,没有返回值且不写void。构造函数的调用,在对象创建的过程中进行实现。构造函数可以有参数,因此可以发生重载。
2024-10-30 17:09:47
375
原创 C++中类的访问权限
public://公有权限:类内(类内的成员函数内访问),子类,对象访问(通过"."(点)访问)protected://受保护的:类内访问,子类访问。private://私有的:类内访问。
2024-10-30 16:55:22
278
原创 C++中的类和对象
C++中,类的内存只包括非静态成员变量,成员函数和成员变量分开存储,且静态成员变量单独存放在静态区。具有相同性质的==对象==,我们可以抽象为==类==,人属于人类,车属于车类。利用类和动态数组进行结合,统计管理信息(代替结构体和链表的结合)C++认为==万事万物都是对象==,对象有其属性和行为。C++面向对象的三大特征为:==封装、继承、多态====类==类似于结构体,具有结构体的部分内容和功能。float不是对象,b是对象;例如:人可以是对象,车也可以是对象;封装:将属性和行为进行封装,
2024-10-30 16:54:34
149
原创 用最简单的方法理解 多继承
类的创建需要创建内存,所以要在空类中去创建一个字符进行占据内存;多继承会出现二义性的问题,一般通过作用域来实现。空类的大小(size)=1;
2024-07-15 19:57:05
119
原创 哈希表原理
对于val=99的这个数据,经过哈希函数求得,应放入key=2的位置,但是key=2的位置存在数据,因此将会一位一位的向后进行查找,直到发现val为空的哈希表位置,并且将其存入。值(val) :类似于数组的元素,可以为任意类型哈希表不存在元素访问溢出的情况,只要访问未创建的元素,便会创建一个值为0的键值对。1、输入域 f(string)无穷大(输入可以是字符串),输出域有限(int类型的范围限制)3、如果输入的参数是相同的,那么输出一定是相同的,没有任何的随机成分(查找、删除、修改)
2024-07-14 17:48:52
1822
原创 《时间复杂度和空间复杂度》简要说明
O() 大O法表示的是算法运行的快慢(类似于运行次数的抽象归类)O(n*logn),这样的包括快速排序——一种速度很快的排序方法。O(logn),也叫对数时间,这样的时间复杂度常用于二分查找。O(n^2),这样的算法包括选择排序——一种较慢的排序方法。3、如果最高阶数存在,且系数不为1,则去除该项数的常数。取决于算法执行过程中所需要的辅助空间占输入空间的大小。2、在修改后的运行次数函数中,只保留最高阶数。O(n),也叫线性时间,常用于简单查找。常数阶、对数阶、线性阶、平方阶、
2024-07-14 17:42:48
242
原创 七大经典算法排序系列(二)
最坏的情况:该数组要进行依次排序,因此为O(n^2)想比于冒泡排序的优点:大大减少了数据位置移动的次数。最好的情况:该数组本来就具备排序,因此为O(n)【3 2 3 1 1】排序后,3会排在3的前面。
2024-07-14 17:40:23
158
原创 this指针::
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。this 是指向当前对象的指针,那个对象调用包含this指针的函数,this指向那个对象。this指针在函数调用的时候,指向的是对象;(由此修改对象中的成员变量)this一般在构造函数中使用,用来区分成员变量和参数。
2024-06-21 10:32:15
254
原创 创建类型链表:
2、堆区的内存大,而且在作用域结束的时候,不会被自动释放,适合进行数据的存储。1、指针定义在栈区,属于局部变量,在作用域结束的时候,自动释放;
2024-06-21 10:31:29
353
原创 C++析构函数
再没有实现析构函数的时候,编译器会自动生成析构函数(什么也不干的析构函数)析构函数是释放指针所指向的堆区内存,防止内存泄漏。在对象被释放的时候,会自动调用析构函数。【先调用析构函数,再释放指针】【先调用析构函数,再释放指针】没有返回值,也不写void。名字和类名相同,前面有~
2024-06-21 10:30:59
158
原创 C++构造函数
是给成员是赋值的构造函数和类名相同,并i且没有返回值且不写void构造函数在创建对象时,编译器会自动调用函数,无需手动调用构造函数可以有参数,因此可以发生重载构造函数的调用,在对象创建的过程中进行实现。
2024-06-21 10:29:34
212
原创 拷贝构造函数调用时机
*什么是拷贝(复制)构造函数?用已经存在的对象拷贝新的对象拷贝构造函数在什么时候被调用?用已经存在的对象拷贝新的对象当对象以值的形式作为函数参数当对象以值的形式作为函数的返回值深拷贝和浅拷贝有什么区别?浅拷贝就是简单的赋值操作,会造成同一块堆区内存被释放两次成员变量有指针的时候使用深拷贝,深拷贝会重新申请一块堆区内存解决了同一块内存被释放两次的错误*/class Aint n;int *p;public:A()A(int n)//编译器提供默认拷贝构造为浅拷贝。
2024-06-21 10:25:18
333
原创 用最简单的方式了解C++类中的成员权限
在该代码中,我们创建了类A的对象w,并且对类A的对象w中的公共成员变量a进行了赋值操作,因此展现了公共成员变量的权限:可以在类外进行调用。在该代码中,我们创建了类A的对象w,并且调用了对象w的print()函数,因此展现了公共成员变量的权限:可以在类内进行调用。顾名思义,公共成员就是没有任何的限制。可以在任意地方进行调用,赋值,修改的成员。在上述代码中,我们创建了公共成员变量a,受保护成员变量b,私有成员变量c;#####对于类的成员变量的剩下两个权限的讲解,我们下篇见!可以在类内,类外,子类中进行调用。
2024-06-17 22:02:06
535
原创 用最简单的方式理解函数重载
函数重载的定义:在同一个作用域内,使用不同的函数名,实现不同的函数功能,而且编译器不会发生报错的情况。函数重载的条件以及注意事项:1、在同一个作用域内2、相同的函数名.3、函数参数的个数、顺序、类型不同4、函数重载与返回值无关。
2024-06-13 19:21:24
905
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅