自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(249)
  • 收藏
  • 关注

原创 面向对象实现LED灯

面向对象的意思就是说我们将每一个LED进行一下封装,封装成一个结构体,通过调用每一个结构体来实现每一个LED灯的使用。首先,让我们创建一个board.c文件,来实现LED灯底层,这样可以使得main.c中的代码更加整洁。这样的话,我们就可以在main函数中直接调用对应的对象就可以实现对应的功能,大大提高了代码的简洁性。接下来,我们创建每一个LED的结构体。接下来,让我们实现其对应的函数的功能。接下来,我们创建三个LED的对象。定义了一个LED的引脚,开关。

2025-09-29 11:19:11 466

原创 基于STM32的LED实战 -- 流水灯、呼吸灯、流水呼吸灯

的话,我们会看到LED灯是保持常亮的,这个是因为stm32f407本身的主频就比较大(有168MHz),CPU执行的速度很快,所以我们需要加上一个对应的延时函数。当LED1低于20的时候,让LED1亮,当LED2低于40,LED3低于60的时候,让这三个亮,我们就能大概实现出来三个LED亮度不一样的效果。这个灯的亮度是由亮的时间和灭的时间来进行确定的,如果亮的时间长一些,灭的时间短一些,总体看上来就会更亮一些。这个是我们板子上的三个LED灯分别对应的引脚名称。这样,我们就实现了对应的LED灯的闪烁。

2025-09-16 19:19:59 513

原创 平衡车 -- 遥控器

今天,我们来实现平衡车的最后一个功能,通过APP的蓝牙来遥控平衡小车我们通过蓝牙芯片可以获取手机上的操作,然后给到单片机的串口3.以便于后面的单片机进行处理。

2025-09-14 19:02:38 1161

原创 平衡车 -- 速度环

这个时候我们就设定完成了,但是我们这个时候会发现,运行程序的时候轮子是会空转的,为了解决这个问题,所以按下按钮之后,进行复位操作。首先,我们创建一个速度环的PID的PID控制器。然后我们设置初始目标值为0,并获取轮胎的转速值。然后我们对其进行初始化。

2025-09-11 21:23:35 267

原创 平衡车 -- 倒立摆

然后我们根据上面的示意图对这个进程函数进行完善。我们对单片机的前面部分的实现新建两个文件。

2025-09-10 12:38:14 342

原创 平衡车 -- PID

接下来,我们来完成另外一个函数,来完成PID的运算,由于需要用到积分项和微分项,所以,我们需要额外保存几个变量。接下来,我们创建两个函数便于初始化PID和对PID的SP的值进行设定。然后,我们在PID的初始化函数中,对于这几个变量进行初始化。这样子,我们就可以在点击初始化函数中,配置PID的上下限了。我们创建一个PID的结构体来长期保存PID的数据。然后我们创建两个函数,分别来控制左右电机的转速。接下来,我们来完成PID控制器的具体的代码。这样,我们就对其上下限进行了限制。PID是用来改善控制系统的。

2025-09-09 21:35:17 412

原创 平衡车 -- MPU6050

我们现在对MPU6050进行初始化,MPU6050通过I2C总线与单片机进行通信,通过的是PB8和PB9,并且PB8和PB9需要通过重映射,才可以发挥出I2C总线的功能。我们对I2C1的速度设置为40000hz,也就是快速模式,然后选择的I2C的模式是标准I2C模式,占空比为2比1.我们选用快速模式的时候,一般选择的占空比就是2比1的。我们一般是会使用加速度计来计算俯仰角和翻滚角,一般不会使用加速度计来计算偏航角,因为重力对于平面上的影响是非常小的。接下来,我们对MPU6050的值进行更新。

2025-09-08 20:41:08 777

原创 平衡车 --- 测量减速比 && M法、T法测速

我们这篇文章主要想要讲述的是测量减速比和M法测速。

2025-09-04 21:03:17 1155

原创 平衡车 - 位置测量

我们可以设置一个encoder变量来记录这个时候的圈数值,并把开始值赋值为0.然后,我们对编码器进行初始化,首先,现对其A、B相的引脚进行初始化。我们可以通过获取对应的编码器的上升沿和下降沿来获取对应的角度值,接下来,我们先对左右编码器进行初始化,先初始化IO引脚。然后,我们创建两个变量,分别存储左右电机编码器的值。如果A相比B相早出现,则为正转,反之,则为反转。然后,我们对编码器的逻辑进行处理。然后,我们对EXTI进行初始化。然后我们开始配置EXTI的参数。然后,我们开启EXTI的中断。

2025-09-04 13:23:16 296

原创 平衡车 - 电机调速

这个是电机控制的具体的引脚图,我们可以看到在这个H桥的结构当中,AIN1为正,AIN2为负的时候,是正转,否则反转,所以,我们可以通过控制AIN1和AIN2来控制电机转动的方向,通过PWMA和PWMB来控制速度,而对应的AIN1和AIN2为PA10和PA9,同理,BIN1和BIN2为PB5和PB7,所以,首先,我们需要对这些引脚进行初始化。我们需要将STBY引脚设置为高电平,因为STBY为休眠引脚,当STBY为低电平的时候,电机处于休眠状态,此时电机是不会进行运动的。这样,我们就对对应的引脚进行了初始化。

2025-09-03 21:55:52 963

原创 平衡车-ADC采集电池电压

这个是我们ADC流程图,我们打算采用的注入序列,而不是采用常规序列,注入序列的优先级是要大于常规序列的,当注入序列和常规序列同时执行的时候,注入序列是可以直接打断常规序列的,然后,我们通过PB0采集电压,每10ms触发外部序列TIM2_TRG0一次,让ADC完成采集,当ADC完成采集之后,产生中断,并将注入序列的结果放入JDR1中(此时JEOC置为1,EOC为常规序列的标志位),然后再中断函数当中读取JDR1的结果进行电压的处理。然后,我们创建一个测试函数,将对应的值打印出来。然后再.c文件中具体实现。

2025-09-02 22:37:09 809

原创 灯哥FOC笔记(4) --无刷电机的FOC软件开环代码撰写

我们可以看到,总共有11个波锋出现,代表有11个发电周期,恰好等于我们的极对数。对于克拉克逆变换,我们首先把左边的这个式子直接写成这里的代码,并且,我们给每一项都加入了,voltage_power_supply/2,这个其实是供电电压除以2,如果我们给板子的供电电压为12V,那么这一项就是6V,它的存在的主要意义是将生成的Ua,Ub,Uc曲线平移到供电电压的中间,因为原始的Ua,Ub,Uc一个类似于正弦曲线的输出形式,会有小于0的部分,而PWM是要求都要大于0的,所以我们把所有的电压都进行平移。

2025-08-18 22:40:10 1217

原创 灯哥FOC笔记(3) --FOC开环程序原理

因此,实际上,在电流矢量情况下的克拉克变换和帕克变换,和电压矢量下的克拉克变换和帕克变换,推导过程完全一致的,只是符号不同,你可以看到,上图左边是基于电流矢量推导而来的FOC算法流程,这个就是上节几节课的内容,相信大家已经熟悉,而上图右边就是基于电压矢量推导而来的FOC算法流程,可以看到,除了符号不同以外,其他的一切都相同。

2025-08-18 19:59:03 755 1

原创 灯哥FOC笔记(2) --无刷电机的FOC软件控制原理

我们之前说过,电机控制的硬件过程,就是交替开关这些相同的MOS管,这样就可以实现电机的转动,那么可以根据我们期望的电机运行情况,通过一个电机运行模型,实现交替开关各个MOS管的算法,这个就是FOC算法,它的另一个名称就是磁场定向控制算法,而克拉克变换和帕克变换,就是磁场定向控制算法的两个核心。接下来,我们开始建立无刷电机的数学模型。

2025-08-08 09:40:31 863

原创 灯哥FOC笔记-----(1)无刷电机概论和硬件控制原理

而直流无刷电机的驱动,就是依靠改变电机定子线圈的直流交变频率和波形,在定子周围形成磁场,驱动转子永磁体转动,进而带动电机转起来,所以,想要让电机成功驱动,研究如何改变定子线圈的电流交变频率和波形就是我们的工作重点,而这个重点可以进一步分为两个部分,一个是硬件电路部分,一个是软件控制部分。基本的航模无刷电机结构图如下图所示,分为前盖,中盖,后盖,磁铁,硅铜片,漆包线,轴承和转轴组成。外转子无刷电机就是转子在外面,我们常见的无刷电机,比如航模无刷电机,就是外转子无刷电机。内转子无刷电机就是转子在内部。

2025-08-07 21:09:35 406

原创 瑞萨RA4M2开发板练习-OLED显示时间

很荣幸收到瑞萨电子的RA4M2开发板,通过查看数据手册,可以知道,RA-Eco-RA4M2-100PIN-V1.0是一款基于100MHz Arm® Cortex®-M33内核架构的核心板,主控芯片R7FA4M2AD3CFP。RA4M2 32 位微控制器 (MCU) 产品群使用支持 TrustZone 的高性能 Arm® Cortex®-M33 内核。与片内的 Secure Crypto Engine (SCE) 配合使用,可实现安全芯片的功能。

2025-07-24 10:12:48 476

原创 西门子嵌入式学习笔记---(1)裸机和调度器开发

这样可以获得最佳的性能,不需要额外的调度器或操作系统的开销,然后执行时间是可以具体预测的,每次运行的结果都相同。对于调度器开发而言,与逻辑开发相比,最大的不同点,就是调度器开发有了优先级的概念,会吧CPU分配给不同的任务,确保CPU资源得到最大的利用率。但是随着功能的增加,需求的增加,管理难度就会增加,并且难以处理多任务和并发,无法设立优先级,就算任务在紧急,也得当前任务完成。调度器开发可以处理多个任务,重要任务可以优先执行,并且可以管理共享资源,新任务可以作为独立任务添加,不需要重构整个系统。

2025-05-30 00:04:35 646

原创 使用keil5实现RA4M2按键控制LED的状态

这上面的两个图,第一个是按钮的电路图,第二个LED灯的电路图,我们对于LED的处理还是将其赋值为低电平,这样子的话,上电之后它就不亮了。我们上一个文章有说,实现RA4M2的流水灯实验,这次,我们来看看,怎么用按钮来控制LED的状态,我们先来看一下按钮的电路图。当按键0按下去的时候,LED任务暂停,当按键1按下去的时候,LED任务开始。好了,今天的内容就到这里,我们明天再见。这样的话,我们就实现了流水灯部分的代码。这样,我们就实现了这个功能。我们先来看LED部分的代码。接下来,我们来看按键部分。

2025-05-25 09:44:11 342

原创 使用keil5实现RA4M2流水灯实验

当配置好了之后,我们在时钟处设置为12Mhz,在引脚处,将对应的005,404,405引脚设置为默认低电平,这样,当我们给他赋值为高电平的时候,LED等就可以点亮了。首先,我们需要再官网安装一个rasc的编译环境,这个我把链接放在下面,大家直接下载就好。这个是RA4M2的LED的对应的引脚。好了,今天的内容就到这里,我们明天再见。这样,我们就可以实现对应的流水灯的效果了。

2025-05-25 09:04:10 958

原创 蓝桥杯每日一题----海底高铁

其实解题思路蛮简单的,我们只要找到每个城市去的次数,再加上每段路程最小的花费,就是总的最小的花费。在这道题来说,主要使用的想法就是使用一维的差分数组,这道题中有两个买票的策略。比如说,从1,3,那么可以设为1为L,3为R。K为1,当中的路径每个+1.一种是,直接买票,另外一种是买IC卡并买带有优惠的票。而我们在获取每段路程的次数上,就可以使用差分的方式。好了,今天的内容就到这里,我们明天再见。P3406 海底高铁 - 洛谷。

2025-03-21 21:51:57 538

原创 蓝桥杯每日一题----一维差分

所谓的差分,就是我们创建一个差分数组,然后存放每个元素和前面一个元素的差值,所以,当我们从L,到R中每个元素都+K的时候,那么差分数字的L就会+K,然后R+1就会-K,其余保持不变。比如说,在我们这道题当中,我们可以看到的是,所以,当我们使用暴力模拟的时候,时间复杂度是肯定会超过要求的,所以,这个时候,最适合我们的就是进行一维差分。最后,在复原初始数组的时候,我们可以让原数组+差分数组+原数组的前面一个位置。好了,今天的内容就到这里,我们明天再见。然后,对差分数组进行操作。首先我们定义差分数组。

2025-03-21 20:59:49 390

原创 蓝桥杯好题推荐---激光炸弹

此外,这里还有一个特别需要注意的点,就是题目中所同一个位置可能存放多个价值,所以,我们在进行价值处理的时候,应使用的是。然后,我们先对这个价值数组进行处理,由于后面使用的时候,我们是从(1,1)开始的,所以,我们统一把坐标往右下移动一位。在这道题目当中,我们使用的是二维前缀和数组的思想,我们首先可以常见一个二维前缀和数组和一个存放价值的数组。在这个之前,我们需要将m设置为m何n的最小值,因为这个正方形的边长是可能大于这个整个数组的长度的。P2280 [HNOI2003] 激光炸弹 - 洛谷。

2025-03-16 13:48:18 527

原创 蓝桥杯好题推荐---二位前缀和

在这道题目当中,是要我们输出以x1,y1为左上角,x2,y2为右下角的子矩阵的和,其实这个首先很简单的思路,就是可以进行枚举,但是枚举的话,时间复杂度会超过题目的要求。第二个就是利用前缀和的方法,我们的前缀和数组f[i][j]中存放的是从(0,0)到(i,j)的所有的数的和。当我们数字求和的时候,可能会超出Int的类型范围,所以,我们应采用long long 类型。这个的面积,我们可以表示为(A+C)+(A+B)-A+x。好了,今天的内容就到这里,我们明天再见。那我们怎么表示要查找的这片区域的面积呢?

2025-03-16 13:25:15 467

原创 蓝桥杯好题推荐----最大字段和

在这道题目中,我们使用的其实也是前缀和的思想,开始的时候,我创建一个前缀和的数组,然后用前缀和中的最大值-前缀和中的最小值,就是距离的最大值。但是这样子是不可以的,所以,我们还是应该利用前缀和数组,不断地找到距离的最大值,找距离的最大值,我们则用当前的前缀和-前面所找到的前缀和中的最小值。这样就可以保证字段的合理。好了,今天的内容就到这里,我们明天再见。P1115 最大子段和 - 洛谷。因为我们并没有考虑字段的合理性。

2025-03-16 11:30:47 296

原创 蓝桥杯好题推荐---前缀和

这种题目是要求我们找到一个数组中从l到r的元素的和,查询Q次,这道题目中,我们最直观的做法,往往就是暴力枚举,但是这样子时间复杂度会超过允许的范围,所以我们使用前缀和的方法,所谓的前缀和,就是说,我们创建一个前缀和数组,在这个数组中,我们存放着从第一个元素,到这个元素的总和,这样的话,如果我们确定好了要查找的目标,那么直接使用r的数组的数字-l的数组的数字就好了。这样的话,我们就可以保证使用O(1)的时间复杂度来完成我们的任务。好了,今天的内容就到这里,我们明天再见。这个是我们的完整的代码。

2025-03-16 10:33:53 472

原创 蓝桥杯好题推荐---子集

在这道题目当中,我们其实是要找到这个数组当中所有的元素的组合,然后返回,所以,除了递归之外,我们还可以使用二进制表示的方法,我们用二进制的0来表示,没有使用,1来表示使用,也就是说,我们假设数组为1,2,3,78. 子集 - 力扣(LeetCode)好了,今天的内容就到这里,我们明天再见。所以,我们就可以这样写我们的代码。

2025-03-14 21:19:24 667

原创 蓝桥杯好题推荐---扫雷

对于扫雷这道题目来说,我们可以设置为两个数组,一个数组来存放信息,另外一个来进行检测,此外,其实检测数组的第一个数的内容确定的时候,则这个数组的所有内容就确定了,所以对这道题目来说,其实三个结果,要么1,要么0,要么2。P2327 [SCOI2005] 扫雷 - 洛谷。好了,今天的内容就到这里,我们明天再见。

2025-03-14 21:13:11 378

原创 蓝桥杯好题推荐----高精度乘法

这道题的思路,其实和前面差不多,我们主要说一下最为关键的部分,在高精度乘法的模块部分,我们主要采用的是无进位乘法,就是将进位的处理,我们放在最后,先处理其余的部分。P1303 A*B Problem - 洛谷。好了,今天的内容就到这里,我们明天再见。

2025-02-28 23:41:16 492

原创 蓝桥杯好题推荐-----高精度减法

这个题目的解题思路,其实是和高精度加法是非常像的。怎么说呢,其实开始的时候,由于范围受限的原因,所以我们必须把数字存到字符串中,然后用倒序,存到数组中,然后进行高精度减法,进行高精度减法的时候,我们可以逐个相减,然后如果减下的数字小于0,那么+10,前一位减一,最终从非0的第一位开始输出。记录详情 - 洛谷 | 计算机科学教育新生态。好了,今天的内容就到这里,我们明天再见。

2025-02-28 16:41:25 563

原创 蓝桥杯好题推荐--高精度加法

高精度加法,其实这种题目,因为数据范围的原因,所以我们不管用什么类型,都达不到这个的范围,所以,我们一般采用的就是数组+字符串,我们把要加的数字存放到字符串中,然后字符串中的数字倒序存入数组中,然后我们会定义三个数组,然后利用数组完成加法操作。好了,今天的内容就到这里,我们明天再见。

2025-02-28 11:12:58 495

原创 蓝桥杯好题推荐------蛇形方阵

还有一点需要注意的就是,当最后输出的时候,要有三位,不足三位的,前面用空格补齐,这种就适合使用printf("%3d",num);对于这道题目来说,这道题题目中很重要的就是模拟实现顺时针填入数字的过程,而一个很好的,可以实现这个过程的方法就是利用数组,这个应该怎么理解呢?比如说,我们创建两个数组,一个叫做dx,一个叫做dy,分别表示x轴的操作和y轴的操作。通过这个数组,我们就可以模拟填入数字的这个过程,我们接下来实现一下相关的代码。好了,今天的内容就到这里,我们明天再见。

2025-02-25 20:17:55 749

原创 蓝桥杯好题推荐--多项式输出

这种题目大多属于模拟题,这种是算法题目中较为简单的题目,这种情况,最重要的就是分类讨论,确保每种情况都被考虑到,保证不会重复,不会缺漏,不要直接就上来写,否则会遇到一堆错误。你看,根据前面的解题思路,我们就可以分成三个部分来完成我们的代码,在数字处理的时候,为了防止符号对数字的影响,所以我们可以对输入的值取绝对值,这样就可以避免正负号对x的影响。这个就是这道题目,基本的情况,对应我们的代码也分这三种情况来写。好了,今天的内容就到这里,我们明天再见。

2025-02-25 11:06:31 462

原创 蓝桥杯lesson3---string的使用

string字符串是一种更加高级的封装,string字符串中包含了大量的方法,这些方法使得字符串的操作变得更加简单,string的使用,往往贯穿于整个蓝桥杯生涯中。迭代器是一种对象,它可以用来遍历容器,迭代器的作用类似于指针,或者数组下标,这就意味着,如果我们想要访问迭代器所指向的值,我们需要解引用。当然C++中的string创建的字符串和char类型的数组所表示的字符串还有一个区别,string类型的字符串对象可以直接赋值。这个其实适用于不带空格的字符串,但如果输入的是带空格的字符串呢,我们来看看。

2025-01-23 21:45:34 1350

原创 数据分析系列----beautifulsoup4模块

使用CSS选择器(标签选择器,id选择器,class选择器,父子选择器,后代选择器,nth-of-type选择器等),从树结构中遍历符合CSS选择器的所有结果,存放在列表中。使用CSS选择器(标签选择器,id选择器,class选择器,父子选择器,后代选择器,nth-of-type选择器等)从树结构中遍历符合CSS选择器的第一个结果,存在列表中。在使用这个模块之前,先要确保我们拿到了网页的源代码,怎么拿到网页的源代码,我们在上一篇文章中有说到,不会的同学可以翻上去看一下。

2024-12-09 20:44:27 1153

原创 数据分析系列---requests的使用

虚拟环境在项目中可以实现环境的隔离,假设DemoA和DemoB分别用到了某个三方库1.0和2.0版本,那么在一个环境中,就会出现冲突,这个三方库只能安装其中一个版本。我们可以通过设置headers来进行伪装,headers是标头,其中的User-Agent是标头当中的一个参数,它的存在足以使爬虫应对大部分的网站。如果网页中发生了乱码,再写下面的这一段代码,其中,utf-8表示这个网页的编码方式。然后,我们向网址发送请求,得到其给的响应结果(响应结果中包含了我们需要的各种信息)比如说,我们想要访问的是百度。

2024-12-08 21:55:02 936

原创 蓝桥杯lesson2----数据类型

如果我们每个人自己给这些字符中的每个字符编一个二进制序列,这个叫做编码,后来,美国国家标准学会有出台了一个ASCII编码,C语言中的字符就遵循了ASCII编码的方式。C++中有一种类型叫做:bool,布尔类型的变量的值可以是true或者false,这种类型的变量专门表示真或者假的,当然在C和C++中,0表示假,非0表示真,有时候不使用bool类型也能表达相同的逻辑。对于char类型来说,到底是有符号的还是无符号的是完全有编译器决定的,大部分编译器上面就是有符号的。好了,今天的内容就到这里,我们明天再见。

2024-12-07 18:55:28 1450

原创 蓝桥杯软件赛系列---lesson1

我们今天会再开一个系列,那就是蓝桥杯系列,我们会从最基础的开始讲起,大家想要备战明年蓝桥杯的,让我们一起加油。

2024-12-06 21:40:24 1318

原创 python语法基础---正则表达式(补充)

上一篇文章中,我们讲到了贪婪匹配和非贪婪匹配,我们在这篇文章中,主要讲的就是贪婪匹配和非贪婪匹配的剩下的部分,话不多说,让我们开始吧。默认情况下,如果正则表达式中出现(),结合findall查找,最终的结果中只显示()的结果。第三个正则表达式的意思是说,从a开始,中间进行贪婪匹配,然后到b结束。你看,虽然这三个打印出来的结果是相同的,但是,其中表达的意思并不相同。第一个正则表达式的意思是说,从a开始,中间进行贪婪匹配,直到结束。通过这个代码,我们可以了解到的是,这个|,其实就是或的意思。

2024-12-05 21:56:35 1234

原创 Python语法基础---正则表达式

我们这个文章所讲述的,也是数据分析的基础文章,正则表达式首先,我们在开始之前,引出一个问题。也是我们接下来想要解决的问题。那就是,我们应该怎么判断合适的QQ号。我们先给大家实现一下这个解决这个问题的代码,稍后再给大家讲解一下其中的原理。这个是用我们之前所熟悉的代码来实现这个功能,这个应该不用太仔细解析,大家可以先好好看看。我们接下来重点看用正则实现这个功能的部分。下面的部分就是用正则表达式实现的。其中包含了很多的知识点,这个需要我们慢慢来进行分析。首先,我们先来看一下结果。

2024-12-04 21:46:06 1519

原创 Python语法基础(八)

当我们输出的num超出list1的检索范围的时候,这个代码是会报错的,如下图所示。将可能存在异常的代码检测起来,如果代码遇到异常,则跳过异常,继续执行后面的代码。当程序执行的过程中,我们遇到了异常,而且异常未被处理,那么程序就会终止异常。好了,我们今天的文章就到这里,我们下次再见。这一个部分,我们来讲一下异常处理这部分。比如说,我们来看下面的这一段代码。

2024-12-03 22:32:59 394

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除