- 博客(28)
- 收藏
- 关注
原创 OpenOCD配置DAPLink下的SEGGER RTT 进行高速日志输出
本文主要是基于OpenOCD DAPLink配置的SEGGER RTT,如果你想直接看配置和使用流程, 下翻到标题移植 SEGGER_RTT 库文件, 前言中会写我接触的契机,以及对RTT进行简单的介绍博主最近在复盘电赛,当时做的是e题,意外看见了本题ti杯的开源项目工程, 遂下载来阅读,在此佩服大佬的实力。这是一篇。
2025-09-16 00:14:44
857
原创 QMC5883L的驱动
本篇文章的代码已经上传到了github上面,开源代码作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。参考资料QMC5883L磁场传感器驱动QMC5883L磁力计介绍(硬件+软件)(附STM32程序~~~)
2025-06-10 16:15:59
907
原创 记录一次使用面向对象的C语言封装步进电机驱动
本库对目前仅针对TB6600驱动下的42步进电机的基础功能进行了一定的封装, 也是我初次尝试以面向对象的思想去编写嵌入式代码, 和直流电机的驱动步骤相似在调用stepmotor_attach()函数和stepmotor_init()函数之后仅通过结构体数组stepm然后指定枚举变量中的id即可完成对步进电机的基础操作, 其中最核心的是控制函数step_move的实现, 该函数可以在开环状态下指定步进电机的步数和频率(速度)进行控制, 后续可能会更新一些经典的控制模型如梯形加减速.先贴一下项目代码。
2025-04-22 20:32:10
991
原创 cv两种透视变换的方法
又鸽了半个月最近真是越来越怠惰了呢。最近也开始准备智能车了,不过想参加的赛道细则官方没发,着实无聊,便开始在网上查看其他组别的开源代码,于是找到了透视变换。透视变换, 从直观的角度来说就是, 将我们在一个视角下看到的图像变换到另一个视角下看到的图像在中, 该操作可以帮助我们更加清晰地获取车道线信息, 因为在拍摄时, 摄像头和地面是倾斜的, 导致车道线在图像中呈现倾斜状态, 通过透视变换, 将, 从而获取到更多的信息更方, 更方便地检测车道线.
2025-03-02 14:09:04
479
原创 摄像头畸变矫正
所谓畸变其实就是由摄像头引起的, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释, 这让我想起来了一个表情包.
2025-02-14 09:57:06
2254
原创 了解PID却不会用?一文教你通过波形调参
即便了解了PID的理论, 但是在实际运用时还是不会调?这篇文章以控制直流电机的速度为例, 一步一步带你了解如何借助vofa+来进行调参.
2025-01-08 19:04:53
2441
原创 DMA串口通信&解决数据错位&收发不定长数据&vofa的使用
最近发现了一个非常好用的数据观察工具, 这个软件十分强大, 可以实时接收串口的数据, 并且将对应的数据的形式显示出来, 来看下图:真的可以说非常方便, 可以很直观的,同时也可以通过这个上位机, 也可以看到数据的波动情况, 很适合调节PID, FOC之类的算法.发现了这个之后我一时兴起, 写了个串口发送的程序, 可能是由于脱离技术太久迟迟, 即便是写这样的一个程序也不是那么的手到擒来了, 不过在这其中我也踩到了不少以前没有踩过的坑, 同时针对数据的发送和接收我做了一定的优化, 比如说, 以及。
2024-11-06 11:08:13
2840
原创 六步方波控制无刷电机原理
然后依照电磁铁与定子的极性从而驱动转子的旋转. 对于有刷电机我们往往仅需要通入一个直流电就可以驱动电机的选中, 并通过控制电流量的大小从而控制转速, 没了解过有刷电机的人可能会问, 既然是直流电那么它是如何改变电流方向的呢?基于上面的说法, 六个电磁铁便可以分成三个绕组, 这样便可以通过控制三个绕组的电流从而控制三个绕组的电磁铁的极性, 从而驱动转子的旋转. 那么我们可以将其简化为。, 时间久了必定会产生磨损, 同时在工作时也会产生一定量的噪音, 因为有这样的阻力, 旋转的速度也变得较为有限.
2024-07-30 21:58:53
1523
原创 列表的相关API函数
说了这么多我们来看看列表的接口函数分别有哪些, 又是如何定义的吧, 如果你先前做过链表相关的算法题, 那么这些函数对你来说应该很熟悉吧.vListInitialise在列表刚刚创建的时候, 列表中是没有列表项的那么在初始化的阶段, 我们可以逐句来看一个初始化之后列表大概是长这样的.在这里, 列表项的初始化十分简单, 仅仅只需将pvContainer指针变量初始化为NULL即可.vListInsert在这里, 我们可以看到, 列表项的插入是升序插入的, 那么我们来看看这个函数是如何实现的吧.
2024-07-19 20:00:45
1132
原创 初识C++多线程
原子操作就是不可分割的操作, 在多线程中, 如果一个操作是原子操作, 那么这个操作要么全部执行, 要么全部不执行, 不会出现部分执行的情况. 在C++中, 我们可以使用。来看上述代码, 线程的创建, 哦不, 这看起来更像是对象的创建, 我们需要指定对应的函数作为thread的构造函数的参数. 在创建之初, 线程就会。std::lock_guard相对于unique_lock来说在底层上更加简单, 因为少了一些成员函数, 但是unique_lock更加灵活,上述代码中, 只要涉及num的使用, 这个操作。
2024-07-16 17:09:12
437
原创 一文理解SPI
对于上述通信线的特点,传输数据时其速度理论上是远远大于I2C的,因为我们可以通过推挽输出。,则直接读取从机传过来的数据,同时给从机“随便发一个过去”;如果不读,那寄存器就不操作。如上图所示,我们可以直观的看到,主机和从机的数据传输是一个交换的过程,根据。对于数据的读取和接收,我们只需要指定对应的“数据寄存器”,如果我们。,如果没有SS的指定,那么从机就会切换为“高阻态”,避免短路。,就通过寄存器把数据放上去,而不读取从机传过来的数据;:主机输入线(通信线),接收从机数据,接从机MISO。
2024-06-19 14:45:02
933
原创 STM32-定时器的大致介绍
本文大纲如目录,主要介绍定时器的定时原理,以及通用定时器的那几个功能,同时会讲解相关功能的的初始化( Init() )函数。
2024-04-14 21:04:14
1861
1
原创 二叉树的层序遍历
层序遍历是我们遍历二叉树的一种方式,其基本流程是按照一定的遍历顺序将每一层的元素放入一个容器中而这里的顺序便是从上往下一层一层的区分、存入。然后拿出B并删去、再通过指针把D、E分别存入队尾,以此类推,我们便可以再队列中得到我们想要的存入顺序,那么对应到我们存入的vector容器中便也是一样的。考虑到我们整个存入的顺序要么是像上图那样从左往右要么是从右往左,总之方向是固定的。好了,以上就是本篇文章的全部内容了,如果大家有更好的方法,欢迎分享!在拿出的同时,按照我们存入的顺序,通过指针。,然后拿出,再删去,
2023-12-22 22:43:12
375
原创 完全平方数
以上就是我们大致的思路,那么在遍历的中途,我们肯定也是要判断所得出的结果究竟是否符合要求,这些条件我们就同样放在相应的if语句中就可以了。最近再力扣上刷了一道挺不错的题目,虽然现在看来比较简单,但是这道题真的让我这个初入算法区的萌新对队列中的BFS有了更加全面的理解。这道题的意思很好懂,就是求一个数n,它最少能由多少个平方数相加得来。好了,以上就是我们全部内容了,如果大家有更好的解法,欢迎分享。,这样我们就能得到 进行一次运算后所得到的所有结果,当中,在对里面的所有的元素进行相同的操作,
2023-12-09 19:59:17
616
原创 c++中的多态
而表里面装的正是我们重写的函数,而父级函数作为被继承者,当这个函数被继承到子级中,那么在子级里仍然有一个这样的指针(vftable),其指向的是则是。而子级的表存放的就不是父级的函数,而是子级内部与父级内部一模一样的类函数,在这里我们多多少少可以理解这里的重写,实际上就是。才能决定(这里的决定对象,是在运行时做一个关于参数的判断,根据参数的类型来决定结果),他的结果可以是多个。所以在这里,所谓的“动”就动在这里,动在会根据传入的对象,执行相应的函数,也就是我们上面所说的绑定。
2023-11-18 22:50:47
118
1
原创 cpp中的继承
也是很久没有更新了,最近都比较忙碌。好了,今天我们来看一看在c++面向对象里面的继承。继承是面向对象三大语法之一,继承的出现主要是可以收集不同类当中相同的部分,从而达到简化编程的目的。
2023-11-15 22:54:04
617
1
原创 c++里的运算符重载
在c++里,重载给我们的编写带来了一定的自由性。我们可以通过运算符重载的方式,对一些运算符进行重定义,赋予其一定的功能从而适应不同的数据类型。今天我们主要介绍“+”操作符进行重载。我们在编写程序的时候,如果我们创建了两个对象,并想让这两个对象内部的某些属性相加,我们或许可以通过函数来实现,但是通过重载,我们则有了更好的选择。例如我们可以通过重载的方式,令下面的代码变的可行p3=p1+p2;首先我们先定义一个类Person如果说我们想通过上面的语句实现两个对象的成员的相加,我们可以在这个类的内部。
2023-11-05 21:57:24
83
原创 c++中的静态成员
关于静态成员,我们结合以前的知识,无非就是我们在定义变量的时候在其前面加一个static就行,然后他的作用域就成了静态的作用域。在类中其实差不多,但不完全一样。
2023-10-31 08:50:56
131
1
原创 c++中的对象成员
可以看到,被定为对象成员的手机类最先被调用,其次是Person,结束时 Person的析构函数最先调用最后才是Phone。在c++中,我们在定义类的时候,除了可以将变量,函数作为我们的成员,一个类其实也可以作为另一个类的成员。所以我们可以得出,对于对象成员的调用,在构造函数方面,对象成员先被调用,而在析构函数中,情况相反,对象成员最后被调用。我们在定义的时候,它的形式其实和结构体套结构体类似,在结构体中,我们是这样定义的。好了,以上就是本篇文章的全部内容了,如果有什么不对的地方,还请大佬见谅、斧正。
2023-10-30 23:49:39
220
1
原创 c++中的深浅拷贝
比如说我们使用new开辟空间空间时,我们一般都是要使用 delete 在后面销毁这个数据的,一般我们通过析构函数来进行实现, 但是如果我们仅仅只进行了浅拷贝,我们的程序很有可能会崩掉。好了,以上就是这篇文章的全部内容了,这是我作为一个编程萌新的一些拙见,如果有哪里不对的地方欢迎各位大佬们指正。而深拷贝就不一样了,深拷贝不仅仅是给被拷贝者弄了一个新名字,就连。,这个浅拷贝并没有创造新的m_Height,但是我们在执行的时候,p一次p1一次共两次调用了析构函数,一模一样的出来,对应到内存中,深拷贝。
2023-10-28 22:35:36
67
1
原创 c++中的构造函数、析构函数和拷贝函数
我们在使用类编写程序并创建对象的时候,出于安全,对象会随着程序的运行进行初始化和清理,在这个情况下,c++中引入了构造函数和析构函数来解决上述的问题。在运行时,这两个函数会被编译器自动调用,从而保护程序,即便我们不去自行声明这两个函数,我们的编译器也会自动引入这几个函数,只不过是空的而已。语法:类名( ){}特点:1、没有类型名,没有返回值;2、函数名就是类名,小括号内可以放参数;3、在程序执行时会被调用一次,仅仅一次;4、可以发生重载,意味着可以拿传入的参数进行区分;
2023-10-27 22:59:51
70
1
原创 认识c++中面向对象的封装
的,这里的公共指的是不管实是在这个类外还是在这个类内,我们都可以对其内部所有的元素进行访问。就是说在类内,我们可以使用里面的成员,在类外(比如main)函数,只要通过合适的方式,我们就可以对里面的成员进行各种操作。在这里我们可以看到,属性其实就是我们学生的信息,名字和学号 ,而后面的行为便是用函数来表示的,用于输入名字和学号以及打印信息。,通过类中公共的行为来访问我们类中私有的属性。,这样可以方便我们通过封装后的整体来表现我们所需要表现的对象,同时我们还可以在操作的途中设置一些权限来方便我们的操作。
2023-10-22 22:37:27
82
1
原创 C++中的引用
在使用的过程中,我们既可以用a来访问这个数据10,也可以用b来访问这个数据,无论是在传参中还是在cout中打印,这个a和b的作用其实差不多,同样,我们也可以直接修改b的值,来修改a的值,这两个名字形容的是一个相同的内存空间。到这里上面的关于引用不可改的描述就好理解了,正是因为有const修饰,我们的ret只能指向a,不能指向其他的变量,但是a所表示的数据是可以修改的,当我们将a的值改成了20,那么ret的值也会相应改为20。2、 我们在使用引用的时候,我们的引用变量是无法被更改的。
2023-10-21 20:56:05
67
1
原创 程序的内存四区
这里new所修饰的数据将会以指针的形式存放在堆区中,我们也同样拿一个指针变量来进行接收,在这里的变量其实对于程序员来说是相对比较直观和方便的,有了这个方式,我们也可以把栈区的数据通过这种方式存放在堆区中,这样在函数运行结束后在,这个变量仍然可以同过指针的方式被我们所找到、访问。直接说结论,如果把静态区的这三个量的地址和局部变量的地址打印出来做一个对比,我们其实就可以发现,在静态区的这三个变量,它们的地址在值上面其实是相对比较接近的,而对于局部变量,和静态区的变量就离的比较远了。其实就是上面的hehe。
2023-10-20 22:09:56
119
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅