day01
01-无人机-组成结构-上
cpp
复制代码
哎,好,各位,那现在呢我们一起来看一下,就是咱们接下来要做的这个小项目啊。呃,当然这个名字有很多啊,就是这种飞行器有管,它叫四旋翼飞行器的,也有叫四轴飞行器的啊OK啊,好了,这个应该都能理解,对吧?哎,好,我就不再多说了。呃,其实它的机械结构是非常非常简单的,对不对?一共就是一个飞机,然后四个螺旋桨,对吧?四个电机啊,只要这四个电机转,那它就能够是不是提供向上的升力啊,对吧?完了之后它就就能起飞了。哎,那大家能不能想象到,如果要是想让它前进后退呃,向左向右移动,这个应该怎么去处理这个事儿呢?其实按照他的这个机械结构来看,你只需要让他等着就行。你比如说前进前进的话,你只需要那个无人机,是不是倾斜就行,你向下倾斜,那它的这个螺旋桨的升力推力是不是就向你斜后方,对吧?
斜后方它不就往前走了嘛,对不对?同理向后走呢?你是不是就让它呃抬头就行了呀,对吧?那它就往后了,那向左呢注意啊,同学就是这种无人机呢,它不用不用像,就是咱们传统意义上的那种,就是固定翼的无人机,你固定翼的呃固定翼的这个无人机或者固定翼的飞机。
大家知道是哪种吗?就是咱们比如说呃天上飞的那种客机,那叫固定翼能理这个事吗?同学那种,你要是想让它往左往右,你必须得怎么着,它那个头是不是得一直朝前呀,对吧?你你得拐弯,你得这么走才行,对不对?但是这种呢它就非常的灵活了,你要是想让它往左走,直接往左倾斜,是不是往左走了,对不对?往右走,直接往右倾斜就往右走了,所以它前后左右移动是非常非常灵活的啊,这一点大家应该是能想明白的啊。ok好,废话不多说,接下来呢看一看咱这个项目它的整体需求是什么?咱这个项目其实相对来说这个需求是比较简单,比较少的啊,一共就提了三个要求。一个呢就是我们需要就是最终最终需要能够保证什么呀?呃,让这个飞行机飞飞呃,飞行器保持一个稳定的飞行姿态啊,什么做稳稳定,飞行姿态呢?
就是这个东西它飞起来,你不能让它老是来回下晃,能理解这事吧,同学它得稳,哎,它得它得稳啊OK啊。好,那也就是保持一个平衡的姿态啊。好,这是第一个要求,这也是最基础的一个要求。如果连稳定都做不到的话,那别的就更别提了,对吧?什么前后左右移动啊呃什么固定飞行高度,这个肯定是实现不了的。所以呃保定它保持它的这个飞行姿态的稳定是呃最最最基础的一个要求,一个前提啊,这一点大家注意啊。好,然后我们还有第二一个要求啊是什么呢?就是能够实现,就是咱们得能够通过遥控去控制这个无人机前后左右移动。呃,这是咱们的第二一点要求,这个事儿应该是能想明白了,对吧?唉,这其实也是一个比较基础的要求啊。然后第三一个呢,就是呃咱们需要实现一个定高的功能。什么叫做定高呢?就是能够保持这个飞行器的固定的飞行高度啊,大家能想明白这个这个事儿对吧?哎,好了,这也是实现一个定点啊。但实际上我们这儿并没有做真正的定点,你真正的定点除了要保持它在垂直方向的一个高度的固定,你还应该保持什么呢?在整个水平面,它是不是也应该是固定的呀,对吧?像这个时候同学,但是水平面的这个固定的,我们并没有做啊。所以说大家之前在测这个无人机的时候,应该也发现了,确实它能飞起来。但是飞起来之后呢,它是不是会自己,你就是即便你不不通过遥控去控制它,它也有可能会前后或者是左右这样去移动啊,对吧?呃,这个是因为我们没有做这个水平面的这个定点啊OK如果要是做的话,怎么做?这个咱们暂时先不说,等后边咱这个基础的这几个功能做完之后呢,我再花点时间呢给大家介绍一下它的一个呃做法就行了啊,咱们这么安排,也就是我们这儿呢最终最终实现如下,这几个就可以了。好OK这一点大家注意。那到时候大家做完之后呢去测试的时候,你可能会发现它有可能会前后左右这么去飘,对吧?要飘的话呢,这个只能是咱们自己手动的,通过遥控啊,对吧?你去控制它的这个水平方向的一个定呃定定位的。相当于是你想让假如举例子啊,它往前飘了,那你就稍微把那个遥控是不是往后拉一点啊,对吧?那咱们遥控是可以控制它的前后左右移动的方向啊,到时候咱们再说具体怎么操作啊,呃这是咱这个项目的相当于是三点要求啊,这一点大家要注意啊,行了。那这个完成之后,接下来我们往下进行下边给大家介绍一下,就是我们整个飞行器的组成啊,就是我们整个呃飞行器到底有哪些组成部分呗,对吧?说白了就是对吧?哎,OK一共有这些吧,这是我们需要重点关注的啊。首先第一个就是机架,这个机架其实很好理解,大家应该知道是啥?是不是我们那个是不是一个十字交叉轴啊,对吧?啊,那那就是咱的机架啊。OK好,这个呃为什么要说一下这个事儿呢?其实它呃有有一些门道啊,一会儿咱们再说,然后呢还需要给大家介绍一下这个动力系统呃动力系统,其实就是咱那个无人机加螺旋桨呃,那个电动机加螺旋桨,对吧?哎,好,然后下边呢是电源系统,再有呢是飞控系统,再有就是遥控器了啊。好,那现在咱们逐个的去看啊,先看第一个机架。呃,这个机架呢大家可以观察它实际上是分两种的,一个是x型,一个是十字形。当然可能同学会觉得你x跟十字那不一样吗?这个不一样的啊,这个必须得结合什么呢?就是这个机头的位置,咱们去说这个事儿,注意观察同学,对于呃这个是不是字儿有点小,我稍微调大一点啊。好,呃,有点太大了吧,这能不能来个折中的呀?唉,这个形啊好,大家来看一看,就首先我们看这个s形s形,那它们这轴头向是不是位于于两轴之间呀,同学对吧?
这叫x型啊OK好,那往下走呢,十字形形是什么样的呢?呃,很简单,十字形是不是?就是机头位是某一个轴,它是机头啊,对吧?唉,OK这一点一定要注意,这是两种呃两种类型啊,两种类型。那在我们这个项目当中,我们选用的是哪一种呢?是这个x型,这这一点注注意哎,字形状,这这其实是想写十字形啊形状啊,其实呢也能理解也无所谓啊啊,行家知道道有这样的两种方就行。行,那咱这儿呢采用的是s型x型偏多一点啊OK好,这一点,大家注意,这是关于机架,大家要了解的东西很简单。
接下来我们看第二一部分就是这个动力系统吧。啊,其实这个动力系统我们其实也很简单,一眼就能看出来,对不对?非常非常的简单,它不像那种固定翼的固定翼的这个动动力系统相对来讲要复杂一点,是不是后边那有这个喷漆呀,对吧?呃,或者是你要直升机的话,你中间有一个大的螺旋桨,你尾巴上面是不还有有个小的螺旋桨,对吧?等等等等,那个相对比较复杂,那咱这个非常简单,单是四个螺旋旋桨,朝下啊,都朝下啊,这个点注意就行了。呃呃,当然啊,这四个螺旋桨其实也是有也是有讲究的,也是有讲究的啊,不知道大家有没有注意到啊,就是咱们这四个螺旋桨,那他们的这个呃旋转的方向是一样的吗?全是一样的吗?同学并不完全一样啊,这四个螺旋桨,你要仔细观察的话,并不完全一样啊。这个在后边呢我会给大家去找机会去说一下这个事儿了。我们暂时先不用管这个事儿啊啊OK那我们先继续往下走,同学,咱们看动力系统。呃,左天讲咱们就不说我们重点关注这个电机以及这个电机的驱动。
好,电机,咱们这儿不知道之前有没有同学注意到啊,咱们用的电机,它不是这种传统的那种直流电机啊,来,我又不是这我把这个扇头打开,咱们看一眼,应该能凑合着看出来那个电机长啥样啊?嗯,走好,呃,大家可以看一看,就是咱这个电机呢,是不是就是中间的这个露出了这个金属光泽的这个小圆柱啊,对吧?这就是咱这个电机你会发现它非常的迷你非常的小巧啊OK好,那这么小的一个电机,它能提供这么大的升力吗?它确实是可以的啊。呃,OK那我们来看一看,就是这种电机,它啊有什么样的特点啊?首先它叫做空心杯直流电机,它也是一个直流电机啊。OK所谓的直流电机,就是到时候我们去给它供电的时候,是不是直接呃正极接正电呃,负极接负电,那是不是它就可以转起来呀,对吧?
哎,这就是所谓的直流电机啊OK好,这个不多说,我们重点了解一下它这个空心杯,啥叫空心杯呢?这个其实得结合着它的内部结构去看啊,来我这儿呢找了一张图片给大家看一下啊,呃这是咱这个无人机呃,这这个电机的外观啊,然后我们重点看它的内部结构,注意观察它为什么叫做空心微电机啊?来,你看一看它内部的这个线圈,你就明白了。同同学大大家都知道就是电动机,它的内部是不是一定是有这个线圈的呀,对吧?啊,能理解这个事吧。同学除了有线圈,是不是在这个电动机的外侧,还有这个永磁体啊,对吧?不知道大家还能不能想起来这个直流电动机的工作原理啊,有同学能想起来吗?想不起来的话也无所谓啊,这个大家要感兴趣,网上搜一搜视频,有的是啊介绍这个东西的,咱就不多说了啊。然后在这块儿呢,咱们就介绍一下这个空心杯是怎么来的啊?你注意观察一下同学,你看它的什么呀?你看它这个线圈呃,哪个是线圈能看出来吧,是不是这个铜色的呀,对吧?这个铜色,这是它的线圈,你看它的线圈内部是没有啥的,是没有铁芯的传统的这个直流电动机,它的线圈是什么样的呢?它长这样这个大家能看明白吧?哎,它这个线圈内侧是有一个铁芯,这个线圈是绕着一个铁芯去转的啊,是能理解这个事儿吧。OK好了,那这叫呃这叫有有相当于是这就不叫空心的了,这叫有芯的这个呃,相当于是一个电机,对不对?OK好,那这个无心呃这个所谓的空心杯电机是啥样的呢?就是它这个线圈,它内部是没有这个铁芯的,是没有这个铁芯的啊OK好,那所以说你看它这个线圈的形状,是不是就像像一个空心的一个杯子呀,对吧?所以这个东西因此而得名,就叫做空心杯直流电机,它就是这么来的啊OK好,然后其实大家应该也能看到啊,就是从它的结构上,我们应该能看出来,就是这种电机,它的这个转轴同学知道哪个是它的轴吧,输出轴,就是这个小小呃这个小小金属棒能理解这个吧,同学这是它的输出轴啊,你会发现它的输出轴和这个线圈,它俩的连接,你觉得是不是很稳固。那从这个结构上能不能看出来应该不是很稳固。为什么你想啊是不是整个金属轴,整个输出轴和这个线圈,它俩连接的位置,只有哪是不是只有这个所谓的空心杯的底部啊能理解吗?所以说他们俩的连接其实不是很稳固的。所以这种电机呢它有一个致命的缺陷,就是它承受不了太大的扭矩,它承受了太大的扭矩,能理这个事儿吧。呃,所以说一般情况下,这种呃就是电机呢一般也就是用在一些小型的这种无人机啊,呃或者说其他的一些这个小型的设备上面。这一点大家要注意啊OK好,那这就是呃所谓的空心杯直流电机,它这个名字的它的一个来源啊,来由就是这么一回事啊,大家了解一下就可以了啊。好,那相反这种普通的直流电动机呢?你看它的输出轴和整个的这个这个东西,我们称之为转子啊,同学就是这个轴加上这个线圈,它俩组合在一起,我们称之为转子啊,为什么称为转子呢?其实很很简单,就是有转子,是不是还有一个所谓的定子啊,大家还还有印象吗?这个在中学的候什么时候应该是学过的啊?
呃就是在这个电动机里边,它外外包括外壳壳上的永磁磁,这这个是不是不转呀,对吧?不动,所以我们称之为定子,那里边线圈加上这个输入轴,它是不是转呀?对吧?就这个我们称之为转子啊。ok好,那你看就是这个转子,它的输入轴和这个线圈之间的连接是不是就非常的稳固,所以它是能够承受比较大的扭矩的啊,这一点要注意啊。行了,那这个就是它呃这个空心杯直流电机,它的名字的一个一个来源啊,就是咱们简单了解一下就可以。那接下来呢我们中重点关注一下,就是空心杯直流电机,它的特点是什么?它有如下这几个特点,这几个特点,正好是咱们这个航模,正好是这个飞行器所需要的。来,咱们看下,这都是啊一个,第一个就是效率高,第二一个就是响应快。第三一个呢就是重量轻。第四一个就是转速高。好,那我们来看一看,就是它为什么具备这样的特点啊,其实这些特点都是因为什么都是因为它的这个内部的这个结构啊,都是得益于这个结构啊。好,那我们先来看一个,第一个就是效率高,这个所谓的效率高,指的是这种电机,它的能量转化效率高能达高达多少呢?百分之七十到百分之九十,而普通的这种直流电机呢,也就我们上面这种对吧?它最多只能达到百分之七十左右啊,是这么一回事儿啊。好,那这个能量转化效率,大家应该能理解是啥意思吧?呃,这个电动机它在工作的时候,这个能量是由什么能转换成什么能啊?
正常情况下是由呃电能是不是转成这个机械能啊,那这个事儿吧,同学哎,他说的这个转化效率指的是这个啊,但是这个电能它不可能百分之百的完全转化成机械能,因为这里边一定是会有什么呀,是不是热能的损耗啊,对吧?唉,ok好,那也就是说白了啥意思呢?就是咱们这种空心微直流电机呢,它的热量损耗少,对吧?它的电能绝大多数都会转成机械能,就是这么一个意思了。OK它为什么具备这样的特点呢?其实就是因为它没有铁芯,大家都知道啊,就是你在一个金属属呃,外部呃,缠绕上这个线圈。那完事之后呢,这个线圈它里边在通电的时候,实际上我们这是不是会有感应电动势产生啊,对吧?那这个时候会在它的铁芯里边产生啥呀?感应电流,这个我们一般称为涡流,对不对?
还有印象吗?同学,那只要你在这个铁芯里边产生这个感应电流了。那这个里边是不是一定是会产生就是热量损耗的呀,对吧?
所以它的热量损耗是比较高的,而这个因为它没有铁芯了,所所以就没有这个涡流的热量损失了。
那这样一来的话呢,就是它的效率相对来讲要高一些啊。这一点大家理解了。
好,那效率高,那是不是说白了我们用在这个无人机上面,它就怎么着,它就省电呀,对吧?
能理解吧,你原来同样的,比如说多少多少的电量,你比如说机械能,你用这个你只有百分之七十,那其他的就白白的三失掉了,对吧?哎,OK好,那你要用这个呢能到百分之九十啊,就这么一个意思啊,所以它省电啊好,第二一个就是啥呢?
响应快,响应快啊。什么叫做响应快呢?呃,很简单,就是说你这个电动机呃,从启动从从从静止呃到启动,很快就能刷刷这个转速一下就上来了。
而这种呢它这个转速提升的就比较慢,是这样的OK这个是为什么呢?其实还是因为啥是不是因为这个转子它是没有铁芯的呀,对吧?
没铁芯说明它质量是不是就很少?其实这你一看就是对吧,一共就一个呃铜线轴,然后里边一个输出轴,这个质量是不是非常非常的轻啊,对吧?那所以说呢它的惯性就小,你惯性强,那你是不是响应就快呀?这个事儿大家也能想明白,对不对?
就比如举个例子啊,你这个咱们以汽车为例,汽如一个汽车,一个摩托车,你同时在等红绿灯。那那你起步的时候,那不是摩托车,它理论上应该是启动的,应该是速速度要要更快一点啊,对吧?即便说摩托车的马力没有这个汽车的马力大,但是摩托车它同样它起步的时候,至少它是非常快的。因为它轻啊,它惯量小啊,对吧?哎惯性小啊,对吧?所以它起步快响应快,就是这个意思啊,那尤其是在咱们这个无人机上边啊,这个响应速度是很重要的。因为什么呢?因为就以保持这个无人机的平衡为例啊,如果它受到外界干扰的举个例子,来了一阵风,对不对?
OK不管从哪个方向来了一个一来了一股妖风,对吧?如果你想要是非常的慢的话,你是不是可能就会被吹翻呀,对吧?所以这边只要有一丁点的风吹草动,那我们这个无人机就必须得立即越是不是纠正这个姿态啊,对吧?啊,来应对这个外部的一个力啊是这样的,所以它的响应速度要求是比较高的,必须得快才行。啊,这一点大家注意好。然后再有一个呢,就是呃它的重量是非常轻的重量,为什么轻啊,还是因为啥对吧,是不是是铁芯啊,对吧?啊,这个铁芯是很重的啊,所以它这个整体整体的这个质量非常非常轻。一个这种小型的这种呃这个空心微电机呢,其实只有几克左右,非常非常轻啊。
OK好,你看在无机机上边是不是越轻好,对吧?如果你电机非常非非重的话,那我就肯定飞起来比较费劲劲嘛,对吧?越轻越好好了,再有最后一个就是它的转速高啊OK那这种呃空心微电机呢它的转速啊就随随便便就是几万转,每分钟四五万转,每分钟非常非常轻松。但是这种普通的直流电动机呢,你可以查一查,它基本上也就是几千转好一点的,能到上万转啊,这一点大家注意啊OK所以说它的转速是非常高的。
这个对于我们这个无人机来讲,其实也是非常有用的啊。好,但其实咱这儿呢并没有就是完全呃利用上它这个特别高的一个转速。大家注意观察一下,就是我们这个机械结构啊,因为发现咱这其实是有一个减速齿轮的对吧?能看明白这个小的齿轮,小的齿轮是不是连的?是咱那个呃这个这个呃空心微电机的输出转弯,对吧?然后呢,这个大的齿轮是不是连的是螺旋桨,对吧?咱这是有一个减速齿轮,对吧?这个大家都知道这个减速之后,那我这个速度肯定是转慢了,但是什么提升了,同学扭矩是不是会提升啊,能列一事吧。同学哎,是这样的啊,就是说呃大家这个机器结构简单了解一下就可以啊OK行,那这就是关于咱这个电动机的一个简单的说明,就是大家呢了解一下它的这样特点就行啊。对于咱们写代码来说倒是无所谓,但是咱们得了解啊。好,那接下来呢给大家明确一下,就是在咱这个项目当中,我们使用的这个就是电动机它的一些参数啊。呃,首先我们来了解一下的型号,它叫做八五二零。注意这个其实就是一个尺寸的事儿啊,ok八五指的是它的直径是八点五毫米。然后二零呢指的是它的长度是二十毫米,也就是两厘米啊,差不多就是这个尺寸,对吧?啊,这个我就不多说了啊,然后咱们这个电动机的工作电压呢是三点七伏,然后呃额定的工作电流呢是几十毫安提升啊,其实还是挺省电的,对不对?哎,挺省电的啊。OK好了,那这个完了之后呢,我们继续往下进行下边,我们重点来看一下,就是咱们这个电机的驱动电路啊,就是我们将来怎么去驱动这个电动机。
呃,其实不用,我说大家应该也能想象的到啊,将来我们驱动这个电机咱得用什么呀?
因为这个电机它的速度肯定并不是恒定的,对不对?举个例子啊,我现在想让它往前飞,那你一定是怎么着呢?
是不是得让后边这俩电动机它的转速应该怎么着呢?比前面这俩电动机的转速要高,对吧?你高是不是升力才大,升力才大,是不是才会向向下倾斜?它是不是还会往前走啊,对吧?这样所以说将来我们肯定是要调整这个电动机的转速的。啊。好,那所以说力想想我们怎样去控制这个电动机的转速呢,肯定需要用到什么呀?PWM对不对?没错啊,咱这儿用的就是PWM去驱动这个电动机。然后呢,呃你不可,但是你不可能直接用啥,你不可能直接用我们这个就是单片机输出的这个PWM波去直接驱动这个电动机。因为咱们输出的什么呀?首先电压你都达不到,人家要求我们这边要求是三点七伏吧,对不对?而我们这个三二零口demo机,咱们这个呃正正电瓶是呃,是是多少啊,高电位是多少,三点三伏,对不对?所以说这个肯定不够,但电流够吗?同学那肯定也不更不够了,对不对啊?OK这一点一定要注意啊。那所以说呢咱们不可直接驱动,所以这边边是是么做的呢呢,我我们是加了一个mos管组成了一个开关电路啊。来现在呢我们一起来看一看,就是咱当前的这个驱动电路图是什么样的?这是我画了一个模拟图啊,大家可以简单看一看,其实很简单呃,注意这个就是咱们那个哎我这个红笔它又哎出来了,这个是我这画了一个电机啊,画画一个电机。完了之后呢,注意观察这是不是就是一个mos管啊,这是一个n型的mos管,对不对?哎,OK好了,那完了之后呢,呃我们来看一看这个电路,它具体是怎么连接的啊。首先这是电动机这边它的正极负极对吧?哎,这是一个直流电动机吧,它是分正负极的啊OK好,正极,我们就直接接到这个电源,然后负极呢接到了哪儿,是不是接到了这个mos管上面啊,对不对?ok好,那mos管另一端是不是接地了呀,对不对?那很显然同学想一想,我这个电极什么时候就能转呀?是不是只要mos管它的什么极,它的原极和漏极,要是接通了之后就会怎么着?是不是相当于咱们这个电动机这条路就导通了呀,对吧?电动机就会开始旋转啊,能力这个事儿同同学就这么一回事啊。ok好了,那这个要是不导通,那相当于这儿直接开路,那电机是不是就不转了呀,对吧,就这么一个逻辑啊。ok好了,那接下来我们继续往下进行。各位呃,来看一看我们前面这部分电路是怎么连接的啊?好了,那这个电动机它这个就是这条路到底是不是通到底是不是断这个说么来决定呢?
是不是由咱们这个PWM来决定啊,对吧吧?那我向咱们这个mos管的积极输入一个PWM啊啊OK好,那那样一一来,当我这PPWM这这给高电瓶的时候,那这个是不是就导通啊,对吧?哎,OK好,那给低电瓶的时候,它就它就不导通了啊,是这样的啊,完了之后呢,我们可以通过什么?是不是可以通过这个PWM的一个,这叫什么?可以通过PWM的一个是不是占控比来调节,我们整个电动机的一个转速啊,对吧?占控比越高,对吧?什么叫这样?比如说最高我就到百分之百百分起来,是不是说白了我这一直是不是给这个呃山级给它什么什么电平,一直是高电瓶,一直高频,这儿是不是一直扰通啊,对吧?这时候电动机是不是一直都在工作,它现在的转速是不是应该是最高的呀,对吧?唉OK好,那反过来呢呃,我给他一个这个什么呢?呃,一会儿高一会低,那说明这个个一会工作,一会儿没工作。那这样一来呃,虽然可能听起来有点怪异啊。呃,确实是,如果说你给他PWM二,我这个周期是非常非常长的,注意周期非常长。举个例子,最长长到什么时候?比如说一一,假如说两秒吧,两秒的周期两秒的周期占控。比。比如说百分之五十,那这样一来的话,说说白了什么?我是不是高电平一秒,低电平一秒啊,对吧?好,这样一来,你如果给它通这样的PW的m二,你会看起来这个电动机就是转一秒,停一秒,转一秒停一秒,你看起来应该是这样的呀。对吧?唉OK好,但是如果你给的PWMR它的频率呃非常的高,也就是周期非常的小周期非常的短。好,那这样一来你看起来这个电阻机,它就是在连续转了啊,因为这个电极它是有惯性的对吧?好,比如说我给了一一小会的高电平。好,那是这是不是转了呀,对吧?然后我立即切到这个低电平,虽然你这儿不给它通了,但是因为有惯性,它是不是还是在转的呀,对吧?啊,OK然后呢在它停之前,哎,高电平又来了。好,这样一来呢,它是不是又续上来,相当于对不对?OK好,这样一来整体上来看呢是一直在转的。但是你平均一下之后呢,它的转速实在是会降低的,比你全是高电平的时候啊,就这么一回事啊。OK这一点大家理解一下就行了啊。好,那整个电路其实不是很复杂,但是大家可能对这个电阻是不是可能有点这个疑问呀,对吧?就我们这儿为什么要接一个这样的呃,这相当于是一个什么电阻啊,这叫是不是下拉电阻啊,没错吧,是不是直接把这个就是mos管的这叫什么极积极,对吧?接到了是不是力呀?这个为什么要这么做啊?其实一个主要的原因呢就是确保什么呢?确保我们这个mos管儿在咱整个系统刚刚上电的时候,呃,确保它的机器处在一个明确的一个什么电瓶,这叫低电平啊OK好,那因为想啊如果这块呢我要是不加这个下拉电阻的话啊OK在我们这个单片机上电的时候,就是可能会有一些外呃干扰啊,或者是这个呃GPL引脚在初始化的过程啊,呃这一块是不是可能会受到干扰。比如说一不小心来了一个什么来了?一个比如说高电瓶的一个干扰,那这个是不是就有可能会直接导通啊,对吧?啊,是这样的啊OK为了避免出现这样的一个情况。为了确保我们在启动的时候,它处在一个稳定的一个低电平。所以在这边呢,我们这是不是来了一个下拉呀,对吧?啊,这一点大家要注意下,对啊,这样一来来管管怎着不这个什么干干扰我们这只要启启动上电的时候,因为这儿直接接地了,所以它一定是一个什么啊,一定是一个呃低电瓶OK好,那当然当咱们这边呃这个GPL引脚,咱们初始化好之后呢,这块呢其实这个就无所为了啊,因为咱们这儿一般情况下,我们采用什么输出啊?我们一该采用是不是推挽输出啊,对吧?推挽输出这块儿一定是明确的,是不是高低电平啊,对吧?它不会出现什么高阻态啊等等。这这种情况啊,这个主要是初始化的时候,确保它处在一个稳定的低电平这一点大家注意就行了啊。
好了,那呃然后大家注意一下,就是这两个电阻它们之间的一个阻值啊,呃这个是一个一千欧的这是一个十千欧的对吧?那所以将来这边在给高电平的时候,同学OK这一点的电平是不是应该也是一个高电平啊,因为你你就看这条路就行。同学,你看这条路,哎,你看这条路,这条路相当于是是不是这边分压比较多呀,对吧?它分了是不是十一分之一呀,对吧呃,是之十啊,对吧?
那所以说是不是这一点的电压呃,其实是很接近,这个是不是三点三伏高电平的呀,对吧?啊,这一点大家注意就可以了。行,那我们就了解一下这个呃,驱动电路就行了。一会儿咱们看原理图的时候也是这么画的啊。行,这就是咱们这个动力系统就给大家介绍完毕了啊。好了,这个完了之后,接下来我们往下走,呃,我单独录一段视频吧。
02-无人机-组成结构-中
cpp
复制代码
嗯,OK好,动力系统就给大家先介绍到这儿啊,呃然后呢具体的细节呃,我们到后边写代码的时候再说啊,接下来呢我们再来了解一下,就是咱这个电源系统呃,电源系统呢其实也是无人机这块比较重要的一一个组成部分,对吧?然后这块呢我们需要重点关注两点。第一个我们用的电池。第二一个我们用的电源芯片,第一个咱得了解啊。首先我们看第一个电池,第池,咱们用的是一个锂电池。对吧?那锂电池一般情况下,你在网上去买的话,你会发现它的输出电压一般情况下呢,就在差不多,应该是三伏到四伏,差不多应该是这个范围啊OK好,那我们所选用的这款锂电池,那它的输出电压是多少呢?咱是三点七伏的这个三点七伏正好跟谁对上了?同学是不是跟电机的这个额定电压对上了呀,对吧?哎,咱这个电机正好也是三点七伏的,所以说我们这可以直接用什么呀?用我们的电池去驱动这个电机,你不用经过变压了,能列这个是吧?同学哎,好了,那呃一会儿咱们看远距离原理图也能看到啊。好,那接下来再看一下,就是我们这个容量,咱们容量呢选用的应该是两千毫安时的。这个大家看一下哪儿呢?看一下咱这个电池,它这个包装上边其实就能看出来啊呃,看一下遥控这个吧,再来看一下这上面其实标了,你看这是不是三点七伏,后边跟上了一个两千毫安时啊,对吧?唉,两千毫安时,大家能明白它的意思吧,是不是就是以两千毫安的速度放电,我能放一个小时啊,对吧?啊,就这么个意思啊,大家了解一下就可以了啊。行,这是关于这个锂电池啊。好,那接下来呢需要了解的是啥呢?
是这个电源芯片呃OK刚才提到了,我们这儿其实可以直接使用这个锂电池去给谁去给电机供电,对吧?但是咱们整个这个飞控系统,包括我这个遥控系统,对吧?我这儿是不是还有一些单片机啊,我还有一些其他的外设呀,对吧?你能直接使用这个三点七伏的锂电池给他们供电嘛,那肯定不能啊,对吧?啊OK所以说这边呢我们是需要用到一些电源芯片来做一些稳压,或者是这个电压的一个调整。啊,其实当然除此之外呢,我们还有什么,我是不是还得给这个锂电池充电呀等等,是不还有这样的一些事要做呀,对吧?所以在这儿呢我们用到了这样的两个电源芯片,这俩都是干啥的啊,给大家了解一下。首先我们先看第一个呃这个型号呢叫做IP五三零五t啊OK好,这个是用来做什么的啊,是用来做充放电的,它的主要作用是充放电以及呃去调整咱们这个电压啊OK好,那呃给大家看一看,就是它具体是呃怎么玩的啊。OK那这款芯片我们在给这个锂电池充电的时候,要求输入电压是多少呢?呃,是五伏,呃,然后这这款芯片它在放电的时候OK好,那它输出的电呃电压是多高呢?也是五伏。哎,为什么它都是五伏的呢?因为这个东西啊,前面给大家讲过,这实际上就是我跟大家说的,它用用在哪儿的,用在充电宝上面的那样的一个相当于是一个一一个芯片系统啊,它专门给充电宝用的对吧?你像早期的咱们充电宝,在没有那个快充的那个年代啊,大家想想是不是当时咱们的,你不论是给它放电,还是它往外部放电,是不是基本上都是五伏啊,对吧?那是这样的,所以说它的充电放电都是五伏,这个显然是不是也满足不了我们的要求啊,对吧?就是锂电池接它,对吧?它给咱们这个系统放电的时候,它只能是不是提供五伏的电源。那那我们一会儿是不是还得对它进行一个是不是降压的一个操作呀?对吧啊,这一点大家一定要入意啊。OK好,那这款芯片除了有充放电的这样的预估功能,它还有啥呢?它还能显示电量啊,是不是通过四颗LED来显示咱们这个电量啊,对吧?哎,好了,那这也是充电宝的功能,说白了就是啊好,再除此之外,它还有一个什么低功耗模式啊?OK好充电宝是不是也有低功耗模式啊?如举此例外,你买的充电宝,然后呢,你只要给这个充电宝,插上咱们这个手机。好,那它是不是有的充电宝可能比较智能啊,你插上之后它自动开始充电,有的可能没那么智能,你去按一下那个按钮,它才充电,对吧?好,但是你拔下去之后,一般情况下也不用管,那不是过一会儿之后,它自动就会相当于是进入低功耗模式啊,对吧?哎,OK好了,那其实它是怎么做的,它是会实时的检测。我这个输出的电流的大小,这个电流在小于它规定的一个阈值之后OK那它就会进入低功耗模式。
那当然这款芯片它也不例外,它也不例外啊。OK好了,那这一点大家要注意啊啊呃然后呢需要给大家说明的一点就是这款芯片的低功耗模式。对于我们来讲,其实怎么说呢?其实是个累赘,为啥是个累赘呢?举个例子啊,就是咱们这个飞机倒还好,飞机我这个呃螺旋桨这个电机只要一转一转起来是不是它的这个电流消耗的还是比较大的呀?对吧?啊OK好好,那所以说等等它整体上来讲呢,它实际上是呃功率是比较高的。但是咱们这款这个这个这个这个遥控,实际上它整体的这个功率是比较低的。所以你你你这个遥控放在这儿,如果你不动的话,它过一会儿它就会自动怎么着的,就会自动关机。因为它的电流达不到它检测那个阈值是这样的啊,所以这个低功耗模式对于我们来讲是一个是比较高的那到时候我们还得处理一下啊,就是不让它这个低功耗模式工作怎么处理?咱们到时候再说啊,简单了解就行。好,这是咱们这款芯片的一个逻辑。好了,那接下来给大家整体总结一下啊。呃这款芯片我们这是怎么用的呢?咱是这么用的啊,首先注意观察这个是咱们这款芯片。对不对?哎,OK这款芯片它需要连接到谁?同学连接到咱们的锂电池,比如说这是我们的锂电池啊OK能理解这个事吧。同学好,那完了之后呢,我们锂电池的充电需要怎么着?需要经过这款芯片啊,也就是说到时候我们充电的时候,我们的输入的这个呃电源呢,需要连接到这个芯片,这个芯片呢会对这个呃锂电池应锂电池进行一个充电OK好,那放电的时候,我们锂电池也要怎么着呢?也要经过谁经过这款芯片呃,进行这个放电。当然一会儿咱们看原理图能看出来啊,我们这个锂电池放电的时候呢,它如果是给这个电动机供电,它其实并没有经过这款芯片啊,给电动机为为啥没经过它呢?因为咱们电动机正好就需要多少伏是三点七伏啊,对吧?那所以电动机其实是直接是接的电池,这一会儿咱们能看出来啊。好,那我这个经过这款就是IP五五五三五三零五t呃,经过它往外放电的时候,主要是给谁用呢?主要是给我们这个是不是单片机整个这个偏差系统去使用啊,对吧?啊,这一点大家一定要注意啊。好了,那我们继续往下进行,但是你这个东西你给单片机用的话,是不是有问题?因为这款芯片它的放电的电压是不是五伏啊,对不对?所以这个肯定是有问题的啊,不能直接给咱们供电。那所以这块我们用又用到了一个什么芯片呢?唉,用到了一个LDO啊,这就是一个线性稳压器,对不对啊?OK好,那它是能够直接将五伏的电压给降为多少伏呢?三点三伏的啊是这样的啊,所以那我们这边这款IP五三零五t出来之后呢,又接了一个LDO,其实是这样的。完了之后呢,这个LDO再去给谁供电,再去给咱们的单片机供电,这是我们整个的一个电源系统,它是这么个逻辑。唉,好了啊,我可能这个图画的有点糙啊,我再明确一下啊,这个是咱们的电池,对吧?这个电池我们是不是会直接给咱们这个电机供电压对吧?啊,比如说m乘四,这是咱们这四个电机啊,完了完了之后呢,完了之后就是这个电池,它的充电放电管理,都是由谁来管理的,由这款芯片这个所谓的IP五三零五t由它来管理的。唉,好,但是它有一个问题,因为它是给充电宝用的啊,它不是专门服务于咱们这个这个这个这个无人机的,所以说它这块呢有一个问题,就是充放电都是五伏,你充电用五伏,这个其实没没啥问题,对吧?因为我们到时候充电用USBB供电,正好就是五伏,对不对?ok好了,但是它放电的话是不是就有点问题了呀,对吧?所以放电这块呢,我们给他呃搞了一个啥呢?搞了一个LDO把五伏降为三点三伏,然后呢给给咱们的单片机再进行供电,这是咱们的单片机机。STMM二二。哎,好了,大家现在能看明白这个差不多一个流程图吧,哎,应该是可以的啊。呃,一这个要是看不清,一会儿咱们看明白个图就就更清楚了。行了,那这就是咱们整个的一个电源系统,咱们了解一下啊。好了,这个咱就过了啊。好,然后再往下呢就需要给大家介绍一下我们这个飞控系统了。这个飞控系统呢这块呢主要给大家介绍这样的两款呃两部分吧,一个是咱们用的主控芯片。还有一个就是我们在做这个飞行控制的时候,我们用到的传感器啊,来我们先看这个主控芯片啊,主控芯片我们用的肯定还是三二,对吧?但是并不是用的,我们前面学基础课的时候用的那款,咱们之前用的这款型号是多少了?应该是ZET六,对不对啊?OK好,这边我们用的是c八t六之前大家做那个小项目的时候,用的是不是也是这款呀,对吧?啊,这个相对来讲呢,它的呃当然就是它的这个呃指令集啊等等,跟咱们前面用的那款全是完全一样的,只不过就是它的配置有点低,对不对?比如说我的内存哎,我的flash是不是要小一点,对不对?除此之外呢,我的外设的数量也要少一点,基本上就是这样的啊,然后呢我把它的一些基本参数给大家列出来了,我们快速的浏览一下啊,它的存储容量啊,首先flash它是多少?大家这个了解了吗?呃,六十四KB啊OK那它的SRM也就是内存是二十KB这个跟咱们之前用的那款差距还挺大的,但之前用那款是多少来着?
呃,应该是flash五百一十二KKB对吧?sram应该是六十四KB吧,对不对?你看这个是不是差挺多的。哎,好,接下来往下走,它的ADCADC也就是什么东西啊,是不是魔术转换器啊,对不对?OK那这个它一共只有两个啊。OK好定时器呢也没那么多,只有四个啊。OK好,那iphonec硬件iphonec只有两个啊,然后呢SPI也是只有两个。哎,串口一共有三个,哎,这是它的一些基本参数呃OK为什么要了解这些东东西,你这个东东你不了解,因为你这到时候呢,就是你这个东西参数,你要不明确的话,你到时候你知道道是是它够够够用,对对吧?啥意思呢?举个例子,以我们当前的咱们就看这个遥控吧,我们遥控上边其实会用到呃用到什么呢?我们会用到呃,大家能现在根据我们这个就是外观啊,你能不能猜到,就是咱这儿可能会用到哪些?这个就是外设呀?首先这俩摇杆儿这个摇杆咱们会用到啥摇杆?哎,你觉得会用到啥东西,我是不是肯定得采采集这个摇杆的数值啊,对吧?哎,这个确实会用到adc的。其实这个摇杆它里边就是滑动变阻器,能理解这个事吧。同学哎,就是这么一回事啊啊OK那所以你可以通过过这个采集它的阻值来得到这个摇杆的数值,基本上就是这么一回事。呃,不不是组织那个电压嘛,对吧?那就能得到它的这个数值,基本上就这么一回事啊。好了,那完了之后呢,呃再看到,所以它需要用到ADC对不对?那它会用到啥呢?
这个是不是一块小屏幕,我们在什么时候用过大家在五幺幺的时候,是不是就用过这块屏幕啊,对吧?哎,那它跟我们的这个单片机通讯的时候,是不是呃对当时咱们用的是iphonec协议。那实际上就是这款呃这个LEDORED屏幕,它的那个主控芯片,咱们用的是SSD幺三幺五,还记得吗?
哎,其实支持多种通信协议的iphoneCSPI其实它都支持啊,总之它是不是可能会用到iphonec或者SPI啊,对不对?就是你得你得意识到,就是我这会用到哪些这个就是呃外设,对吧?然后呢,你得去评估一下,就是你这会设它够不够用,对不对?
对OK好,那咱们这儿选的这款芯片呢,基本上正好够用吧。你像我们到时候iphonec两个都用了SPI两个也都用到了,定时器,两个也都用到了。当然ADC没用那么多啊,ADC是咱们一个就支持多个通道,对吧?啊,所以说这个肯定是够用的啊,这一点大家注意就行了。你好,这是主控芯片,我们了解一下参数就行啊。好,再有就是传感器这块,我们用到了两个传感器,主要是两个。哎,两个当然型号咱们不用记啊,咱们知道它的功能就行啊。第一个MPO六零五零,这个是用来测什么的呢?测量飞行姿态的。哎,好,那为为什么咱们要去测量这个所谓的飞行姿态啊?其实我前面给大家提到过,咱整个项目是不是主要有这样的几个需求啊,对吧?第一个需求是什么来着?是确保是不是飞飞飞行姿态稳定啊,对吧?哎,ok好,那你怎么能确保它的飞行姿态稳定呢?大家自己琢磨琢磨,就是咱们的这个所谓的控制的一个思想是什么样的,你怎么做就能保证它稳定它是否稳定,是不是一定是取决于我这四个电机的转速啊。对吧你得让这个转速合适对吧,它是不是才会保持稳定啊,对不对?那你想想怎么做,能够让咱们这个电机,它呃就是达到我们那个期望的一个转速,让这个飞行器保持稳定呢,怎么做呀?你是你自己给他指定一个转速吗?那肯定是不是了,对不对?就是这个东西它一定是一个什么样的过程,一定是一个动态调整的过程。大家能理解这个事儿吧。哎,ok好,你首先你要想保证它飞行姿态稳定,你得先测量。什么同学你得先测量它的飞行姿态,对不对?你得知道它现在是不是稳定的,大家能理这个事儿,同同学么?叫稳定,比比说我我举举例子啊,保持持平平,那叫稳稳定,这就叫不稳定,这就不稳定,这都叫不稳定,这叫稳定,这是我们给它定义的一个稳定,对不对?哎,保持水平就是稳定。ok好,那接下来你要想保持让它一直保持这个稳定啊,你是不是得实时的去测量它的这个呃飞行的姿态,你得测它是不是稳定啊,对吧?如果不稳定,那我们需要怎么做,这显然是不稳定了,对吧?那它不稳定,我是不是得能够意识到,就是它是不是出现偏差了呀,对吧?完了之后,咱们再怎么着,再反过来,是不是根据偏差去干啥?去对这四个电极的转速进行调整,让它回到这个稳定的状态,是不是一直都是一个这样的动态调整的过程啊,对吧?哎,是这样的啊。ok好,那其实大家应该能想象的到啊,就是在这个动态的调整过程当中,我们肯定会用到之前的一个知识点叫做什么呀?
PID根据误差反馈还回来干啥呢?去调整咱们这个输出能理解吧,是不是又是一个闭环控制系统啊,对吧?哎,这里边的核心精髓就在PID啊这个PID我们后边再详细的说啊OK好了之前咱们通过小圈儿,我们应该了解了一点PID的概念啊,当然不深。那我们这边这回用的时候得好好去聊这个事儿啊。
好,总之啊就是你想保持它的呃稳定姿态,你得先测得它的姿态,你得知道它现在稳不稳,对吧?不稳我就调稳,我就不调了,应该是这么一个思路啊,对吧?好了,那关键问题来的同学这个飞行姿态咱怎么测呀?
或者是换一句话说我怎么表达它的飞行姿态呢?歪了,这是美完这这这这是我们怎么去表达他的飞行姿态呢?
对吧?同学咱是不是得有固定的呃,一个指标能够去量化它的飞行姿态啊,对吧?就举个例子,比如说高度高度,这就是哎高度高高低,对吧?多少?我们是能测出来的,对不对?但这个飞行姿态我怎么测呢?我怎么量化它这个飞行姿态呢?哎,这块需要给大家引进出一个概念啊,什么概念呢?叫做欧拉角啊,就是我们通常情况下这个飞行飞行器的飞行姿态呢是需要通过一个所谓的欧拉角来进行描述,或者是进行量化的,用欧拉角来表明它的飞行姿态。哎,什么叫做欧拉角呢?呃,后边给大家也解释了,他说欧拉角呢是一种用三个角度来描述这个钢铁在三维哎,三个空间三维啊,在三维空间维度啊,在三维空间中取向的这个方法。什么叫取向呢?这就是它的取向嘛,对不对?就是它的这个说白了,就是一个呃一个一个一个朝向,或者是你可以理解为啊,ok好等等等等。总之就是我们可以通过这三个角度来描述啊,咱们这个飞行器在三维空间当中的一个呃飞行姿态吧啊。
ok好,那接下来呢我给大家描述一下这三个角都是什么角啊,其实非常简单。呃,那分别就是所谓的俯仰角横滚角和偏航角。我后边列出来的英文呢是它呃上面的英文名称,一个是peh,一个是肉,一个是腰啊。OK好,那接下来呢我们来看一看,就是这三个角度到底是什么啊?为了方便,大家理解我这画了了张图图啊,我这块没有直接用咱的这个就是四轴的无人机去画图,我用了一个这种固定翼的。因为这个固定翼它的前后它的机头方向是不是非常明确呀?呃,能理解吧,对,对吧?所所以我在这我是用它来表达这个事儿的啊,来我们先看一下俯仰角。什么叫俯仰角呢?其实很简单,这个是举个例子啊,我这个就是虚化的,这个就是透呃相对比较透明的。这个图呢是咱们这个飞行器,它比如说最开始的那个姿态。ok好了,那完了之后呢,现在是不是这个飞行机它上扬了呀,对吧?ok好,那这个时候呢,这就是它的一个所谓的俯仰角,这个角度就是它的俯仰角。
哎,ok好,那我要想让这个飞机保持水平状态。你说它的俯仰角应该是什么多少度啊,是不是应该是零啊,对吧?我是不是能够通过测量这个角度,或者是通过这个角度来表达,就是我们这个机头它是往上走,还是往下偏呀,对吧?
哎,这是能够表达一个维度啊。好,那除了有俯仰角,我还有什么角呢?还有横滚角来看一下航空件,这个大家看看能不能看明白。呃,我们先看实呃这个就是实心的这个啊,也就是这个这个是不是相当于是啥呀?是一个飞机正面朝我们飞过来啊,对吧?唉,ok什么叫做横滚角呢?那这个是不是就看出来了?如果要着绕这个飞机,整个飞机从前到后这个轴线进行旋转的话,这是不是相当于它在在这个横横横着这个方向在滚动啊,对吧?
这就是所谓的横滚角啊OK这就是横滚角,它是不是能够来表达出来?就是我们这个飞机是不是在这个角度上的一个倾斜程度啊,对吧?
好,那我要想让这个飞机保持一个稳定的水平状态。好,那你说它的横滚角也应该是零么?是不是也应该是零啊,能理解这个事吧。ok好了,那还有一个角度是啥呢?我们管它叫做偏航角,哎,咱们看一眼。好,这就是一个所谓的偏航角,比如举例子啊,这个是咱们飞机,它原计划的一个航向啊。
好,那接下来呢是现在怎么着呢?比如说往这边偏了,这样是不是会有一个角度?所以这个角度我们称之为什么呢?叫做偏航角,就这么一回事啊?好,那我们是怎么去描述咱这个无人机,它的飞行姿态的呢?就是通过这三个角度来描述它的。
好,举个例子,我现在就想让咱们这个飞机保持水平。ok好,那所以这个时候你应该怎么着呢?是不是应该确保这三个角度都是多少度才行啊,都得是零度才行,对不对?那所以说接下来我们到时候我们控制的一个思想应该是什么呢?我应该实时的去干啥,是不是去检测这三个角度?没错吧,实时的检测咱们这个飞机的三个角度,如果这个三个角度它不等于零,那就说明它怎么着了,它偏了能能能理解吧。哎,如果到时候它的俯仰角要是不等于零,可能是是是是是这偏偏也可能这么偏了呀,对吧?啊,OK好,那所以呃这个时候呢我们就能通过这个角度来来得知它的一个飞行状态,飞行姿态。ok那接哪个角度不是零,你就去相应的飞调整什么相应的这个电机里边儿的这个电机的转速,对不对?完儿之后呢,让这个角度是不是尽量的往这个零靠近就行了呀。对吧唉,是这样的一个动态平衡的一个一一个调整啊,这一点大家注意啊。好,这就是飞行姿态的一个量化指标。这三个角度大家一定要注意啊,一定要注意啊。好了,那接下来我们往下进行同学。那除此之外,除了用到它了之外呢,我们还用到了一个就是VL五三LES这是干啥用的呢?很简单,用来测量飞行高度的飞行高度,这个事儿我就不用给大家解释了,对吧?好,那为什么我们要用这个传感器呢?因为我们接将来要做一个什么什么样的一个功能来着?同学是不是要实现一个所谓的,是不是飞行高度的一个固定啊,对吧?啊,一个定高。
好,那我怎么实现定高呢?你要想实现定高,其实这也是一个动态,是不是调整的一个思路啊,对吧?怎么着呢?我得实时的去检测我这个飞行器的高度,对吧?举个例子啊,现在我给它设定的我的期望的定高,比如说是一米。好,那你是不是得实时的去检测我这个高度啊,对吧?如果超过一米了,那我说明怎么着了,说明我这个飞油门是大还是小同学是大了,对吧?我是不是应该让这个电机的转速降下来呀,对不对?如果它要是低于一米,好,那我是不是应该是加大这个油门,让这个电机转的更快一点啊?
对吧?能理解它也是一个这样的动态调整的一个过程。所以你要想实现定高前提是你得先测得它的高度,哎,是这么一回事。那所以说呃这是我们为了实现两个功能,呃,所以用到的这个芯片啊,一个是测量飞行姿态的,呃,一个是测量这个飞行高度的这一点,大家能理解吧。哎,好了,那如果将来同学,我们要想实现一个水平方向的啊,注意要想实现一个水平方向的一个定点。那你说光用这俩传感器够不够用,够不够用,那显然是不够的对吧?你要想实现水平方向的定点,那你是不是得知道或者你得实时的测量,它在水平方向上的位移呀?大家能理解这个事儿吧。唉,你得你得能够测出来,它在水平方向的位移,是不是才能够实时的去观察到,就是它有没有偏移,你规定的那个点?如果偏了,你是不是再给它纠正回来偏了再纠正回来是不是也是一个这样的一个动态调整的过程啊,都是一样的思路,都是一样的思路啊?就是你想实现什么效果,你得先测得它在这个纬度上的一个指标才行啊,这一点大家注意就行了。所以你要想实现水平方向的定点,其实用这俩传感器是不够的,那需要用到谁呢?其实会有一个叫做光流传感器的一个东西。这个后边咱们呃再说吧,现在我们没做这个,咱就不说了啊。肖乐同学,这就是咱们这目前用到的两个传感器。行,那传感器也就给大家介绍完了啊,这是咱的非控系统。呃,来我停一下这个视频。
03-无人机-组成结构-下
cpp
复制代码
好了,各位同学,那接下来呢我们再来看一看,就是咱这儿的这个飞控系统呃,呃,不是飞控系统。说完了对吧?说说完了啊呃飞控系统主要是介绍了一个主芯芯片,有我们用的两个传感器啊,那最后一个就是这个遥控器了,遥控器就简单了,对不对?首先呢先给大家明确一下,就是咱这个遥控器它的功能定义啊,我这画了一张图,当然这个功能怎么定义,这个是不是完全是咱自己说了算呀,对吧?你自己写代码意,你想怎么定义,怎么定义,对不对?但是我我这给它划分的这个功能是什么样的,咱们一起来看一看,这就是咱们的遥控器的一个图。
对吧?呃,首先我们先来看一下,就是整个遥控器上面最显眼的两个东西,这俩摇杆对不对啊?
ok好,那我们这块怎么规定它的功能的呢?对于观察同学就是最左侧的这个摇杆啊,你上下的这个维度去推动它的时候,它是能够稳定在一个是不是位置的呀,对吧?哎,ok好,那你右边这个摇杆,不论是上下还是左右,你松手之后是不是都会自动的归位,对不对?
包括左边,这也是一样,你要是左右移动的话,它是不会会右右会归归位啊,对吧?但是上下时候会固固固定的。哎,这个点大家先注意到好,所以说我们怎么规划的这个事儿呢?所以以左边这摇摇,我们上下移动是用来控制油门的油门。这个东西其实你不期望它,你松手之后就自动回归,对不对啊?OK所以说我们往上走,就是油门加往下走,就是油门减啊。OKK。好,那完了之后呢,我们注意观察同学看这个看右边那个右边那个呢我们就是控制它的方向的,呃,这个往往前往上推,就是前进。哎,往后就是哎后退往左就是往左,然后往右就是往右呗,这是控制它的飞机的移动方向的。好了,那完了之后呢,我们其实还能够实现一个就是我们这个无人机的一个旋转啊,什么叫做旋转呢?呃,很简单啊,呃给大家看一下,这是咱这个哎可能这个有点那啥了,有点有点太大了。我看一下这个能不能缩小一点,那后好再小一点,再小一点啊,最小了啊,一会儿我把这个往上拉一拉,应该也能凑着看。对吧什么叫旋转呢?就是这么转旋转这么转啊,不是不是这么横滚啊,或者是前后啊水平的方向的一个旋转。呃,我们这个是用谁来控制的呢?是用咱们这个遥控器的左侧的这个摇杆来控制的。哎,ok好,你要是往左推,那就是逆时针旋转,往右推,就是顺时针旋转啊,这是咱们定义的一个功能啊。好了,这俩俩摇杆,咱们先给它搞清楚。好,除此之外,是不是咱这上面还有几个按键,还有几个按键呀,对吧?哎,好了,那完了之后呢,先给大家看一看,就是咱们呃上面这俩按键啊,上面这俩按键。左侧这个呃咱们是用来关机的,只要我按一下这个按钮,注意关机是让谁关机同学啊,是不是让咱那个飞机关机啊,对吧?让无人机那边关机啊,比如说举个例子,我要是遇到了一些危险的情况,他飞远了,我怕他回不来了,赶紧或者是怎么着着遇到一些紧急情况,对吧?马上要撞人了。哎,我比如说我给它关机啊,就是可以关机啊,遥控关机啊。好,那完了之后,右侧这边呢呃我们定义了两个功能,我们给它分别定义了一个短按,还有一个长按啊,如果是短按的话,我们要给它进行什么操作,就是定高。比如说我现在飞的时候,我飞到一个,我认为比较合适的高度了,对吧?我想让它维持在了一个高度。好,这个时候你短按一下这个按钮,这个时候它就会向我们的飞机那边发送一个定高的信号,那飞机就开始进行定高了,那能理解这个事吧。同学哎,好了,那除此之外呢,我们这还给它定义了一个功能,长按长按的时候,我们要求它干啥呢?是对谁对这个遥控的摇杆儿进行一个什么呀?这叫校准。呃,这个现在大家可能理解不了啊,就是我简单的说一下这个事儿就行了啊。好,注意观察同学,由于这个就是摇杆的这个制造误差啊,就是它这个摇杆,它在你松手之后,我们正常是不是应该归到是不是正中间呀,对吧?但是它有可能啊就是你松手之后,它回到的那个位置并不是真真正正正好的那个正中间可能会有一丁点的偏差,能理解这个事的同学它是会有这个误差的啊。那所以我们这块呢呃设计的这个功能,就是我们按这个按键,就让咱们这个摇杆进行一个校准啊,所谓它的校准就是啥呢?就是我我测的时候,我就认为它的初始状态,就是咱们那个ADC采集的时候,那个正中间的那个值呃,就是就是这么一个意思啊。ok我们现在先简单了解一下,就情,到时候到时候咱写代码的时候,看到实际的这个象象,咱们来理解这个校准的一个作用啊OK好,这是它的一个基本功能。好,那再有就是啥呢?我们左下角这个位置是不是还有四个按键呀,对吧?上下左右各有一个,这个是用来做什么操作的呢?是用来微调咱们这个摇杆的这个右边这个摇杆,就是前后左右方向的这个这个这个东西的啥意思呢?我前面给大家讲过啊,就是我们这个飞机它在飞起来之后,同学是不是可能会因为我没有做水平方向的这个控制,对不对?那是不是可能会前后左右去飘啊,对吧?ok好,那你要想让它稳定在一个地方,那你就需要怎么着,是不是手动的不断的去调整,是不是咱这个这个这个摇杆啊,是不是它能它稳定在一个范围里边了,对吧?OK好,但是你要知道的是这个东西,它是不是只要你一松手,它就又回到那个原来的位置了,没错吧?所以说你这这个较累啊OK好,那所以这边呢给大家提供了这样的四个按键键们通过过几个按键键来固定的调整。整么呢?就是我们这个前个左右的这个呃这个这个个这个这个这个这个油门呃,你可以理解为就是前后左右的一个一个方向吧,固定的调整。比如说我摁一下前好,那它就会稍微的让这个无人机的角度,前面咱们讲过腰往前飞,是不是就让那个角度往前偏一点,它就往前飞了呀?对吧?哎,你只要摁一下这个按键,那我这个角度就会呃固定下来。哎,往前偏一点点。哎,你往向后哎,那就又会往后偏一点点,呃,能理解这个事吧。同学啊,其实它起到作用,跟这个摇杆是一样的,只不过这个一松手就又回到原来那个初始值了。而这个你按了之后呢,它是不会回到初始值了啊。所以说你可以通过这几个按键呢进行微调,让咱们这个无人机基本上保持在一个位置。哎,是这么一个思路啊。好,这个也是等到时候写代码的时候再继续说吧。现在干说的话不太好理解啊。行了,这是我们对这个呃遥控器的功能的一个定义。到时候咱们写代码的时候,得严格按照这个要求来啊。行了,这个就过了啊,接下来我们再来看一下这个无线通信,为什么要看无线通信?因为你遥控器跟咱们那个飞机之间是不是肯定是进行无线通信呀,对吧?哎,好了,那这块我们用到了一款无线通信的芯片,叫做SI二四r一啊OK这个是一个什么呢?是一个二点四g的无呃无线信号的一个收发器,二点四g的一个概念,大家了解不了解,了解不了解。嗯,你看啊就是大家应该自己都设置过这个路由器吧。现在有很多这个路由器包,但是前啊之前的路由器它是不是都会有一个什么二点四g啊,对吧?现在很多这个路由器都会有什么都会有什么二点四g加上一个是不是五g啊能理解吧,就是这个二点四g跟五g它到底是什么意思?这个大家有没有思考过呀?他他这样指的是什么呀?指的是什么呃,频率对吧?谁的频率呃给大家解释一下,这个实际上是指什么啊,给大家明确一下。首先大家要知道的是啊,无线电通信靠的是什么?无线电通信,比如说这个是我的一个发送端,这个是我的一个接收端,对吧?ok好,他们之间这个所谓的无线通信,靠的是什么?这个信号是通过什么传播出去的?是电磁波电磁波怎么产生的?这个大家还有没有印象啊?这个应该是学过的啊,咱们在中学的时候,电磁波实际上是靠电场跟磁场的相互作用是不是产生的呀,对吧?
啊,OK那这个太复杂了,咱们就不不说这么多了啊,那这个电磁波它是有什么的,是有频率的啊,是有频率的。OK那我们这儿所提到的这个二点四g实际上呢,就是什么?就是这个电磁波的频率啊,是这样的啊。ok好,那这个电磁波的频率呢从高到低能理解吧。不同的频段实际上呢是有不同的应用场景的,这个在国际上都是有规定的,它会有一个频谱表。比如说多少赫兹到多少赫兹的这一段频率,你只能用作军事,对吧?哎,多少到多少的这个频段,你只能用作这个工业啊,你只能用在医疗等等等等。你只能用在教育等等的,它实际上是有这样的一个频段的划分的,能能理解这个事儿吧。同学OK啊。好了,那完了之后呢,就是呃我们这二点四g呢其实就是一个呃国际上一个通用的,不需要申请的一个频段。就是你可以随便用。所以说正常情况下,我们的你像我们的蓝牙,我们的wifi基本上都是工作在二点四g的一个频段啊,是这么一回事儿啊。OK好,那到时候呢我们咱这个遥控跟无人机之间的这个通信呢,我们采用的也是二点四g的这个频道啊。OK到时候呢我我们写这个相关代码的时候,我再详细的给大家去介绍,就是这个这个无线通信啊,其实你现在同学可能并不知道,就是我这个呃电磁波是怎样去传出我这个数据的。比如说我这个一我怎么通过电磁波传出去,我这个零我怎么通过电磁波传出去这个事是不是大家现在没有概念呀,对吧?啊,这个到时候咱们在用的时候再说啊,呃总总之啊就是咱们现在搞清楚一个这样的问题就行了。我们遥控跟飞机之间需要进行无线通信。无线通信呢,我们用到一款芯片,它是可以实现什么二点四g无线信号的收发的,既能收也能发啊。那所以到时候咱们应该是怎么着呢?我们是不是遥控上边会有一个这个芯片用来发射数据,我的飞行器这边是不是也会有一个这样的芯片啊,对吧?是不是用来接收数据啊?是这么一个逻辑啊?OK好,这就是咱们呃遥控器这块的内容。那这样一来的话呢,我们整个项目或者说整个这个呃飞行器飞行器的一个组成就给大家介绍完毕了啊,就介绍完毕了啊。OK好,那稍微总结一下啊,这里边咱们一共有几个部分啊,稍微总结一下啊。呃,这里边我们一共聊到了有机架,还有咱的动力系统,是不是还有这个呃飞行器的这个电源系统啊,对吧?再有就是飞控系统,再有就是遥控器差不多就是这些。唉,ok这一点咱们先给它了解了啊。好了解完了之后,一会儿下节课呢再给大家先整体的说一下,就是我们这个项目的实现思路,整体的实现思路。就是这几个我们怎么去实现飞行姿态的稳定,怎么实现前后左右移动,怎么实现定高啊,把这件事儿再给大家说一说这个完了之后呢,再给大家介绍一下,就是咱这个项目的整体结构。我这画了两张图,唉,到时候通过这两张图呢给大家去说一下,说完之后咱们就开始动手去做这个项目了就行。我把这个视频停一下。
04-无人机-实现思路
cpp
复制代码
点啊呃来吧,各位。那现在我们简单的分析一下,就是这三个需求的实现思路。哎,怎么能保持飞行姿态的稳定,怎么能够控制前后移动,怎么能够保持固定的飞行高度,还需要把这些问题给它理解了啊,想明白来先说怎么保持这个飞行姿态的稳定吧。
大家现在应该已经有一个整体的是不是思路了呀,对吧?我们这儿其实整个呃去呃保持这个飞行姿态稳定的这个思路啊,其实整个是一个啥呢?是一个相当于是一个这叫什么呀?闭环控制系统,闭环控制系统,哎,或者叫做反馈控制系统啊,说白了具体就是怎么做呢?哎,咱家这么做啊,咱们都知道在稳定状态下啊,就是我保持水平,这就是一个稳定状态,对不对?好,那咱这个用来保护用来测量这个或者用来描述用来量化这个飞行姿态的指标,是不是那三个角度啊,对吧?好在稳定状态下呢,这三个角度俯仰角翻滚角,我飘横角,他们的期望值应该是多少,都应该是零才对,都应该是零才对啊,所以说要保持这个飞行姿态稳定。那咱们怎么做就行了呢?我们只需要用前面给大家提到的那个传感器,还记得吧?那个MPO六零五零,对不对?它是用来干啥的,是不是它是可以实时的去测量这个飞行姿态的呀,对吧?它能实时测得我这个欧拉角,对吧?
也就是咱这三个角啊。ok好了,那如果我们测得的这个角度是我们期望的角度不同,我们期望角度是不应该是零了,对吧?如果期望角度不同,那我我就怎么着呢?我就及时的去根据这个偏差来调整这四个电机的转速。唉,这样一来的话呢,是不是它就会达到咱们期望的角度啊,对吧?那达到期望角度之后呢,是不是我这个电机呃,就不再去调整了呀,对吧?那一会儿偏了再调偏了再调是不是应该是这样的一个一直在进行动态调整的一个过程。唉,这个原理其实很简单啊,就举个例子,比如啊同学呃,这边是我的机头啊。ok好,那我正常应该是这样的。那如果说我检测到,唉,我现在有一个俯仰角,这叫俯仰角,对吧?我寄头是面向大家的啊。好,这就是俯仰角嘛,对吧?好,有俯仰角了之后,你说咱这个系统应该怎样去调整这四个电机的转速的那是不是应该是让前两个加快后两个减慢呀,对吧?
哎,这样不就回来了吗?哎,它是不是应该是这么一个逻辑,对吧?这就是我们保持飞行姿态稳定的核心思路啊,这里边我们肯定会用到啥呀?会用到PID哎,肯定会用到PID啊。大家还记得PID有哪几个组成部分吗?三个部分对吧?一个是比例部分,一个是还有什么部分积分部分?还有一个是微分部分,对不对啊?OK好,积分微分,这个年代久远了,我们可能不知道啥意思了啊,你就就以最简单的比例部分,所以的比例部分是跟谁成比例的跟误差成正比,对吧?那这个事儿好理解啊,我偏的角度越大,那我调整这几个电机的力度是不是应该越大呀,对吧?我偏的越大,说明马上就要就就就就就掉下来了,我是不是得赶紧把它回回归啊,对吧?这时候你调整这个电机的力度就大。那如果我只偏一点点,那我是不是应该是怎么着呢?我是不是应该是轻微的调整这个电机的速速它就行呀,对对吧?应应是这么个逻辑辑啊,这就是PID的一个思想啊,到时候呢咱们再详细的说这个事啊。
好,核心思路就是PID哎,通过这个逻辑去保证它的飞行姿态的稳定啊。好,接下来往下走。第二一个就是怎样去控制它的前后左右移动啊,这个事儿就简单了,前后移动,那咱们应该怎么着呢?怎么做,前后移动怎么做?嗯,是不是只要让这个飞机,它有俯仰角,有俯仰角,也就是说白了俯仰角不为零,那是不是它就会进行前后移动。嗯,对不对?所以说我们到时候呢要想让它前后移动,只需要让这个呃PI让这个俯仰角维持在一个一个角度就行。比如说我们给它设置设置我的这个俯仰角的期望值。比如说是哎这么一个角度。哎,好了,那他就往前走了。哎,我设置它的俯仰角是这么一个角度,哎,那他是不是就往后走了呀,对不对?是不是就这么个逻辑?哎,同理同学啊,那要是左右移动呢,是不是调整横滚角的期望值啊?
我让它稳定在一个这样的横滚角,哎,它就往这边走了,稳定在一个这样的横滚角,哎,它就往这边走了,这是不是前后左右这个事儿咱们就妥了呀,对吧?
其实虽然说是前后移动,前后左右移动,但其实本质是不是一样的呀,对吧?就是你让它维持在一个倾斜角,它就走了。哎,就是这么个逻辑,它的控制非常简单的啊。行了,这就是咱前后左右的一个实现思路啊。当然然呢,你设设置这个个呃就是俯仰角或者横滚角的期望值的时候,你这个保持的稳定是不是依依然得稳定啊,对吧?就是你得让它稳定在这个角度,你不能这么震,对吧?哎,所以说这是同时工作的啊,就是上下的呃两个操作,这一点要注意这个稳定得一直稳定啊,稳定我我所谓的稳定啊,同学不是说让它这几个角度都是零啊,不是这才叫稳定。我所以在一个倾斜角度,这是不是也是稳定啊,对吧?哎,移动的时候,我说的稳定是不能来回抖,不能上下抖啊,这个一质是不是这个事儿?好,这一点呃,搞清楚,那当然静止静动动动状态,那咱们就是让它都是零了,基本上都是零了。
好,那接着往下走,呃,下一个就是稳定它的一个什么呀?飞行是不是高度啊,对吧?那飞行高度这个事儿怎么做呢?其实也很简单,也是一个闭环控制的一个思想,对吧?那我应该怎么着呢?通过我们前面讲的这个芯片,它是不是可以用来实时的测量飞行高度啊,对吧?OK好,那呃如果我们测得的高度与我期望的高度不同。比如我现在期望它定到一米。OK好,那这时候怎么着呢?它就实时测量这个高度嘛,如果超过一米了,呃,它就会降低这个电极的转速。如果低于一米,它就会提高这个电极的转速,是不是让它一直稳定在这个一米的一个高度啊,对吧?哎,就是这么一个思路啊,同学这就是咱们实现这三个需求的思路。其实你看啊整个思路核心核心其实就是PID吧,同学就是PID啊。
好了,那这个PID到时候怎么写,咱再说吧啊,这个就不多说了啊,这是实现思路,就给大家分析完了,来填一下。
05-无人机-项目结构
cpp
复制代码
人哎,好了,那为了大家好理解啊,我这块呢就是画了两张图啊,然后呢这两张图呢就把咱整个项目的结构给体现出来了。因为我们要写两个项目,对吧?一个是往飞控,上面烧的,一个是往遥控上面烧的对吧?我们先看飞控这个啊遥控这也点开吧。来,我们现在先把第一个放大,咱们一起来看一看双击。好这张图对,大家就看到了啊。呃,首先给大家看一眼,我们的主控芯片呢是不是SPM三二f幺零三c八t六啊,对吧?哎,好了,由于我们这块呢需要使用这个freeRQS对吧?那freeRTUS所有的freeRTS项目啊,它是是是都会会由多个什组组成啊,多个任务组成,对不对?那以大大家可看看到这这个非控状,我这个飞控这块呢我一共划分了这样的四个任务啊,分别是什么任务呢?一个是飞控US一个是飞控任务,这其实也是咱们这个整个飞控端的核心的两个任务。最重要的就是它俩了。其实你可以想象想象的到了其我这这个飞控这块就是要干啥?一个是接收遥控的信号,一个是控制电机的转速,是不是应该就是这么一个核心逻辑啊,对吧?哎,那所以说我这儿对应的就设计两个核心任务,一个是通讯任务,用于接收遥控的数据啊OK好,还有一个是非控任务,它用于什么呢?用于根据遥控的数据,以及我们的PID的计算等等等,去干啥去调整电机的转速。哎,这是这两个核心的任务的一个功能啊。好了,那完了之后,我们再来看一看,除此之外还有两个就是呃可以理解为,就是当然也不能说无关紧要吧,就是呃呃重要性没那么高的两个任务啊,一个是电源任务,还有一个是啥呢?灯控任务,我们先来了解一下这个电源任务的作用啊,我给大家解释一下。呃,前面给大家讲过,就是咱们这个整个的电源系统,咱这个使用的电源芯片是不是这个IP五三零五t啊,对吧?它是不是给那个充电宝用的,它有一个低功耗模式,它是不是只要我这个电流处在这个呃呃就是比如说低于它的那个阈值,比如说它应该是超过三十秒的,差不多超过三十秒之后,它会自动的进入低功耗模式就断电了啊。所以说这个对于我们这块来讲,其实不太合适了,对吧?所以我们这搞了一个啥呢?注意观察,我搞了一个电源任务,我这个任务呢定时去干啥?激活这个电源芯片,你不是三十秒,你就会断电吗?对吧?我每二十秒或我每十秒我就叫你一次,它是不是就不会断电了呀,对吧?也是这么一个思路啊。OK好了,那这个大家要注意。好,那除此之外,这个电源任务还要负责一个事负责什么事事呢?等待关机命令。大家想一想,我我们是不是遥控那块,刚才给大家说了,有一个关机的一个按键呀,对吧?只要遥控给咱们这边发过来的一个关机的一个信号。哎,好,那完了之后呢,我这个电源任务呢就要怎么着,哎,就要去干啥呀?这叫是不是就得去这个这个这个去关闭这个电源芯片啊,对吧?哎,大概是这么一个一个事儿啊,它主要做两件事儿,个是定期的激活电源芯片,一个是等待关键命令,实现遥控关机啊OK好,这是它的一个作用啊。行,那接下来我们再看右边这块啊,还有一个指示任务,这个就更简单了。这个灯控任务就是大家应该也看到了,我那个无人机机,你机机时时候不是上下呃,就就是它四个角上面是不是有有四个LE灯啊,对吧?
这个灯是干啥用的呢?没有任何的这个明确的规定,这个你可以自定义,你想让它代表什么就代表什么,对吧?所以我这儿呢就是把它作为指示灯了,我就把它作为指示灯了啊。好,然后这个指示灯我是这么划分的,咱们是不是前后呃,左右一共有四个灯啊,对吧?哎,OK好,那我这个前后这个事大家要搞清楚啊,就是咱这是不是有这个机头啊,前前也给大大家讲过机右是哪个灯吧?机头是咱那个天线那块啊,一定要搞清楚。哎,我这个摄像头出来了。哎,好,哎,这这这这是天线,对不对?哎,这咱得记头啊。好,前两个LED我这儿给它定义的功能是什么呢?我让它去显示,大家可以看一看,我让它去显示什么呢?遥控器的连接状态,只要我的遥控器连上了。ok你你可以自己定义啊,比如说我这儿我这儿的定义,只要是遥控器连上了,那我就怎么着,我就让它常亮,只要是遥控器断开了,我就让它怎么着我我就让你让它闪也行,你让它灭了也行。总之你能够根据它去看判断出来,我这个遥控器有没有连上,大家能理解这个道理吧啊,你随便定义怎么定义都行啊?好,然后我后边那两个灯呢,我让它显示什么呢?呃,我让它显示我这个飞机的飞行状态,我让它显示飞飞机的飞行状态,我给整个飞飞行器这块呢我定义了四个状态啊,大家可以看一看都有什么状态呢?有一个空闲状态,哎,什么是空闲状态呢?什么是空闲状态呢?就是我给这个谁,我给这个飞机通电了,我给飞机通电了,能理解事儿吧。同学,但是我这个遥控器呢还没连接上,那这个时候是不是处在空闲状态OK好,那当我这个遥控器连上了这个飞行器了OK那我们大家都知道,我这咱这个遥控器为了安全起见,是不是搞了一个什么东呀,是不是这这控解解锁呀,对吧?初始状态下,你这个遥控你你连上之后,你控制这个油门,是不是这个这个呃,电机也不转呀,对吧?你得解锁之后,是不是才转,这其实主要是处处于出于安全考虑嘛。如果说你要不做这个操作,举个例子啊,我要是没有解锁这个操作,我是不是?
假如举例子,我最开始我这个遥控器,我这个油门位于中间的位置。好,我只要一连上是不是立即就给你送送中间这个油门的数值了呀?
对吧你是不是只要一连上立马就飞了呀,这个比较危险啊,所以说咱这有一个解锁锁的操作啊?好,那我这个空闲状指指是是什么呢?指就就遥遥控器,不管控闲状了OK好,我以什么为准呢?只要遥控器没有解锁。好,那我的飞行器就处在空闲状态,这是我定义的空闲状态。这个大家能理。嗯,当然这个事儿自己怎么定都行啊,我是觉得这样比较合理解锁之前,飞行器处于空闲状态。好解锁之后,那飞行器呢我就会让它进入一个所谓的什么状态。normal正常工作状态。什么叫正常工作状态?这时候你给油门,我是不是就走了呀,对吧?
哎,OK这是它的正常工作状态,工作状态啊。OK好了,那完了之后,除此之外我们还有什么状态,我是不还有一个定义的一个状态啊,对吧?哎,我们是不是要实现一个定高的功能啊,对吧?哎,只要进行定高了。好,那它它就处在一个定高状态了啊OK好,那再往下呢,我还定义这个状态,就是故障状态。什么叫故障状态?举个例子,遥控器失联了,我这个飞行器,我这正飞着呢,你遥控器没电了,是不是有有可能出现这种情况啊,是不是就会出现一个所谓的故障状态啊?对不对?OK好了,那我一共定义了这样的四个状态啊。好,那完了之后呃,这四个不同的状态,大家一定要注意四个不同的状态。其实我这里边到时候你会发现咱们这个电机的转速的这个设置逻辑是不一样的。举个例子,以这个空闲状态为例,空闲状态下,我的飞机的转速一定得是什么?这个电机的转速一定得是啥?一定得是零,没错吧,同学正常工作状态下呢?那我这个飞机的转速主要是跟谁有关系,是不是跟油门有关系啊,对不对?那定高状态下呢,定高状态下是不是油门,咱们就不用手动的去控制来,应该是由PID是不是自己去计算呀,对吧?OK你会发现就是在不同状态下,我这个电机转速的这个控制逻辑其实也是不一样的啊。ok好好,那除此之外,这个当然这个逻辑比较复杂,我们先不管,我们现在先先管这个呃就是灯控任务啊OK好,那所以说呢我这儿呢呃也定义了,这个就是两个LED啊,我这个相当于是这个呃飞机机尾巴俩俩呗,对吧?刚才机头这是机尾啊,是不这俩LED用来显示我这个飞机的飞行状态啊OK那当然你这个具体怎么去显示也可以自己定义。
比如说我这儿爱豆状态,我就让它以比较低的频率进行闪烁空闲嘛,对吧?悠然自得慢慢闪,对不对?OK好,那如果是正常状态呢,我就让它以一个高频的这样的一个呃频率去闪烁一解锁之后是不是立马变成高频闪烁了呀,对吧?OK好,现在开始工作了,紧张起来了啊,比较闪的比较快嘛,对吧?就这个意思啊。好,然后再有呢就是定高状态,我这个定高状态呢定高定高应该是一个固定的对吧?所以我这儿呢就让它怎么着呢?比如说我让它常亮,哎,这个就是一个定高状态了,对不对?哎,OK好,那出现故障之后呢,有有问题了,我就让它灭了。哎,这是不是表示的是有故障了呀,对吧?哎,大概就是这务四五当人怎么做都行,你这个状态自己定义啊。OK好,那这就是咱们这个灯控任务,它的功能啊,灯控任务的一个功能啊。好了,同学,那这实际上呢就是我们整个非控端的这样的四个任务,它们的核心逻辑。
我再给大家简单的梳理一下啊。首先通信任务它的作用就是干啥?就是接收,是不是遥控端发来的数据啊,对吧?那它需要通过谁接收的同学是不通过咱前面讲到的那个二点四g通信的那个芯片呀,对吧?还需要通过它去接收,那接收过来之后呢,那他需要对这个数据进行一些处理。比如说我要解析数据,对不对?哎,我要去呃校验数据等等等等,还需要做这样的一些一系列的操作啊。好,那这个操作完成之后呢,那我们后边的飞控任务,它需要干啥呢?它是不是需要根据通讯任务接收过来的这个遥控数据去调整咱们这个电极的这个转速啊,对吧?对不对?那我们那边呃就是遥控会给咱们这个飞行器发发发什么数据呢?油门的数据是不是定高的数据关机的数据,这些是不是肯定会有啊,对吧?除此之外,其实我们遥控器还会给咱们下发这样的几个指令,什么指令呢?一个是调整俯仰角的,我的期望俯仰角。一个是期望横滚角。一个是期望偏航角,其实这个事儿大家能不能想明白呀?这个期望的这几个角度,实际上就是在调整什么?是不是在调整我们那个前后左右还有旋转呀?这个能不能想明白来给大家分析一下啊,我前面是不是给大家看过我给这个遥控器定义的这几个功能,我们往上翻找到遥控器,我是不是定义了这样的几个功能啊,前后左右,然后还有旋转,没错吧。同学实际上啊,我们前面讲过,我怎样去控制咱们这个无人机前后左右还有旋转,是不是就是设置它那几个角度的期望值啊,对吧?能理解吧,比如说我前进,我是不是就应该把它的呃呃这叫俯仰角的期望值,是不是给它设置一下,对吧?后退是不是也是设置俯仰角的期望值啊,对吧?所以说本质上啊我们这个摇杆的前后左右,实际上就是在给它设置什么呢?是不是设置那个横前后设置是在设置横滚角的,期望值左右,是在设置横滚角的这个期望值,对不对?然后呢,这个旋转呢是不是在设置那个所谓的偏航角的期望值啊?哎其实说白了就是这么一回事儿嘛。哎,ok好,这就是咱们那个遥控器给这边给咱们飞行器发数据的时候,发的这几个数据啊,其实一共有这样的六项啊,有油门有定高的信号,有关机的信号,还有你期望的这三个角度的信号。哎,就是通过这些东西来控制咱们这个无人机吧,就这么一回事啊。好,那当我们的这个呃通信任务收到这些数据之后呢,那我们的飞控任务是不是就会根据这些数据来调整。咱们这个啥呀,调整是不是这个无人机的这四个电机的转速啊,没错吧,当然需要注意的一点就是调整电机转速的时候,不可能只根据你遥控发过来的数据,哎,它还需要进行什么呀?比如说我现在要保持飞行姿态的稳定,我是不是得根据你这个姿态的误差,对吧?用误差再去反馈到我们这个电机的转速上啊,对吧?是不是也需要考虑在内。那再比如说我现在实现定高的时候,我是不是还要去测量飞行高度啊,对吧?我再根据飞行高度的误差,是不是也反馈到这个电机的转速差啊,对吧?所以最终最终啊就是咱们这边这个飞控任务啊,去调整这个电机转速的时候,它需要考虑很多的因素啊,都有什么因素呢?
一个就是遥控的数据。第二一个就是我们计算的这两个PID的值。那再有呢就是啥呢?飞机状态,你比如举例子,飞机状态处于空闲的时候,你这个遥控你爱发啥发啥?我是不是要速度都应该是啥,都应该是零才对对吧?它需要综合考虑多方面的因素,就是这个逻辑到时候写的时候还是有点复杂的这个代码啊。好,这一点大家稍微的先体会一下就行啊,先不用过多的去管理,这个不不用过多的深究啊。行,这是飞控任务,做事事,根据多方的因素呃,去综合的去设置电机的转速。哎,这是它的作用啊。好,然后再有呢就是咱这个电源任务了,它主要是干两件事,它主要是负责跟这个电源芯片进行通信嘛,对吧?一个是定期的唤醒它。还有一个呢是处理这个关机的命令啊OK这是它的事儿,然后根控任务呢就简单了,然是根据俩事儿啊,一个是根据遥控的状态去设置前两个LED的一个状态,对吧?你连上了,我就常亮断开了,我就灭了。OK好,然后还有两个呢是用来设置咱这个飞机的一个状态的对吧?飞机状态我定义了四个状态,哎,空闲状态正常工作还有定高,还有这个呃故障模式啊OK好了,那这一点大家估意就行了。
那其实现在可以问一下大家啊,就是举个例子,举个例子啊,当飞机处于故障状态的时候,咱应该怎样去控制我这个电机的转速呢?就以我刚才为例,飞机正飞着呢,正飞着呢,我现在呢遥控没电了,没电了,是不是?就是说别说白了,飞机处于一个失联的一个故障状态,对吧?你这时候电机转速,你应该怎么调整,慢慢的是不是降为零啊?对吧是不是应该大概是这么一个思路啊,对吧?哎,就是说呃其实就是还是想想想给大家说明啥呢?就是你这个飞机的这个就是电机的转速,需要根据这个状态去进行相应的设置啊呃综合考虑多方面的因素啊,就就这么多。呃,这就是咱这个非控端的这个整个项目的一个差不多的一个项目的一个结构吧。呃,但是现在有没有一个整体的思路啊,有一个整体思路就行,不用太抠细节,你现在抠也没法抠啊,咱们必须得慢慢来啊。呃,有一个整体思路就行,你知道每个任务大体是干啥的就行,他接收数据。哎,他根据接收的数据和PID去干啥去设置电机的转速。这个呢控制这个电源芯片这个控制LED啊,那他们之间是怎么配合协作的,我们到时候再再说啊。行了,那这个就就过了啊,同学这是咱这个非控端的项目结构。接下来呢我们再去看一看,就是遥控端。遥控端呢相对来讲要简单一点,来吧,咱看一看。遥控端呢,我这儿一共定义了,这是几个任务,这是五个任务,同学五个任务。其实大家可以想象一下啊,就是你不看这个东西,你就自己想,你说这个遥控端它他做的事儿应该是什么?它的主线应该是什么主线,是不是就是根据啥?根据你的输入,你的输入体现在什么地方呢?摇杆,这是不是咱们的输入啊,对不对?然后还有呢就是按键,这是也也是我们的书啊,对吧?根据我们的输入去收集数据,把数据收集到之后,通过那个无线通信的芯片是不是发给呃飞机就完事了呀?这是他工作的一个主线啊,所以这块儿咱们一共划分了几个任务呢,一共是五个给大家来看一看核心任务,其实还是这三个吧,这是它的核心任务啊。好,我们先看第一个,第一个是一个摇杆扫描任务,它需要实时的去扫描咱们这个摇杆啊,这个摇杆前面讲过,其实它底层本质上就是啥呀?呃,是不是就是滑动变阻器啊,对吧?那所以说我们是不是通过AEC去采集这个摇杆的数据就行,对不对?OK好了,这个一点大家注意好,第二一个就是啥呢?按键按键,我是不是也得实时扫描啊,对不对?
这是俩任务啊,一个扫描摇杆,一个扫描按键啊。好了,那扫描完之后呢,需要把数据呢是不是做一个简单的封装,那封不任务务通通过通通过咱们这个通信任务,通信任务是不是往外发数据啊,对吧?它通过哪个芯片是不是SI二四r一的个芯芯片往外发送就行了呀,这通过个边收啊,就这么个逻辑啊。好,那除此之外呢,我们还有两个额外的任务啊,一个是电源任务。这个电源任务呢,其实说白了跟我们是不是非控端那边起到的作用是一样的呀?是不是就是定时的去激活咱们这个显源芯片不让它自己进入待机嘛,对不对?这是一个,然后还有一个就是这个显示任务,显示任务是用来干啥的呢?咱是不是有一块小屏幕啊,对吧?它用来显示我们当前的油门值啊呃俯仰角啊偏航角啊,还有恒温角啊,用来实时的显示这个东西就是里边有个进度条,大家呢也都看到了,对吧?哎,这是咱们遥控端的这样的几个任务呃,现在大家对遥控端是不是也应该有一个整体的认识了吧?哎,大概就是这样啊,行了,那我把这个视频。
06-无人机-飞控项目-创建
cpp
复制代码
哎,好了,各位,那接下来呢我们就正式开始去实现咱这个无人机的项目了啊呃我们从这个飞控项目开始啊,飞控项目开始。
呃,首先我们需要先创建一个项目,对吧?啊,创建完这个项目之后,咱们还需要做什么操作呀?
啊,对,我们得先集成是不是freertos没错吧,各位啊,好,那所以接下来呢咱们这样我们去先创建一个新的项目,然后呢去集成freeRMS啊,好,那这边我们打开QBMS我们先生成一个项目啊,大家稍等一下有点慢啊,这回答这个项目咱就从零开始做吧,我就不给大家提供这个项目的模板了啊。哎首先我们找到咱们的CPU呃MCU稍等。
呃,这边我收藏了一下啊,咱找到是不是STM三二f幺零三c八t六,这款芯片就可以了呀,对吧?呃,实际上你看啊就是你点到这个芯片之后,它上边是不是有一个features啊,对吧?是不是有功能的意思,就是这块呢就会给你介绍咱们当前的这款芯片,它是不是各种参数啊,对吧?你看这是不是都写了呀,对吧吧?这个我们可以看一看这啊。行,那我这儿就不看了。那这个我完了之后直接双击,然后呢把这个项目给它创建出来,大家稍等。哎,好,那完了之后呢,我们先去做一些最基础的配置啊。首先我们进到系统配置,然后呢我们去配置一下它的这个featusys呃debug这块呢,我们选择这个是不是呃serial威尔这个就可以了呀,对吧?好,这个完了之后呢,我们需要去配置一些和时钟相关的啊。好,这个我们选择外部精震,这个也是外部精阵啊。好,那除此之外呢,我们是不是还得去配置一下这个时钟数啊,对吧?来我们进到clockconsideration啊,那这块呢我们需要改哪些东西啊?呃,首先这个我们这儿是不是应该选择外部,是不是高速时钟啊,对吧?哎,我们点这个啊好,完了之后,这个倍频我们这来来个个位频频,这个大家应该是不是已经很熟呀,对吧?这块我们需要来一个二分频。哎,好,保证我们这些外设是不是都达到了最高这个时钟啊,对吧?哎,行了,那这样一来咱就相当于配好了这个时钟数了啊。行,这个完了之后呢,我们需回这这的啊,呃大家想想我们还需要去配置哪些东西,这个基础配置是不是配这些就完事儿了呀,对吧?
哎,好,那接下来我们是不是还得考虑一下,我们接下来要要做的一个事,咱们接来要干啥来着?同学是不是要集成福瑞RQS那集成福瑞RQS我们需要做哪些配置?关于福瑞RA我们之前咱们集成的时候,咱们做了哪些操作?我们配了一下什么东西来着,是不改了一下那个谁是不是改一下咱们这个timebasesource啊,这个是不是这个是给谁,这是给号库去配置他的那个是不是时机啊,对不对?ok好,那号库默认用的是不是sysstick?那我们前面讲过,你在集成了freeRQS之后,最好把这个sysstick让给谁同学,是不是最好把它让给福瑞RQS设备吧。OK好,所以之前咱们是选了一个另外的定时器啊。好,但是这儿呢需要给大家说明一下,这个其实比较难受的一点是啥呢?
咱们当前选的这款芯片只有几个定时器,只有四个定时器啊,这四个定时器,我们将来都得用它干啥东西?对,是不是都得用它生成PWM波去驱动咱电机啊,我们电机是不是正好是四个四个正好会用,是不是它这四个定时器啊,对不对?所以咱就不能不能怎么着呢,不能用这个定时器去作为号库的时机了。所以号库的时机,咱还是得让他用谁CTC也就是说我们这回得让freertos跟这个号库里边的sistetic是不是呃,号库里边跟跟号库是不是共用一个CTtic呀,对吧?只能是这么做了啊,只能这么做了,这么做有没有问题呢?其实影响不大啊,为啥大家回顾一下号库啊,他用这个CTC中断,只做了一个什么事儿?大家有没有看过它里边那个中断呀,它是不是只是对对谁对那个tig值做一个加一的操作呀?所以它其实很快是不有能执行完。所以他对freeRUS的这个时机来讲,其实影响也不大啊,所以咱也能这么用啊,这一点大家注意就行了,让他俩共用CST吧啊,行了,这一点要注意啊,当然你要是有额外的多余的这个定时器,那最好还是把它让出来。但是这会儿咱没多余的,就只能这么着了啊,所以这个咱就不用改的同学啊。那也就是说我们目前的这个基础配置是不是就配完了呀,对吧?呃呃,当当然还有一点,还有一点,咱们需要考虑串口,咱们配一下的。呃,为啥?因为我们将来在写项目的时候,是不是经常需要去做调试啊,对吧?串口肯定得配啊,那我们这个配谁呢?这个咱得去看一下原理图的同学得看一看,我们这儿用的到底是串口一串口二还是串口三,对不对?咱们得看一眼啊,来我们找到课程资料里边的原理图啊,原理图我们这儿先看这个飞控原理图,飞控飞控指的是飞行控制,指的是咱们无人机这一段啊,来咱们找一找这个我们这儿调试的时候,用的是哪一个这个呃哪一个这个串口啊,咱们找一下,我们就看第一页就行。同学第一页,我们看哪儿咱们看这儿注意观察。同学这个是不是就是我们那个STlink那个插头啊,对不对?这个插头里边是不是既有我们用来烧录数据的这两根信号线也有用呃,这这是烧录,这是烧录程序的吧,对不对?这两个是干啥?是我们进行,是不是这个创口通信的呀,对吧?OK好,那所以说咱这用的是是二是二啊,所所意这块用的是二啊,所以这边呢咱们要开的话,得开二,这个大家一定要注意一下啊,来我们拿过来找到UA呃USCRT那这边我们是不是直接来一个异步就行了呀,对吧?其他的东西我们这呢就不需要去做额外的配置了啊。你像它的这个波特率啊,呃包括它的这个就是校验位啊等等的,停止位,这些东西咱们都用默认值就行了。首然后波特率呢是幺幺五二零零行,那这个相当于我们这个基础的配置,就算是配置完毕了。
开完了之后呢,我们先来进到projectmanager里边,我们做一些呃其他的简简单配置啊。首先呢我先去设置一下我这个项目的地址,这个地址。当然你愿意放哪放哪儿?我这儿呢又给他新创建的一个地址啊,我往前翻的是啊呃不用在这儿,呃,不是错了,我们进到三二三二里边,这儿是不是有一个我新建了一个product,对吧?我就放在这个product里头啊,在这里打开。那打开之后呢,我们再给这个项目起一个名字,咱一共是不是有两个项目啊,对吧?这个是飞控飞行控制,所以我这个呢就叫做FLIGHD是不是就是flight的意思啊,对吧?flightcontrol嘛,对吧?飞行控制,然后另外一个到时候咱们叫做remoteremote,是不是遥控的意思啊,对不对?都行无所谓啊,大家自己起名字就行。好,这个搞定这个搞定之后,哪还需要去改一下同学呃,是不是这个工具链IDE咱们得改一下,对吧?我们需要给它改成FDK啊。嗯,好,那接下来我们还得去改一下什么东西,这里边东西是不是就不用再改了呀,对不对啊?OK好,那当然大家这块儿你要是没升级的话,你这个用自己那就呃用自己那就行,呃,用自己那就行,或者到时候升级一下,我这用最新吧。啊。好,那接下来我们进到这个codegenerator呃,这里边呢我们需要勾两个选项,对吧?一个是咱们只要是不是必要的这个库文件啊,对吧?
然后再有一个呢是啥,我们把这个头文件跟原文件给它分开。因为我们是不是我们在自己有些这个自己的,有些这个原文件里,咱们需要用啥,是不需需要用到这个库库这个一些函数啊,或者者定定义啊,对吧?
那所以我们需要引它的东西啊,对吧?你必须得让他把他的头文件跟原文件分开,方便我们引嘛,对吧?能列解这个事吧。同学哎,好,这就是咱这块儿的一些配置,其他的就不用再配了。那进来呢我们点一下这个generatecode,大家稍等一下。呃,然后我这块开发的时候呢,我还是使用咱那那EEIEE啊,还是使用那个插件。呃,但是那个插件呢大家一定要注意啊,虽然虽然那个插件是可以独立的去配置咱们这个呃什么一些这个参数了,对吧?
比如说呃我的那个使用那个微库microlive,对吧?啊,比如说我去配置这个优化级别等等等这些参数它是不是可以配置啊,对吧?呃,但是啊但是我们这个项目刚创建完之后,我们还是要先怎么着呢?先使用kill去打开一下这个项目,需要用它去打开一下这个项目。因为打开的时候呢,这个q会做一些初初始化的配置,比说生成一些些什么启文文件乱七八糟的东西,一定要让他去做这个事儿。做完这个事儿之后呢,我们再把这个项目关闭,你再用EIDE导入再配置,能理解这个事吧。同学一定要注意啊,一定要打开一下啊。好了,那这个我就打开了。当然大家你用之前的killassistant去去去写,也没有任何问题啊,都行啊。行,那这个我就可以给他关了,对吧?好,关了啊,关了之后,接下来呢我们再打开这个e呃,这个VScodeVSCODE呃,我们打开大家稍等打开之后呢,我们是不是就可以进入到EIDE。然后这块是不是有一个导入项目啊,对吧?哎,我们导入导注意一定是导入,不是打开啊导入项目,然后我们选择MDK啊之后呢找一下我刚刚创建的项目啊,三二这里边应该是有一个是不是project呀,对吧?我们找一下啊,在这儿呃,完了之后,这是我们刚刚创建的一个项目,对吧?然后点进来,点进来之后,找到MDKarm,找到它的这个呃kill的项目文件啊,点它点完之后点击import。
好。这个时候他问我是否呃放在同一目录下,我们应该选no啊,选no,完了之后选谁选上一级目录选,这个是不是flight呀?对吧?好之后呢,我们点击selight。好,这个时候点击初换工作区。那现在我们就来到了咱当前的这个位置了啊。好,来到了之后呢,我们先先编译一下,看能不能编译过啊呃,先做初始配置,先做出位置。首先构建配置不是AC五啊,对吧?稍录配置我们选择STlink啊。好,那完了,这个点击不要啊,然后我们先编译下,看能不不编过过过过话就说明下们们个初始始目就已经完成成了,这个是是是没问增家同学。哎,好了,项目的初始化,咱就做完了,我停一下视频啊。
07-无人机-飞控项目-初始化配置-重定向printf
cpp
复制代码
哎,好了,各位同学。那接下来呢我们一起去呃实现一下,就是咱们这个项目的初始化操作。呃,第一个就是配置pringf第二一个呢就是集成frard好,那我们现在呢先来完成第一项吧,我们先呃配置一下printf的重定项,那这个我们需要用到谁,是不是需要一下译器提供的这个维护啊,对吧?呃,我这一块呢直接在这个preIDE里配就行了啊,点击构建器先先先找构建配置,然后下边有一个构建器选项,对吧?找它之后呢,点一下,点完之后呃,这个全局选项里是不是有一个usemicrellib啊,对吧?我们点一下这个就行了。哎,这个随定点保保存啊,不不保存,bos不成效。行了,这个就搞定了,搞定之后,接下来呢我们需要去配置一下,是不是那个FFRC函数啊,对吧?来这个随便找地方写一下就行,我们找到谁呃,咱就找到。call。完了之后呢,找到SRC,然后呢找到是不是USRT就行了,对吧?哎,之后呢,我们在这里边去配置一下啊。呃,那首先我们先来一个是不得我们得得引入一个头文件吧,对吧?include一下,谁应该是STDIO点h吧,对吧?哎,你给它放在这儿啊。好,接下来我们来到对比一下吧,咱在这个位置去写一下这个f库兹z函数啊,应该是int后边跟成一个啥fputc嘛,对不对?OK咱们让它给自动提示吧。那应该就是这样的,我们看有没有问题啊。FC然后俩参数一个是ins类型的。CH表示你要发送的字符,还有一个是fail类型的一个指针。对不对?其实这个指针我们在这没用到嘛。好,接着往下走哦,选speit注意我们应该用USART二,对吧?哎,好,那完了之后呢呢转一下这个类型型后后,这个是发送的那个长度嘛,我们就一个这个是等待的时长,这个无所谓的。哎,行,那没问题吧,是你写的。哎,行了啊,那这样一来的话呢,我们就已经完成了这个所谓的这个初始化了啊。呃这完完之之后,其实以以一一测测,你就在那个慢方法那边打印一句话,看能不能打印出来就行了,对吧?我这这应该没没啥问题啊,我就先不测了,一会儿咱预测吧。这是第一第一个初始化的操作,咱们就做完了。紧接着我们要做的是不是就是集成RRQS啊,对吧?这个单独录一段。
08-无人机-飞控项目-初始化配置-集成FreeRTOS
cpp
复制代码
对啊,这个完了之后,我们接下来呢要做的就是集成福瑞RQS了。这个集成呢呃咱们就直接把原来的这个项目里边的这个内容是不是往这里边一复制就行了呀,对吧?咱们就不用再一个一个去删了,能能理解这块吧。同学哎,好了,那咱们去找一下啊,因为我们用的都是同样的这个平台嘛。呃,所以这边呢我需要先打开一个咱之前的福瑞RQS的项目,这个就随便打开一个就行,这个行不行?行吧?哎,这个就可以啊,或者说我们打开最原始的那个吧,咱们找最开始那个啊,大家稍等一下,我找到呃这个福瑞RQS好,我们打最开始那个完了之后呢,我们把这个打开好,打开之后呢,咱们需要做哪些操作,同学回顾一下,咱们需要做哪些操作,集成符rar来,咱自己需要做哪些操作。首先第一个源码是不是得放进来,这个没啥可说的啊。第二一个呢,大家干啥?第二一个要干啥?是不是需要去配置一下咱们那三个中断服务程序,这个大家记不记得对吧?OK好了,那还有一个是什么事来着,是不是还有一个配置文件呀?是不是就是那个free?RRSS这个点以上是不是就这三件事儿,对吧?所以接下来呢,我还是把这三件事做一下啊,来吧。那现在呢我们先去把这个MID哎,直接整个就给它拷贝过去啊,这会儿我看能不能直接复制啊。咱直接右键,嗯,要不就这么复制吧。呃,我们哎应该是在MID吧,我们直接在这儿复制MIDcontrolc复制。复制完了之后,回到我们刚才这个flight项目里面,完了之后,找到项目的根目录,直接controlv是不是就行了?同学我们粘贴好,但是大家要注意粘贴进来之后呢,我们得配什么东西来着,是不是得配原文件以及includepass这个路径啊,对吧?哎,OK好,那接下来咱们去配一下啊呃在EID里边配起来相对比简单,我们直接找到项目资源。完了之后,这儿是不是有一个添加源文件夹呀,对吧?直接整个文件夹给它放进去,找到普通文件夹。完了之后呢,找到MID点击添加源文件夹到项目。好,由于我前面是不是配了一个参数,是自动在源文件夹里边去搜索includepass吧,对不对?所以现在我的inclucludepass应该也已经配好了,我们找一下啊呃找到包含目录。然后呢,我们点击这个查看按钮,看有没有MID类型是不是已经有了呀,对吧?那一定要确保它没问题啊。行了,那这个就搞定了省事啊。行了,第一件事儿,咱们做完了,源码已经放进来了啊。那接下来呢我们考虑第二件事应该就是啥了,配置中断,对不对啊,配置中断我们是不是需要在那个配置文件里边培养,对吧?所以我们先去拿配置文件啊,哎拿过来我们找到扣找到NC找到它就还放在这儿吧。controlc那现在这个就可以关掉了啊,然后呢找到这边找到INCcontrolv给它关进来。好,这个include的pass,咱们还用不用再加同学不用了吧。因为这个IC本身是不是就在项目初始的啊,includepass里边啊,对吧?所以这个不用再不用再配其他东西了。行了,那这个咱就有了呗。呃,有了之后,那接下来咱们要做的工作啊,就是对这个文件做一些初始化的配置了。呃,这个配置一定要注意一下啊,两件事儿,一个是咱们前面提到的,是不是这几个中断呀,对吧?这是一个咱们一会儿来说,还有一个事需要额外注意一下啥呢?这个东西咱可以注意一下东西。这个参数哪个函数呃,这个这个参数这个一定要注意一下同学啊,这个参数它的作用还是啥?大家大家还记得不?这个是不是分配给福瑞RTOS那个堆空间的一个大小啊,对不对?但是大家要注意啊,就是咱原来那款芯片啊,因为咱们那个整个的SSram,它的这个空间是多少短少?
六十四KB对不对?所以六十四KB你给它分十七KB这个没啥问题,对吧?那咱现在用的这款一共共才多多少东学,不不才二十KB对吧?所以占空间给这么大有点多了。所以这边咱们稍微的调整一下啊,我们不要给这么大,我们比如说改成十二差不多啊,应该就行了啊,这一定要稍微注意啊,当然啊你这给的够不够这个事儿,你怎么看出来呢?你是不是可以通过我们前面给大家介绍的那API去打印它历史上是不是最小的剩余空间呀,对吧?哎,这个咱们呃经过测试,这个是比较合适的啊,这样就行啊。行,这个稍微就注意一下,这个大家一会儿自己呃这个往里边去集成的时候也要记得改一下啊。行,这个改完之后,接下来要做的事呢,是不是就是处理这几个中断了呀,对吧?然后给大家说一下啊,这个中断我们这次就不用这种方式了。因为你用这用这种方式去处理他是不是会怎么着来着?同学每次重新通过QBMS生成代码,他都要干啥?是不是都会再重新生成这个号库的这两个终端服务程序啊?嗯那我们每次都要给它注掉太麻烦了。所以这次咱们不用这种方式了,我们怎么着呢?
同学咱怎么着啊?咱们直接是不是把福瑞RQS提供的这两个中断的源码,直接拷到号库的这个两个终断服务程序里边来啊,你这样做就不用每次都重新的去呃,改这个中断了。这个大家注意一下就行了啊,行了,那所以这俩是不是咱就不需要了,这红咱就不要了吧,同学那就不要了啊。OK好,但是谁还得留留着呢?这个是不是得留着呀,对吧?这是用来干啥的,是不是获取调度器状态呀,对吧?是不是在哪儿?在咱们那个呃CSTC终端里边,它是不是会往调一个获取当前调度器状态的一个逻辑。调度器起了之后,它是不是才会去做这个上下文切换的一个判断呀,对吧?哎,这一定要注意啊,所以这个咱得留着行。那接下来呢我们就回到CC回对靠,然后呢找到谁呃,SRCSRC里边是不是有个II点c呀,对吧?我们得在这里边去做这个相应的处理啊,相应的处理。好,我们先处理这个CSTC终端吧,来往下翻,往下翻,找到CSTC终端CSTC终端注意观察。你看这次里边是不是它有一个howINCTK呀,对吧?那它俩影响吗?同学啊,不影响,你看就是人家这边是不是只做了一个这么这么简单的一个操作呀,对吧?所以它对我们这个freeRTS这个时间影响其实很很微弱啊。所以咱它俩共用一个CSTC也没啥太大的问题,也能行啊,也能行。好,那接来呢我们去复制一下之前那几段代码啊,这个咱不自己讲复制一下吧。找到原来的项目,找到SRC找到IT点c你就往下翻找CStick,对吧?找CStick,我们看看在哪呢?是不是这段代码,咱给它拿过来就行了,对不对?controlc拿过来,完了之后呢,我们给它放在这个位置。好,那现在是不是就ok了同学?哎,好了,发来之后需要注意的一点就是这个函数虽然咱们能用了,但是但谁用不了同学,但是但是这个是不是没有啊?
这明显是人家定义的一个红吧。大家还记得它定义在哪吗?呃,是不是定义在了task点h里边啊,对吧?哎,所以说你需要引入一下人那个头文件啊,来我们往上翻,往上翻,找到你自己添加引入文件的位置,应该在这儿,对吧?我们来一个include,后边我们需要来一个task点h,但是task点h是不是要求你前边必须得引入谁来着?福瑞RTYS点h吧,对吧?所以这边呢我们还来一个哎,福瑞RTYS点h,咱是不是把它俩引过来就可以了呀,对不对?好,引过来之后,咱这样,我们先编译一下,看它有没有问题啊,来先编一下。好,编译完之后你会发现啊,就是能过,但是这有一个警告,对吧?哪个警告告是不是咱这儿调用了福瑞RTOS的是不是这个函数啊,对吧?
那这个函数它是不是呃它的那个函数的原型并没有在我们引入的这个头文件里边,声明了,它是在一个c文件里边写的了,所以我们这是不是得一突然一下那个函数啊,对吧?哎,这一点大家注意一下就行了啊。好,那现在咱们就去找一下呗,把那个函数在哪儿?呃,也就是它呗,对吧?你要是想找的话,你要不想复制,你要想直接找你,就在这全去搜索就行,对吧?你在这搜索就能搜到啊,这是在哪儿?是在呃,点roc里,对吧?你看它是在这儿啊,所以在这儿我们直接怎么着把这个controlc复制一下,完了之后呢,回到咱们IT点c里,对不对?随便找个地方啊,我们当然也别随便了,我们严稍微严谨一点,我们放在哪儿?这是不是放在你自己的这个函数原型这块啊啊,对吧?再放在这儿。那这边我们来一个啥ESTRN不是就完事了。同学哎,好了,那这回你再去进行这个编译,那它应该就没啥问题了。好,是不是警告就已经没有了呀,对不对?好了,那cstect中断我们到此为止,是不是就算是处理完了同学?哎,好了,那接下来咱们要做的是不是得去处理那两个一个penSV一个SVC对不对?哎,好了,那接下来咱们就开始处理啊,说了,这回咱们不用那种宏替换的方式了,我们直接拷贝源码啊。OK好,那接下来咱们找一找,看看怎么去拷贝呀。呃,一个一来啊,我们先找到谁同学,这个是penSV对不对?那我们先处理penSV啊penSV它的那个源码里边的实现也在哪放着,是不是也在点pocc对吧?你要是找不着的话,你就还是按照照我刚才那个思路,这是是是它原码里边提供的那个实现的函数名啊。对吧你直接CTRLC把这个全局搜索一下就行了啊。好,那我这儿的知道在哪,咱就不不费事了啊。好,他们,你看是是不就是它那三个红的定义啊,接吧,直接放一一块放一块了啊,接下来我就就接ccontrolccontrolf在当前文件里搜一下,点一下下,那是不是就跳到它这个位置来了,对不对?所以接下来咱们要做的工作应该是啥?是不是就是把人家这里边的这部分源码直接controlc原封不动的拿过来,对吧?放到哪儿?放到咱们IT点c里边的是不是碰的SV在那里啊,咱放这儿是不是就就行了?同学没问题吧,哎,注意啊,看觉是二位放下来了,是不是就放进来了?放进来之后需要注意的一点,就是我们是不是还得给这个函数加一个前缀,因为这是用汇编写的对吧?所以我们回过来把这个下划线,haSM给它拿过来,放在哪儿?咱给它放在哎,control放在这儿,是不是就行了呀?没问题吧,同学哎,好了啊。那这样一来我们就呃完成了这一部分这个呃这个终端的处理了。pendSVcandler,哎,好了,那接下来你要是不放心的话,你就再编一下,看能不能过,是不是能过呀,对吧?能过就行啊。好了,这个完了之后,接下来我们再去处理另外一个,另外一个是谁来着?呃,是那个SVChandler对吧?我们退一下,退一下,退一下,找到那个SVC呃,在应该在上面在这儿,这是不就是那个SVC的那个函数的原型啊,对吧?CTRLF啊controlc,然后往下走。哎,那接下来呢我们再把这段代码呢也给它CTRLC拿过来啊,拿来之后呢放到IT里边找到咱的SVChandler,是不是?也就是它呀,对吧?咱给它放到这里。哎,那当然同理我们它前面也得加上一个谁,因为它也是汇编嘛,对吧?ASMAsembody的一个简写啊,放在这儿好了。那这样一来的话,我们是不是就完成了这个中断的处理了呀,对吧?也就是至此,我们就已经做完了咱们这个项目的福瑞RQS的集成了。哎,搞定行。那对大家对刚才这个集成的这个流程应该呃挺熟悉的吧。哎,唯一的跟之前不一样的,就是咱这儿这两个中断的处理跟之前不太一样,主要是为了方便省得以后,每次都去处理这两个啊。好呃,行,那这个完事儿啊,把这个视频停一下。
09-无人机-飞控项目-初始化配置-测试
cpp
复制代码
刚开始好,接下来我们去快速的做一下这个测试。看我们刚才这个初始化工作有没有问题啊,有问题,咱们及时解决呃,这个测试呢,咱就直接在慢点c里吧。我们进到SRC进到慢点,c咱们在这块呢做一个快速的测试就行。嗯,来吧,那开始我们进到慢方法,对吧?
嗯,法这边呢咱们怎么做呀?呃,往下方往前看,这是外部循环,咱们就不在well里边了啊,咱们直接在这儿去做测试就行,对吧?啊,来我们做一个呃初始化测试啊。好,那这边我测试的思路呢就是创建一个任务,freefrees里边任务啊,完了之定,那让它实时的去干啥实时的通过串口打印数据就行啊,如果能收到,就说明没问题啊。好,现在开始那使用freeRQS创建任务,那我是不是得引入free瑞RQS的头文件啊,对吧?所以说我们需要在这个位置,我们in可u的一个呃freeRQS点h还得在in可路的一个是不是pass的点h啊,对吧?好,这个搞定啊搞定之后,接下来呢我们在这边就开始了。呃,我这儿呢就不再做封装了,我这儿直接我就怎么着,我直接就x后边跟成一个task,后边跟成一个啥,是不是create就行了,对吧?然后里边是不是需要传入很多的内容,对吧?一共是五个参数,呃,是五个是六个来的六个参数,对吧?
那咱们一个来啊,首先我们看第一个参数,第一个参数,大家还记得吧,是不是就是传入一个函数啊,对不对?OK好函数的指针嘛,对吧?那这边呢我们就随便来一个,比如说我就叫做UART,后边跟上一个task。
哎,好了,当然这个函数我一会儿是不是得给它声明出来啊,对吧?呃,咱们这样,咱们创明一个注意啊,注意你要函数声明得在哪儿,你得在慢方法外边吧,对吧?我们就在这个位置吧,哎咱们就来一个word后边跟一个它,然后这个函数人家是有参数的吧。大家还记得不好,后意是不是类型的一个指针,咱们叫做arx就可以了啊。好了,那完了之后,咱们一会儿就在这里边去写相应的这个逻辑就行。我先把这个创建任务的逻辑写完啊。好,后边第二一个参数是不是一个函数的名呃,这个这个任务的名字啊,对吧?咱直接写就行,然后再往下第三一个参数是啥?第一个第二个第三一个是不是应该是那个栈的深度了?对吧?我们一二八没问题吧,同学哎,好,再往下是不是传参,我这儿有参数吗?没参数,那所以说no没问题啊。好,那优先级是务啊,所吧,我现在是不是只有一个任务,因为级无所谓啊,对吧?给一就给一啊。好了,下一个是不是还得有一个任务句柄啊?哎,它会通过这个指针给你,其实我这个锯柄不给他传也行,我现在又不用这个锯柄,我就给那个空指针行不行?同学也行,锯柄什么时候需要用锯柄?比如说我需要给这个任务发通知,我需要删这个任务,是不是需要用它的锯柄啊?我现在不做那么多的操作,所以我直接给他闹,也没啥问题,大家能理解这个道理吧。哎,好了,那所以接下来我们往下进行,下边还得干啥?哎,对你得启动这个定时器,这个这个调度器才行,对吧?这玩意不启是不是没用啊,对吧?哎,所以这个就完事儿了,接下来大家要做的工作是不是就是实现UARTtask里边的逻辑来,对吧?好,我这边呢咱就直接打印几句话就行了。我们把这个串口一块连在这测了啊,来这边include的一个STDL点h呃,应该是STDIO点h。好,这个没问题啊,接下来呢我往下进行下边,咱就直接在这里边,我来一个well一对吧?大家一定要注意正常情况下UA呃这个freertos的任务函数是不能退出的,对不对?哎,好,如果要退出,你需要怎么着来着,是不是得删除这个任务啊,大家一定要记得啊啊,这边咱就直接printf啊OK呃freertoSH就行了。然后呢我们这儿可以加个延时了,对吧?vtask的delay后边呢我们变成一个一百就行了啊。好,那这样一来,我们是不是就完事了呀,对吧?接下来咱们编译啊,编译之后,我们重新测试一下。好,大家稍等编译完了之后,我们接下来呢就得测试了啊,同学这边呃大家稍等。嗯,那这回就得把咱们无人机里边原来的这个代码是这个这个程序是不是就得覆盖掉了呀,对吧?哎,好,那它就空了啊,嗯大家稍等呃,完了之后,我插上我这个USB之后呢,我再插上有无人机啊。好,现在已经这个插好了。呃,插好之后,接下来呢我们进入下一个环节,我们开始做这个测试啊,我先给它捎进去,捎进去后,咱这儿应该正常能收到数据,对吧?能找到fllight啊,这边我直接烧录好,刷完了。那接下来我打开这个串口,看能不能收到,数据能收到。那就证明我们的集成是不是没问题,包括freer叉s,包括咱的这个串口的重定向都没问题,哎,那就搞定了。同学啊。行,那我把这个视频。
10-无人机-飞控项目-电源管理任务-概述
cpp
复制代码
呃,好,给大家说一下,就是咱这个电源任务,它存在一个存在一个问题,存在一个什么样的问题呢?就是它是不是会有一个低功耗的一个检测呀,对吧?哎,好,然后呢给大家看一下这个现象是什么样的啊?
呃,这个遥控咱先录了,我现在是不是把当前咱这个程序烧录到了哪儿的同学,是不是已经烧录到了?咱的这个烧到我这个无人机上面了,对吧?OK好,那呃然然需需要大家注注意的一点,就是你这个插着电,它这个低功耗模式肯定是不会不会出现的,对不对?它是一直工作的。所以你把这个线拔了,你拔了之后啊,你看它过一会儿之后,就是这个电源指示灯,它会不会灭,如果灭了之后,那就证明它是不是已经进入低功耗模式了呀,对吧?哎,我们稍微等一等,我这个之前还计过时,差不多是二十五秒到三十秒之间吧。
我我们稍微的等一等啊,同学嗯呃这个的这个这个这个等吧,没啥可说的,漫长的等待。呃,就是如果他一会儿灭了之后,呃,就证明是进入低功耗了。那所以大家需要考虑一下,就是我们怎样去保证它不会断电。我我要实现的是让它一直得怎么着,一直都得运行,你看是不是已经灭了,对吧?这就是进入低功耗模式了,跟咱们那个充电宝是一样一样的,因为它就是干充电宝的对吧?哎,好,所以大家现在要考虑的问题,就是怎么解决这个对不对啊,解决它的核心思路呢?是不是就是咱们需要在freeRTOS里边,咱干啥?咱得是是不是自己去创建一个所谓的任务啊,对吧?然后在这个任务当中呢呃当然对于飞控来讲,飞控端来讲,我其实给这个电源任务分配了俩任务啊,一个是让它处理关机,一个是让它定时的去激活这个芯片,对不对?哎,好了,那完了之后呢,需要给大家说明的一点就是关机这个事儿我们现在先不管,因为咱们遥控那边是不是没写了呀,对吧?咱现在就把重心放哪,就放在这个定时激活上面。你就想想我要想定时激活这个电源芯片,我应该怎么做?哎,好,那怎么激活这个芯片定时定时这个事儿。好说,我们在freeRTSRTS里边创建一个任务,对吧?然后呢,我让这个任务刚才不是看到了吗?它是差不多三十秒,是不是就就就断呀,对吧?比如说我我激进一点,我十秒钟,我我我就稳一点,稳稳妥一点儿,我十秒钟我就让他去做呃,激活一下,十秒钟激活一下,是不是写一个外部循环,然后来一个比类是不是就完事儿了呀,对吧?
这个事好说,关键是怎么激活,那怎么激活这个你得看啥东西,你是不是得去自己看人家这个手册啊,对吧?OK好,然后大家要做的就是找到资料,找到这儿,是不是有一个电源呀,对吧?b案里边我们用了俩芯片啊,一个是这个IP五三零五t。还有一个是咱那个线性稳压器,对不对?LDO所以所以大家要看,要看是不是看上面这个就行啊,对不对?你就看它。哎,你就看他这块儿所谓的激活应该是怎么激活啊,这里边东西有很多了啊,就很多了。哎,怎么激活呢?其实对于我们目前来讲,你要想激活它,你只需要怎么做就行。就是你你先不说先不说呃呃程序激活,你就说你手动激活,你怎么激活的,是不是按一下这个按键,它就激活了呀。大家能理解这个事儿吧。所以咱们要通要想通过程序的方式去激活它。你只需要通过程序去怎么着就行,模拟一下是不是就行,模拟一下这个按键备按一下就行,对吧?对不对?ok好,那我这个按键被按下的时候会怎么着呢?会怎么着呢?这个是不是就得去看一下我们那个原理图了呀,同学哎OK所以说这是一个很综合的一个小问题,就是看大家自己能不能搞定这个事儿啊?就是你得去看原理图OK咱们已经做过几个项目了,这个能力大家应该得有才行。找到原理图是不是找到非控原理图,对不对?OK好,然后呢,你就去找电源芯片,咱那个电源芯片是IP五三零五t啊,对吧?你就找找找找找这个是不是?IP五三零五t对不对?你会发现这里是不是就接了一个按键呀,对吧?没没问题吧,同学注意这这儿按键这边接地。然后这一侧呢是不是接到了我们这个五三零五t的一个k引角上面的呀,对不对?你看啊,你只要一按这个按键是不是这个引角接地,你相当于就是给这个芯片发了一个低电频信号,相当于是它不就是这么个逻辑嘛,对吧?然后大家需要注意的一点,就是在按键的这一侧,你看这儿是不是有一个网络标号叫做powerk啊,对吧?这个实际上啊,这是连了一条线啊,这条线连到了哪儿?咱们controlf,你就搜一下就行,对吧?呃,或者说你直接看一下左边这个网络标号也行啊,左边其实也连到了这儿,是不是有一个powerk它连到了哪,是不是连到了我们单片机的PB二这个引角上啊,对不对?所以说你要想模拟一下这个按键被按下,你怎么着就行。powerk那个眼角让它输出一个什么电线就行,低电平嘛。你看按键按下的时候,正常不应该是低电平嘛。所以你是不是就让这个引角定时输出一个低电平就行了,能能能理解这个事吧。同学啊,但是你这个低电平注意啊,你你人家这个按键在按下的时候,它是有一个时长要求的啊,我得保证我这个你得按下多少多少秒之后才能生效人,这是不是有一个这样的要求,对不对?OK这个你还是得去看手册手册,上面也有说明,就这个东西它很综合,就其实看似简单,但其实做起来有很多小事儿需要考虑的啊,你看不是有一个目录,这说了,这是不有一个按键方式啊,对吧?哎,人家说了,说这个芯片可以识识,为什么长按和短按这样的一个按键操作。
你看按键时间可于呃长于三十小于两秒,视为什么短按对吧?什么长于两秒啊,视为长按那小于三十毫秒啊,那是不是就不会有任何的一个操作呀,对吧?那什么在一秒里面里面连续两次次连连续两次短按那那那这是不是相当于是连续按键,对吧?
它会等等,都是一个一些操作,就这个东西我都没跟大家说的啊,就这个东西你要想了解是不是都得看一个芯片手册呀,对吧?所以这个东西就是大家自己尝试着写一写很综合的一个小案例,看能不能写出来啊,呃能写出来最好写出来呢也无所谓啊。那等下午咱们再一起写也行啊。然后大家在写这个项目的时候呢,你不用怕写错了啊,你就随便写呗,写错了,大不了,重新来一遍,对不对?所以这个也不用担心,你就正常写就行啊,能写出来最好写出来也无所谓啊。OK好,大家呢就自己试着写一写吧,姿势写一写,写一写啊。好,我把我这个初始化的项目我给大家发下去啊,然后大家呢可以可以,你要是不想自己做这个初始化的直接用我这也行啊啊行啊OK就说这些啊,所以给大家总结一下大家这一个干啥啊?首先第一个自己先梳理一下咱们这个项目的呃整体的思路啊,就是我这两张图,大家好好看一看。呃,这个完了之后呢,有时间可以自制自己试着写一下,就是我们这个定期激活这个电源芯片的这样的一个任务务,自己试着写一写写。其实大家可以想想啊,这个任务到时候你创建的时候是不是得考虑它的优先级啊这件事儿啊,对吧?其实它的优先级需要最高的同学其实也不需要最高啊,我们最高的应该永远都是谁呀?接收遥控数据设置电机转速,这是不应该是最最最高优先级的呀,对吧?你像其余的灯控的,包括这个电电源的这俩其实不是不是特别的重要啊,稍微的低一点的优先级就行啊,就是大家自己试着写一写吧啊。
好,然后呃自己可以尝试着读一读,就是咱们这个芯片手册,这个手册还行,还算是比较清楚啊,比较比较整洁。然后我下午当时会带着大家去看的啊啊,就是自己尝试着写一写。
11-无人机-遥控项目-创建
cpp
复制代码
好,那我们现在呢把上午创建的这个飞控项目给它复制一份CTRLCcontrolLA啊,直接复制完了之后咱们改个名字就行啊。呃,然后需要给大家说明的一点,就是大家复制完之后,我们到时候真做这个遥控项目的时候得注意一下啊,就是咱这个原理图上其实能看出来非控项目,我们用的那个串口用的是呃USART二对吧?呃,但是这个remote这个呢它遥控那个呢它用的是USRTT这个到时时候们还得稍微的调整一下,改一改就行啊。
这个倒呃好说啊,到时候咱们再改啊,这个拿过来。呃,哎我老师就在这儿玩这个啊remote啊,进来之后呢,我们把这俩名字给它改一下就行。哎,这个咱也改一下,哎,行了。哎,两个项目啊。好OK那现在rebote我们就先不管了,我们还是进到这个呃哪儿进到这个flag。哎,来吧,我把视频再停一下。
12-无人机-飞控项目-电源任务-IP5305T概述
cpp
复制代码
好,各位同学。那接下来呢我们就一起来呃开始开发这个非控项目了啊呃按照我们上午的规划啊,这个非控项目呢呃一共是有四个freeRQS里边的task,对吧?然后我们现在呢先从最简单也是呃挺重要的一个开始,也就是从这个电源任务开始,其后上午我们也看到了啊,就是我目前把咱这个初始的代码烧到这个呃就是无人机的这个项目的这个这个板子上面,对吧?
完了之后,如果我把这个USB线给它拔掉啊,只靠它的电池供电,你会发现过个二十多秒之后,它自己就进入低功耗模式呢就不供电了,对吧?它有这样的一个问题啊,所以接下来呢咱们呃要实现一个电源任务。那目前呢我们这个电源任务呃,当然规定是规定了两个任务,一个是让它去定时的激活这个电源芯片,还有一个呢是处理这个关机的命令关机命令我们暂时先不管,咱们只需要先把这个事儿给它搞定就行啊。第一个事儿咱们先给它落实了啊,来吧,那咱就开始呗。呃,当然开始之前呢,我们首先需要去了解一下,就是我们所使用的这款IP五三零五t这款芯片的工作的一个基本的原理,对吧?咱们得知道我怎么样去激活它,对吧?那具体怎么去处理,咱们了解了解了来吧。那现在我们去找一下这个芯片的呃手册啊,就是咱这回这个项目呢,完全就是依靠这个芯片手册了啊,来我现在打开无人机项目,找到给大家发的资料,然后这里边有一个电源,对吧?
来个RDO,其实我们就不用管了啊。LDO不用管了。我们其实重点是是上面这个对对吧?现在打开打开之后呢,这个手册挺多的内容,但但我没必必全全看啊。那现在咱们一点点,我把重点给大家看一下就行了。首先我们先来了解一下,就是它的一些功能吧。来OK好,那可以看到它这里边呢是有充电的功能,呃,有放电的功能。然后这个呢也是有是不是充电的功能啊,对不对?并且它其实是支持就是同时进行充电和放电的。所以说我们只要把这个线插上,那那个时候同学它就开始充电了,完了同时也可以去放电,不影响使用啊。哎这一点大家呃注意一下就行了。哎,完了之后呢呃还具备什么功能,比如说支持电量显示,这个都不用不用说啊,然后这个功能丰富这块,咱们需要去注意一下啊,它是呃需要使用一个按键去进行开机啊。当然关机也是用这个按键啊,那具体怎么开,怎么关,这上都有说啊,然后还有它其实内置了一个照明灯驱动,大家都知道有的那个充电宝,是不是它是带那个一个照明灯的呀,对吧?应该都用过啊,这个驱动它直接都有。也就是说我们要想去实现这样的一个照明的功能,你只需要按照它的要求给它接个LED模式了,驱动它里边都有啊OK好,这个非常的简单啊。好,然后再有一个功能也是非常重要的一部分,就是它这个所谓的低功耗,对吧?呃,如果你待机功耗小于一百微安,那它应该是过个二三十秒之后,如果持续都是这么个低电流的情况下,它就可以进入低功耗模式了,就是这么一回事啊。好了,这一点大家注意就可以了。然后这儿其实也说了,它主要是用在哪儿呢?是不是移动宝这个呃移动移动电源充电宝基本上就是这么一回事儿啊。好,这个大家简单了解一下就行。接下来呢我们往下翻,注意观察这儿是不是有一个它的呃应用原理图啊,对吧?呃,实际上这个画的还不是特别的具体啊。那大家呢要是想参考这个原理图的话,其实咱那个就是我们自己这个板子上面这个原理图就是完全参考他这个文档做的啊。好,那你往下翻这儿,其实还有一个更清楚的十四这块这儿是不是有一个典型的应用原理图啊,对吧?实际上那咱们照着这个去做就行。然后他这儿呢给咱们提供了多种方案,呃,其实这三种方案这几种方案的区别是什么呢?其实其实主要是这个电量显示你可以选择,对吧?你会发现有的LED它显示电量,它用四颗LED显示,有的呢可能只需要三颗,对吧?
有的可能只有两颗。呃,你这块呢是可以选择的啊,这是四颗LED。那再往下呢,这还有一个是不是三颗LED去显示这个电量对吧?等等等等。那我们选用的其实就是它的第一种这个方案跟这个基本上是完全一样的啊,只有哪不一样呢?咱这块是没有那个照明灯的吧。同学哎OK啊,其实你可以看一看,就是简单搂一眼就能看明白这一块是不是就跟你说了呀?如果说你不需要照明功能,那你就把这部分是不是省略就可以了呀,对吧?这其实你可以看到这是接的谁呀?这其实就是接着咱那个按键,嗯,你会发现这个按键灯这个呃照明灯不是接到了一个眼角角啊,对吧?哎,你按照的这个要求来就行啊,我们没接这个灯啊,大家注意一下就行。这个咱们一会儿再说。那现在呢我们需要去了解一下,先去了解啥呢?这个原理图一来来看,我们先了解一下啥呢?先了下它这个眼角的定义,对不对?就是我们用的这款芯片,一共有你可以理理为是九个眼角的同学,虽然外边伸出来的只有几个,只只只只有八个,对不对?但是它中间其实还有一个powerKAD这这是一个什么呀?这是一个接地的一个引角,能理解这事吧。同学,这是那个d啊OK好,这个大家注意一下就行了。那我们现在把这几个眼角都快速的过一下啊,其实挺简单的。呃,首先我们看这个VIin和vout呃,vin和vout,这个明显就是一个输入,一个输出,对吧?哎,OK好,那vin呢就是充电的输入啊,你要想给它充电。OK好,那你的是不是那个五伏的一个正极应该接到这个引角上,对吧?这是充啊。OK好,那完了之后,这个是放电,放电,注意过察还境,它的放的也是几伏的,是不是五伏啊,对吧?好,那它为什么叫做升压输出呢?为什么叫做生压输出呢?这个事大家还得想一想啊,是因为这个你接的电池,你接的电池它不一定是五伏,对吧?
同学,你像我们常见的锂电池是不是也就是三伏到四伏左右啊,对吧?那那个是吧,所以说你要是想呃呃以五伏的这样的一个电压输出,那是不是一定是会对这个电池进行升压的呀?
这个时候大家能想明白吧?哎,对,人家做五伏升压输出啊OK这一点大家注意就行了啊。好了,这是关于呃呃输输入输输出这俩眼角OO那接下来我们再看看其他的啊。呃,首先看这三,这大家一看就是用来接那个LED的对吧?但是你会发现它一共有四颗LED灯OK呢?只给咱们留了几个眼角,三个眼角啊OK其实你可以看一看,人家确实是这么接的啊,人家是不是就是把四颗一二三四四颗LED是不是接在了那三个眼角上啊,对不对?你不用管它内部是怎么走的,你按照直接接就行啊。行,那这个大家注意一下就行了。好,然后再往右看,我们现在看了,是不是这几个了呀,对吧?包括这个那个d咱也看了,剩下这三个了,对不对?这三个我们快速的过一下啊。首先我们先看这个这个应该好理解BATBAT是啥意思啊?电池battery对不对?这就是你接电池啊,这块块呢需要接到那个电池上面啊,怎么接一会儿咱们去看一看这个原理图就能看出来啊。好了,然后呢,我们再来看一下这儿有一个SWSW其实就是啥呢?就是switch的意思,所以是不是就开关的意思啊,对吧?好,开关开关谁注意观察,这是开关谁啊?DC到DC开关。哎,这个就让人很很难理解。DC是不是就是直流电的意思啊,对吧?
直流到直流,这是啥意思呢?呃,这其实是指的就是那个升压的一个直,因为直流到直流,它改变的不是这个电流的方向,它改变的一定是电流的,是这个这个什么东西,是不是电压的大小,对吧?哎,因为刚才咱们提到了,说你这个输出的时候,是需要对电池的电压进行升压的。
这个其实是那个相当于是还那个电池是不是那个升压那个它的一个开关呀,对吧?哎,DCtoDC就是低电压到高电压都是直流电啊,是这么个意思啊,这一点大家稍微再理解一下怎么接呢?一会儿还是看原理图就行啊。好,然后再往下走,呃,这儿还有一个k呃,这个k其实就好说了,这个是不是就用来接那个按键的呀,对吧?其实这这个这个可以不光接按键。我们刚才也看到了,如果说你需要接那个照明的LED它是不是也是接在这个位置啊,对吧?好,这就是它这个引角的一些呃基本的说明。然后呢,大家你要是感兴趣可以找到我们刚才的那个呃a哪去了,是不是有一个典型的应用原理图啊,哎你可以来这儿看一看啊,那可以看到同学这这就是它那个锂电池能理吧,同学哎,这那锂电池锂电池,它是这么去接的啊,这个一定要注意啊,可以看到就是这边那个SW刚才那个开关其实是直接就怎么着了,是不是接到了,相当于是这个正正电了呀,对吧?那相当于正常就一直开着的啊,这个大家注意一下就行了啊。好,那差不多就是这样,就我们基本上全是按照这个来的,只不过哪儿不一样,就这不一样,我们没接这个照明的LED别的就没啥了啊。行了,这是关于这个芯片,大家要了解的一些基本内容。那接下来咱们需要重点关注的是什么呢?
咱们平时讲了,我我们现在要做的是啥,是不是就是要定期的去激活?咱们当前的这款芯片呀,对吧?不让它进入低功耗模式,那怎么激活呢?那正常情况下以我们就是正常的一个用法来看,就是按一下按键短,按一下按键是不是就是开开呀,对吧?我们按两下是不是它就是关呀,对不对?这是它的一个逻辑,我们一会儿就模拟这个逻辑啊。好了,那所以接下来咱们需要重点了解一下,就是它这个按键的工作方式。这儿也提到了啊OK好,那现在我们系统的看一下啊。首先我们先把这句话读一下,他说IP五三零五t是可以识别这个长按键和短按键操作的,它分两种短按和长按啊。好了,那既然有短按有长按,那你按的时间是不是就有区别了呀,对不对?所以时间一会儿咱们得好好看一看啊。然后呢,你要是不用这个按键的时候,你需要确保那个PIN五那个眼角,你得是悬空的啊,这个注意啊。好,那接来往下进行啊,如果说我们来看看这几几几句话啊。首先第一个,那如果这个按键时呃,持续时间小于多少啊,小于三十毫秒呃,大于三十毫秒,长于长于三十毫秒,但是小于两秒,这个时候就视为短按动作。哎,好,那短按一下它会怎么着呢?会打开电量显示灯和升压输出呃OK好,那前面讲过输出输出是不是得升压呀,对吧?啊,OK啊好了,这一点要注意,那先来往下走。呃,如果说我们按的时间长于两秒,说白了就是长按了呗,长按它会怎么着呢?它会开或者是关闭那个照明的LED这个跟我们没关系吧,哎,咱们就不用管了。然后这个如果小于三十毫秒呢,这个按按键不会有任何的这个响应,说明它不识别了,对吧?
哎,好了,再再往下什么是长按的呃,两次按按两次是啥呢?就是我在一秒内连续呃两次是不是短按这个按键就会关闭这个剩压输出电量样式和照明LED啊,对吧?说白了就是直接关机了。哎,好了,同学。那呃所以我我们这需要关注的应该是什么?咱现在其实应该重点关注这个,还有是不是这个呀?嗯,对不对?这个我们一会儿是不是要周期性的去执行,去激活这个电源芯片规吧。
那这个时候咱什么时候用,大家不要忘了咱那个电源任务们说了,是不是将来会实现一个所谓的遥控关机的功能啊,遥控关机怎么关机?你手动关是你自己快速的按两下,这个按键它就关了,你要遥控关呢,是不是就是还是用软件的方式去模拟一下这个过程啊,对吧?对吧?哎,模拟一下这个事儿就行了,就这么个意思啊,咱们重点关注这两点就行。但是咱现在呢就先只关注第一个就行。哎,就是咱们短按啊短按OK,然后需要给大家说明的一点,就是按照他那儿的那种描述啊,说我正常是不是给他一个三十毫秒的,说白了,就是咱们按照我们目前的原理图来看啊,你你你按三十毫秒,这是啥意思呢?按三十毫秒,是不是?也就是说给这个引角输入是不是三十毫秒的低电平就行了。大家能理解这事吧。哎,好,但是但是实际测试呢,我发现你要帧点它三十毫秒还真不太行。他这个不是很准啊,不是很准真严严格的,正好三十毫秒的话,他他有有有有时候会识别不到啊,就是他那个到点之后是会自动动机的能理解吧。因为他说了,他是小于三十毫秒那个按键它是不是不识别严呀?同学能能能理解这事吧。也就是说你要正好三十,它可能也不识别,所以这会儿咱们最好怎么着呢?
时间长一点,按的时间长一点OK好,那我到底按多少合适呢?呃,这块儿其实也是有一个范围的。咱们可以看一看这儿啊,呃它这个手册里边这个位置,它有一个是不是有一个所谓的电器特性啊,对吧?就是电器特性呢,其实就是对一些电压电流和说白了就是跟电信号相关的一些什么呀?
就是参数,对不对?有最大值最小值典型值,对吧?然后咱们重点看谁能解往下翻,看它那个按键看按键控制是不是这儿,是不是有一个短,按按键唤醒时呃呃短按键唤醒时间呀,对吧?好,你可以看到它这儿的这三个值是什么呢?这是最小,这个是最大,这是典型值。对吧?最小是三十,那最大呢是一百毫秒,然后呢典型值呢是五十毫秒。所以大家给的时候呢,尽量给高点,你给五十给个一百啊,就不要你正好用三十了,这个就不太准啊,这个一定要注意一下这个事儿。行,这是关于呃这个任务,咱们需要准备的一些内容啊。行,咱把这事了解清楚啊,我把视频给。
13-无人机-飞控项目-电源任务-GPIO配置&框架搭建
cpp
复制代码
好了,各位,那接下来呢咱们就开始去实验一下我们当前这个电源任务啊,那在最开始我们首先要干啥,是不是得先去配一下GPIO对不对?我们得通过一个GPI音响去控制咱们这个电源芯片了,对吧?来,所以配哪个GPIO呢?这个是不是就得看咱的原理图了呀,对吧?找到非控原理图,然后呢,大家直接搜IP五三零五t搜它就行了。
这个就找到了,找到之后,你发现就是这个图跟刚才咱们看到的是不是就是一样的呀,对吧?哎,来那接下来来咱们这儿的同学,我们看这儿哎,呃这是咱的一个k眼角,对不对啊?正常情况下呢,他这儿是不是接出来?哎,我们这儿还哎,咱接了一个这个LED是吗?就是那个照明的LED是吗?哎,咱好像没有吧,我我试一下啊,长按长按它是不是正常情况下意思就会点亮啊,对吧?并没有并没有啊,我这儿啊它并没有亮啊,呃,一会儿我看一下啊,一会儿咱们呃看一下这个得看一下这个工程,我记得这个好像是没接啊。行,咱们先不用管它啊,我们先接着往往下看啊,呃反正这个对于我们来讲也无所谓啊,来我们看下面呃,咱这儿是不是应该是看这条线啊,同学对不对啊?呃,今天上午有的同学问了一下,就是这个按键呢还是有点看不明白啊,这个按键其实挺挺挺好,挺好理白的。大家注意观察一下啊,就正常情况下,我们这个按键它它实际上你仔细观察它是有四个眼角的,我们的按键啊是有四个眼角的能理解吧。同学哎,好,那四个眼角呢,一二,这俩本身它就是连一起的啊。然后三四这俩呢本身是不是也是连一起的呀,对吧?有同学他不理解,就是为啥我这儿要再来一根线,其实这来不来是不是都是一样的呀?哎,所以说这个不用纠结这个事儿啊,无所谓的啊OK好,那这个大家注意一下就行了。然后我们这个呃按键的一侧接到了这个k引角上。另一侧呢接到了这个d啊。好,只要我们这个按键按下,那这个引角相当于直接接地输入低电平给它,就这么个意思啊。好了,然后哪儿需要大家特别注意呢,就是这个引角这儿这儿光写了一个是不是这个就是网络标标识啊,对吧?呃,你得知道啊,这块呢是怎么着呢?是呃,连了一根线啊,就是从这个位置这个位置是哪儿呢?
说白了就是一引角到二引角之间,是不是这根线上对吧?甭管是哪儿接出一根线接出去之后呢,连到了哪儿,是不是连到了我们这个单片耳机的PB二这个引角上啊,对吧?它是这么个意思啊。哎,好,那所以我们就可以通过p电平来给咱们这个k引角输入这个低电平了,来模拟这个按键被按下的效果了,就是这么个意思啊。好了,然后需要大家注意的一点,就是咱这儿到底是呃怎么去配这个引角,那肯定是输出模式了,对不对?对,我们们单片机来讲是输出嘛,来输出模式了。好,那输出模式上,我们也分析了咱们这个必须得严格模拟,就是这个按键的一个效果。
你像这个按键,你在不按的时候,它就处在一个断开的状态跟地是断开的,对不对?哎,OK好,你断开是不是就可以理解为是高阻态呀?嗯,能能理解这个事吧。同学OK好了,那我按一下之后是不是就直接接地了?那这个模式是不是正好跟开漏输出是一致的呀,对吧?你看到输出,你给高电平,高电平是不是这样,就是高阻态没错吧,就是这边我接到那个PB二上面了。好,你这儿给高电平给一,对不对?我这相当于就高阻态,就相当于这个按键是没有按下的一个情况了,对吧?那我给零给零是不是就是接地相当于被按下来了,对吧?哎,所以我们这儿应该给他一个啥呢,给他一个开漏输出完完之后,默认值应该是高电平还是低电平的同学应该是高电平对吧?相当于按键默认是断开的嘛,对吧?哎,这样一来就行了啊。好,这就呃这就妥了,我们按照这个思路呢,咱们去配一下啊,来吧。那现在呢我们去配一下,来打开咱这个项目,呃,然后右键在文件资源管理器中显示进到fllight,然后我们打开这个LC文件啊,哎呀,上午又想了一下,这个其实生重新生成完这个就是代码之后呢,我们还是得还是得去处理它那俩工作为啥?因为咱是不是手动给它加上两个ASM前缀啊,对吧?那俩你生成完之后,它又没了,那还得加,这有点麻烦啊,哪个拖用加啊,之前前其是是那那个就在CC里边边用那GGC编译器器用那个测测过那那个GC编译器前边呢,因为你像这种特殊的关键字,其实都是由编译器时不提供的扩展呀,对吧?扩展关键字那个GCC它前面是没有那前缀了,你那么处理一下,每次就不用动它了。那这个你还是得动一下吧,你动一下动一下吧,有点麻烦就是啊。行,那现在我们呃废话不多说了,我们开始配啊,来,我们找到这个是不是GPIO这块啊,对吧?那这边咱先搜一下吧,来搜索一下,哎,哎哎,往们这拖拖一啊啊,已经拖一拖啊,咱就直接搜那个PB二就行,对吧?我们已经已经看过了啊。PB然后我们来一个二应该是在这儿了,对不对?来,我们点一下。那这块呢我们应该给它设置为是不是GPIOoutput的呀,对吧?点一下点开之后呢,我们直接下就可以配了,别的,先不说我先给它起个别名啊,同学咱们给它叫做什么呢?电源电源我们就叫做power吧。powerk是不是就是咱们的电源相当是按键呀,对吧?那OK好弄完之后呢,我们开始配一下它的个性参数啊。首先呃那我们先来看一看,就是它的输出模式应该是默认的。推完我们应该用open啊,rod啊,也就是开low啊。好,那刚才也分析了,就是它的默认电瓶呢应该是高还是低啊,应该是高啊,这个一定要注意,你像其他这俩参数,我们就不用再配了啊。OK好,那这个是不是就完事儿的同学?哎,好了,完了之后呢,我们先来直接就是january的code就可以了。哎,稍等嗯呃稍微有点慢啊。行,那这个完了之后,我们就不用再用那个q去打开了,只有第一次需要打开一下啊,这个咱们就不用再管了。行,那接下来呢我们来到这边,来到这边之后呢,我们需要去先编译一下,每次重新生成完代码,它要重新编译一下啊,哎编译一下之后,肯定会遇到一些问题,遇到问题咱们再解决啊。好,那首先第一个是不是就是报了一堆这样的错吧,对吧?这个错误是怎么来的?
其实就是因为是不是前面那个前缀没有了呀,对吧?没了,它识别不了这些这个呃关键字了,那咱们就加上呗。ASM对吧?exdemally稍微的麻烦点啊,这个拿过来下边那个pen的SV是不是也得加这个呀,对吧?好了,加一下就加一下吧,哎,我们走。哎,好,那这次他是不是就编译过了呀?同学哎,编译过编译过了之后呢,接下来咱这样,我们就可以呃着手去干啥了?同学着手是不是就是开始写咱们这个相应的任务了呀?对吧?来吧,那咱们怎么演?呃,怎么意啊?同学在哪写呀?呃,首先我们先像咱之前学freefreeRQS一样啊,我们先单独的创建一个freeRQS的这个任务文件,我们将来所有的任务都在这里边去写,那没问题吧。哎,好,所以接下来呢我们先新建一个这个文件,我叫做task呃,这个没问题啊。呃,OK好,那这个task里边咱们去声明什么东西呢?呃,我们去声明是不是两个文件就行了,对吧?来一个叫做free。呃,RTOS后边呢我们来一个呃,我现在叫啥啊,咱们就叫task跟之前保持一致吧。task点h。然后呢我们再来一个free。RTOS呃FREE呃RTOS后边来一个这个TASK好,后边再来一个点c好,那我们一会儿所有的任务呢都在这里边写就行了啊,好,h这边呢我们就来一个header就a行。
那这个呢就是呃,创建好了啊。好,那创建好之后,咱这样我们先把那个基本的架子搭起来吧,咱们跟之前保持一致,我们还是在这个h文件里边,咱生成一个什么样的方法?咱们void后边跟成一个啥,跟上一个free,后边跟上一个RTOS再来一个TASK再来一个啥,是不是start呀,对吧?哎,好,那一会儿咱是不是就在这里边去实现这个start的方法,对不对?完了之后,我们的慢方法那边呢慢方法是不就得调咱们这个star的方法呀,对吧?咱们把这个架子先搭起来啊,慢点c好,然后呢我们演一下。呃,你像我们今天上午在这个位置演的这个freeRTOS这些东西还有用吗?同学其实就没用了吧,哎,我们就给它删掉了啊,这边我们来一个include,后边它来一个啥呃,再来一个freery,那应该是叫做freeRQOS后边再再跟那个啥,是不是task点也删,对吧?但是发现它不提示,为什么不提示呢?因为我是不是还没把那新建的那个task文件加到原目录里边啊,对吧?我们加一下啊资源资源呃,项目资源,我们直接加一整个目录的文件。然后呢,我们去找到flight,找到它的这个task,添加到原文件行了。
那这回这边是不是就能够找到了呀,对吧?好,找到之后,接下来我们往下翻,各位往下翻往下翻。哎,好,那现在咱们就开始了啊,上午我做测试的时候,我是不是声明了一个UIRTtask呀。对吧?这都没用了,我就我就删掉了啊,同学删了。那接下来往下走,那在慢方法里边,我上午哎,这个乱码呢,因为这个编码变了啊,我再这个重新来一下,估计是GBK啊。行呃,没没事啊,把这个删掉,这个删了之后,上午这个初入法测试这个相关内容是不也不要了,对吧?来去掉啊。好,那我就在这个位置吧,在这个位置咱去调一下,谁是不是福瑞RQStaskstart就行了,对吧?然后之后呢,我们创建任务启动调度器是不是就还是在这个里边去写就行了呀。对吧?哎,基本上是这么一个思路啊,同同学。哎,好了,那这个先到这儿,我先停一下。
14-无人机-飞控项目-电源任务-编码
cpp
复制代码
那边呃来各位同学,接下来我们开始实现这个具体的功能。嗯,怎么写呢?呃,因为毕竟咱这是一个项目,对吧?所以说我们还是呃按照咱之前讲的,就是那个项目的结构去去去编码啊。呃,你像我们现在是不是要去操作这个电源芯片呀,对吧?电源芯片对于我们来来讲,是不是也应该算做一个外部的一个呃这个相当于外部的一个配呃这个呃设备啊,对吧?那所以在这儿呢我们呃写个什么呢?我们写个接口层,然后我们在接口层里边去封装一下,就是作为这个芯片的一些操作逻辑啊。好,所以接下来呢我们这还得再新建一个目录啊,来在根目录下边,我们定一个INT啊OK。好,那完了之后呢,里边咱们创建两个文件啊,呃这个这回来是这样的,我们稍微的细化一点。呃,因为将来啊我这个是不是有很多的外部的设备需要去控制啊,对吧?那所以我们IT下边可能会有很个的一个在里代。所所我们稍微分一下,我们再新建一个目录在里边呢,我再新建一个呃什么目录呢?呃,新建一个,比如说over这个是不是专门用来控制咱们这个电源的呀,对吧?好,举举个例子,将来我是不是还可能需要去控制电。那我们就再来一个motor呃,能能力这个事吧。哎,好,所以接下来呢这样我们在这个里边再去新建文件。呃,power里边呢我们新建一个INT后边咱们叫做是不是IP五三零五t啊,对吧?后边先来一个点h啊,好回车,然后呢我们再新建一个文件,这个呢叫做点儿c就行了,是不是就完事了,对吧?哎,好了,那接下来呢我们就在这里边去定义咱们相应的这个方法啊HEADR哎,好,来吧,我们现在接口层把这个基本的功能给它搞定完事之后,我们再去创建任务,再去进行这个调度啊啊,来现场接访啊,这儿怎么接同学?
呃,咱定一个什么样的方法呀?我们是不是就是要周期性的去说白了就是开启这个电源呀,对吧?哎,所以在这儿呢我决定一个这样的方法就行。非常简单,咱们叫做word,后边跟上一个INT后边再来一个IP是不是五三零五t?咱当然不叫以逆它,我这应该叫做什么呢?是不是叫做star的就可以啊,对吧?是不是是不是咱是不是就是要周期性的去开启这个电源芯片啊,对吧?就这么个意思吧。来,那现在呢我们给它实现出来啊,快速修复,然后呢进到这里边来啊。好,那接下来咱们就开始去实现这个相应的逻辑了啊,这个逻辑相当的简单了啊,怎么着?同学是不是就是短按一下就行,对不对?短按一下就行啊,至于就我们这这里边只写只写什么,只写启动一次逻辑就行。至于我周期性的启动,是不是交给福瑞ROS去调度啊,对吧?哎,这个注意啊。好,那这边呃说白了,就是我们需要去写GPIO啊。好边我们需要引一下这个呃文文啊啊,来我们这来一个GPIO点h。好,那完了之后回到这边来。好,那这边应该怎么着?按照我们刚才的分析,是不是应该是你按并并且持持续是不是段时间呀?对对,然后后不是再松手,就模拟那个按下的逻辑嘛,对吧?所以这边我们应该来个啥,来一个how我后边来一个啥GPIO是redin就行了,对吧?好,那我应该写哪个引角的?按照我们刚才我定义的,我应该叫做POWERpowerk这个port给它传进来,是不是还得来一个powerkpin呀,对吧?好,那完了之后,我按下去按下去,应该是set还是resetreside了,对不对?好,那这个完了之后呢,是不是得延一段时间,延一段时间之后呢,是不是咱们再抬起来就行了呀,对吧?哎,好了,那接下来咱们就延时,按照我们刚才分析啊,最少最少三十毫秒,但是这个不太准啊,不要按这个来,你来个五十来个一百,应该都差不多啊,这边我直接给它顶到头吧,一百没问题啊,一百没问题啊。好了,然后问一下那些压,你说我这会儿这个延时是用耗几类,还是用freeRQOS里边那个task底类。没错,这个咱得想想啊,但是呃想想呃,首先咱们得有一个这样的的原则,什么原则呢?能用taskdelay,那肯定是用taskdelay,用不了,是不是用用delay啊,对吧?哎,好了,那因为你task类它是可以释放CPU资源的嘛,对吧?好,那关键问题来了,我啥时候是能用taskdelay的,啥时候是不能用taskdedelay的呢?
你就记住了,只要你这个任务,这个代码将来是在一个freeRQS的任务里边去调用的。好,那tassdelay就能用大家能理解这个事儿吧。但是你你在free二十六s这个任务之外,你去做延时,那你用touch的那肯定是不行的。大家能能明白这个道理,对吧?哎,好,那所以咱这个方法将来是不是要在一个freertos任务里边周期性的执行是那所以说咱这肯定是wetouch个delay,这个一定要注意啊。当然你要调那个方法的话,是不是得引入freertos相关的这个代码的这个这个头像啊,对吧?来,我理解一下啊,free呃呃RTORTOS点h,你这个干啥呢?就是哎好了,那完了之后呢,我们再interlook一下,后边来一个是不是task点h就行了呀,对吧?这个是我演不了了吗?那我跳一下啊,能跳,它只是没呃没识别素材啊,行无所谓。这个公这个vcode的提示的问题啊,引进来之后,接下来咱就是不是可以调那个v是不是taskdelay啊,对吧?哎,好,那这个大家一定要注意一下这个事了。行,这个咱就妥了,这个妥了之后,我们进入下一个环节,同学你按键你按一百毫秒之后,你是不是得松手啊,对吧?哎,松手之后呢,那说白了,就是我们这个引角的电平还得再给它置为所谓的高电平其实也不是高电平,应该就是什么呀,你就高走态了,对不对?就这么意思了。行了,那这样一来是不是就写完了这个逻辑了,哎,非常简单啊。行了,这个接口层的逻辑写完了之后,接下来咱是不是就可以回到哪儿,回到咱这个大家比较熟悉的这个task里边去写相关的逻辑了,对吧?哎,在这儿开始写了来吧,那咱就开始这块儿怎么处理这个事儿的同学跟咱之前一样,你得先创建一个任务,是不是再去把这个调度器给它启动了,对不对?那所以接下来咱就开始来来,我们先把这个注释写啊写上。首先我要是不是创建电源任务啊,对吧?来,我换一下这个说法啊,电源任务。哎,好,那完了之后呢,是不是最后来一个是不是启动这个调度器呀?对吧?应该是这么一个思路啊。好了,那接下来咱们先去创建电源任务,那电源任务是不是得调freertos相关的这个方法,对吧?那所以接下来呢我们去给它引进来啊,来include还是福瑞rtos点h。然后后边呢我们再include一下,后边来一个是不是task点h啊,对吧?哎,当然啊其实其实咱把谁也得引进来,将来那个呃就是我们刚刚写的那个接口层的那个那个那个方法是不是得那样调用啊,对吧?所以我们还得把谁也引进来呢?一块引引啊,呃,这个应该是INT后边跟着个IP五三零五t是不是h啊,对吧?来看能不能过去呃,过不去,这个是不是我哪写错了,五三零五t点h,我呃,我没放到包含目录里是吗?
对哦哦对对对,刚才这个没加没加,咱们加一下啊,这个我们就还是直接加两个目录,是不是就行,对吧?我们点一下啊,来找普通文件,找到直接INT一点,然后添加哎,就行了。来。那现在我们点是不是能够来了呀,对吧?哎,好了啊,行了,那现在我们该引的引进来了,我们接下来去实现咱们这个相应的逻辑哈,来吧,我们现在先去实现这个创建电源任务的这个这个逻辑,那就直接调呗。
xtask是不是后边变成一个呀,对吧?那在这儿我们就统一都使用这个静态的呃动态的方式去创创建这个任务就行了啊,好里边是不是又要传这么一大堆东西。哎,为了方便咱们将来去修改,或者是管理,我们还是在上面去定义吧。
来,我在这儿呢写一下注释,这个是定义,是不是电源任务吧,对吧?或者说我直接就不写定义了,来,咱把这参数都写出来。首先第一个是不是就是咱那个函函数啊,对吧?来,我们写一下啊,咱们叫做crereword,后边跟着一个啥,咱就叫做POWERpower,是不是task就可以,对吧?哎,然后呢我们在这里边呢去呃传入呃,咱们相关的这个这个这个这个这个这个这个呃参数啊,它那个要求我们的呃这个函数,它的参数是不是得是word星这样的一个类型啊,对吧?好啊,行,那我们先把这个声明先写上,呃,然后实现呢我们一会儿再实现来,我们先接着往下写,现在是不是可以把这个power就直接接,不是是哎扔到这儿,对吧?哎,可以扔进来了,接下来我们进入下一个环节,下边咱们要传的第二个参数啥来着?是它那个呃是不是是那个名ttask吧?对吧?哎任务的名字,这个我们还是定一个宏就行了。来这边呢我们叫做powertask,别stack呀,咱们叫做NAME,对吧?那啊这边呢我们就叫做powertask就行啊。行,那下一个下边一个呃,是不是就是该那个style呀,对吧?我们先把这个就传进来了。好走,你下边一个是那个stack,那大家想想我们这个任务的stack,咱们给多少比较合适,其实这个用不了太多吧。
同学,你你想啊,咱们不就是去呃周期性的执行一个什么?是不是写那个说白了就写GPI圆角的这样一个任务。所以这个其实占不了太多的这个呃占空间啊,所以这个咱们就给个先给个最小的给个幺二八啊OK好,那接下来呢我们controlc拿过来拿过来之后呢,我们就放在放在哪,放在在这儿就行了。
实际上咱这个任务啊,就是咱这个算法一共任务,因为因为任务本身它就不多,对吧?而且任务其实也不是特别复杂,所以内存咱们绝对是够用的,肯定是够用的啊。所以说这个呃对内占内存的,咱们你就看着给就行。
呃,如果资源比较紧张的情况下,这个你就得精打细算了,怎么精打细算,是不是就是用咱之前所学的去查看的每个任务务,它的个个是不是占的剩余空间,对对吧?你这个就得精大细算,咱这这倒还好啊,够用啊。行,那接下来我们往下走,下边一个咱要传的,先看参数,咱们应该传谁呃,传参这回应该是传该传这个参数了,对吧?
我们没有参数,那就直接就是闹了啊。好,下一个下一该那个优先级了呃,优先级咱们定一下我们目前这个当前的这个配置,呃,咱们去我就不用带大家去看了。因为咱们之前看过那个默认的是不是最高优先级是几来着?是是是是五对不对?但是咱们取值的时候,是不是最多是只能取到五减一,也就是四啊,对吧?所以最高优先级,也就是四那这个电源任务呃,它重要不重要呢?当然其实也重要啊,呃,怎么说呢?它也重要,因为你这个电源任务你要不执行的话,那是不是就有可能直接就关机了呀,对吧?
它也重要,但是它和谁和我们前面的那个后边的那个比如说那个呃就呃通讯任务和控制任务,控制电机那个任务比起来还是差一点的。所以这个咱不管不给最高,我们给三啊五点三啊。好,那给三其实也还好给三是不是只要我们的那个通信任务完成一个阶段啊,就是只要通讯任务,比如说完成一轮循环,它释放了CPU了。那这个呃非控任务,它完成一轮循环释放CPU了,那是不是就会轮到咱们这个电源让你去执行了,对吧?啊?OK我们电源任务它刚才也看到了,它是差不多二十多秒到三十秒,它是不是会会停啊,对吧?我执行的频率我我稍微的快一点不就行了吗?我十秒钟一次能理解吧,就是即便说我没有准时的十秒钟一次,因为其他任务没执行完,我没拿到CPU即便说不准时,那我是不是往后延,哪怕你延一秒是不是都没事啊,对吧?哎,所以这个大家呃无所谓,这个给给个三就行了,不用太高啊。行,那这个优先级呢,我们就直接给进来了。好,接下来最后一个参数,大家还记得时啥部是不是就是那个句柄了呀,对吧?那来这边我们声明一个这个句柄啊,来我们先来拿一下那个参数的类型逗号,应该是一个taskhandlet,对不对?
哎,我们拿过来啊。好,那这个咱们就叫做POWERpowertask,后边跟上一个啥就行。HANDLE啊OK好之后呢,这个我们需要把它的地址给它放进去啊,那放个指针来at一下。哎,好了,那这样一来我们就相当于是完成了咱第一个任务的创建了啊。好,接下来不要忘记,我们还得是不是启动一下这个调度器啊,对吧?呃,wetaskstartscheverOK行了,那接下来咱要做的是不是就在这个位置去干啥呢?同学是不是就是循环的去进行这个激活了呀,对吧?那我们就直接v二一就行了呗,对不对?v二一完了之后呢,我们需要在这里边是不是循环不断的去调咱们上边的那个呃函数啊,对吧?直接调INT后边这这一个IP五三零五tstar是不是就完事了呀?同学哎,好了,那当然这块呢我们不需要一直定了,咱们是不是每十秒,甚至是每二十秒调一次就行了啊,对不对?就这么个意思啊,所以这边呢我们是不是需要给它加个延时?哎,那加延时的话,我们下面讲过两个延时函数啊,一个是相所谓的相对延时,对吧?有一个是不是所谓的绝对延时啊,大家还记得那个概念吧,哎,两者的区别是什么来着?你要用那个所谓的绝对延时是能够严格的保证我两次这个任务是不是开始的这个时间它的间隔是固定的呀,对不对?而你要是用这个所谓的相对延时,它只能保证上一次结束和下一次开始之间的这个时间啊。好k那我们这儿用哪个好一点的呃,肯定是绝对要好一点。但实际上对于这个店源的人物来说也无所谓,对吧?哎,对吧?OK好,那所以这边咱们这样,我我们还是严格一点,我们用那个绝对吧?绝对延式绝对延式应该是叫做,是不是那个什么taskdelayuntil啊,对吧?大家还记得吧,然后他这有有个一个是带VV一个v一个是x它俩的返回值是不一样的,对不对?还记得这个带x它的返回值是什么意思吗?是不是真的延上时了,对不对?因为绝对延时,它是不是指定在未来某一刻把它唤醒了,对吧?那是不是有可能我这个任务执行的时间就已经超出了那一刻了,就有可能他没延上,对吧?没延上,它是不给你返回一个box,对吧?哎,是这样的,所以我们这儿呢无所谓,我们这肯定是肯定是能延上的啊。你你写两个GPL引擎,那才才才多长时间,对吧?我十秒钟一次,那肯定是能延上,所以无所谓啊,我们用这个就可以用这个的话,咱需要给它传入几个参数来着两个参数啊,一个是你上次的唤醒时间,还有一个是啥呢?
是不是这个时间的增量了,对吧?说白了,你要隔多长时间嘛,对不对?那咱这个怎么写,还记得了吗?还还能想起来吗?呃,我们是不是只需要在第一次获取一下,是不是当前的时间就行了。然后呢,把那个是不是指针传给它,对吧?然后这个函数里边它是不是每次呃呃演示完之后,它是不会自动更新那个值啊,对吧?它是会自动更新的对吧?这边会这样就行,我们往上走,这边我们呃获取一下当前的时间,获取当前时间应该是xtask,是不是有一个get呃get什么gett个count吧,这个是不是获取当前时间,对吧?那它的返回值类型,其实它叫做t个timet,但其实咱们都知道,应该就就是啊uin的三十二,对吧?咱就直接拿过来用就行啊。u键三十二。比如说我们叫做preTIME,对吧?让它等于它啊,完了之后呢,咱需要把这个东西它的什么地址给它放进来吧。哎,一个指针哎,写错地方方应该该放这。好,那完了之后呢,再写上咱们这儿到底要延长多长时间?呃,按照我们分析,比如说我这儿保守一下十毫秒,我十秒一次,十秒一次啊,十秒一次的话,咱这样我们也定一个宏吧。哎我们范啊。好,那这块呢我们叫做什么呢?叫叫做depowertaskperiod的这个没问题吧。同学啊,因因为我们目前目前咱们的这个中断频率是一毫秒,我们一个时间线是不一毫秒啊,对吧?那所以这边呢我要想延时呃十秒的话,这应该答写这是一秒的吧。哎,不是,这是这是一秒了吧,对不对?再拿一个,这这是多少,这是十秒的,对不对?哎,就这么写就行,来一个一万就行。说白了啊。好CTRL拿拿来之之后呢,把它在这,是不是就行了?呃,没问题吧,同学哎,好了,那这样一来的话,我们这个就是不是就写完了,同学这电源是取完了啊,就这么简单啊,就这么简单啊。好了,那所以接下来咱这样,我们给它编译,然后稍注一下,就是咱们需要去看一看,就是这一次它还不还会不会再自动的切断电源啊。这个咱们看一眼,上午我们已经看过了,它是不是会呀,对吧?哎,这捎进去之后,看,这次还会不会稍等啊,同学。哎,那现在呢我们给它捎录进去,好,穿进去了。然后呢,我打开这个摄像头啊,他怎么老好,呃,俯拍模式啊。OK好,那这样同学我现在呢注意你测的时候也是一样,一定要把这个线拔了啊,你要不拔的话,它它不会进入低功耗模式了,这个咱还是得尴尬的。等他这个差不多三十秒,我给你看看一下当天时间啊,哎呀,我这个还这看不了秒,这个没关系,咱这可以通过它看到没有五十五,对不对?五十五,现在是啊,刚才应该也就是五十,对不对?我们等到差不多这个呃等到三十吧,等到三十啊,嗯,稍微等会儿嗯嗯呃看看这次星币应该是没问题的啊,嗯,只要这个任务它能够正常的这个调度啊,它就会定期的去激活,它就看这个电源指示灯就行。
因为人家前面说了,是不是他关机的时候,连电源指示灯它也会一同给你关闭呀,对吧?
那现在现在是正常啊,没啥问题,现在几几几几点了,看一下三十六了,这个过了吧,已经这时间行了,那就说明没问题了。然后大家自己测的时候,你是呃等它三十秒三十秒没问题,那就没问题了。哎,行,那这个电源的任务我们就完成一半了,注意只是完成一半了,我们是是还没有去处理那个呃那个关机啊,对吧?关机,咱们到时候再说啊,再停一下视频。
15-无人机-飞控项目-灯控任务-GPIO配置
cpp
复制代码
哎,好了,各位,那接下来呢我们再一起来看一看这个灯控任务,咱应该怎么做。呃,首先啊先给大家梳理一下我这儿的一个整体的思路啊,呃灯控任务呢,实际上呢是把咱这个就把我这个就是呃相当于是我的么呀,我我这个呃这个这个板子上边的四个LED对吧?它的功能我做了一个划分啊,前边的那两个LED用来显示遥控的连接状态,遥控的连接状态非非就是两个,一个就是未接接,是不是一个就是已连灯那对吧?就这个状态没别的啊OK好了,那完了之后呢,呃如果是呃未连接,那我就让我这个前两个灯是熄灭的一个状态。那如果连接上了,我就让它常亮就行了。哎,好,那完了之后,我再把谁的把我这个呃板子上边后边那两个LED呃,把它用作什么呢?用作这个飞机状态的一个指示灯呃,会叫做飞行状态的一个指示灯。那按照这个整个的一个功能的分析啊,我这个飞行的状态呢,我一共总结出来的这样的四个状态,可能就是大家自己刚刚开始写项目的时候,你可能意识不到,就是我为什么要划分划分这样的几个状态,这个确实是这样的。这个我最开始我可能也想不全,这个东西一定是什么呢?就是你解完之后是不是总结出来了呀,对吧?
呃,实际上你真正开发的这个顺序,你这个灯其实不用,最开始就做。你看最后是不是设计好之后再去做也行啊,对吧?但是咱们按照这个有有简单到难的这个顺序来,我们就先做这个灯啊,呃就先给大家明确一下我们这样的划分的这样的四个状态,后边咱们写到后边你就能理解为啥是这四个状态了,对吧?那呃四个状态都是啥呢?一个是空闲状态,我也给大家说了,空闲状态指的是什么呢?指的是我们这个遥控是不是解锁之前的状态啊,对吧?解锁之前,因为你现在这个飞机,它是无论说是飞不起来的,所以它是一个idl控闲状态啊。好了,那什么时候进入所谓的正常工作状态呢?就是解锁之之后是不解以工作了,就是正常的状态态,对吧?好,那完了之后呢,我们还有一个就是工结的状态啊。好,那想让它定高,这个时候是定高状态啊,完了之后呃,faut也就是呃固故障状态,比如说我遥控失联了,我遥控没电了。对吧?这就是故障状态啊,一共定义了这样的四个状态。那这四个状态我怎么知道到底进到哪个状态了呢?是不是肯定也是通过相应的指示灯去给它进行展示的对吧?就这么个逻辑啊?好了,那所以接下来咱们要做的工作,就是去实现一下这四个灯的状态的控制啊。好,那怎么实现?咱们先不用管?呃,咱首先先干啥呢?同学我们先把GPI引角是不是得先配好啊,对不对?OK啊好,所以接下来咱们去配一下这个GPL引角。那正好我这个QMS也没关啊。那现在你要配它的话,这个是不是得看着咱的原理图去配了呀,对吧?我们再下原理图啊,找到飞控,然后呢咱找一找那几个小灯啊,看它在哪儿呢?
咱那个小灯儿啊,应该在这儿呢吧。呃,这是咱们那个LED一到LED四,这是咱的,是不是灯啊,对吧?来看一看这四个灯它是怎么接的呀?同学很明显呃,这个LED方光LED它的阳极是接到了哪儿的?唉,它的正极极不是接到了。呃呃,这个三点三伏啊,对吧?然后它的阴极是不是接到了我们的音角上啊,对吧?所以说呢我们要想让那个灯点亮还是需要,是不是输出低电平它来亮啊?对吧啊,就这么一回事儿啊。好了,那先来我们就重点看一看这个LED一二三四这四个引角都对应的是谁啊,这个哪能看出来?呃,当然你直接在这里边找也行,我看左边有没有给咱们写了一个相应的引角,右边写了吗?我稍微调小一点啊,呃,没给写,没给写,那咱就只能在这个芯片这块来看了,对吧?呃,在这儿呢吧,这是一二,这个是是不是三四大对吧?呃,但是这块儿比较麻烦的是啥呢?他没有说哪个灯在前,哪个灯在后,对吧?你比如说他没说LED一是我这四个里边的,前边的还是后边的,左边还是右,他没说对不对?所以这个咱就得咱就得试一下了,只能试了同学,这个稍微有点麻烦,那试咱就试吧啊,试就是啊。
好,那现在呢我们找到这个LED一二三,那我们现在去调一下,呃,我们先把引角配好吧,先配好再说啊,先配好再说。呃,首先我们去找一下PA十二和PA十一,对不对啊,我们咱们就开始配了啊。呃,PA十一嗯呃一个是十二,一个是十一,对不对?那咱们十二块钱啊,那这个咱们是应该是GPIO,是音部的还是output,肯定是output,对不对啊?好,那这个呢我们就来来什么就行?这个咱是不是来这个推瓦输出就行了,对吧?ok好推完。然后呢,咱们的电瓶默认给高还是给低各位呃,给高给高的话,也就是刚上电的时候,它是不亮的,对不对?呃,都行啊,都行,你愿给高就给高呃,我我这儿给低吧。我我想我想看到一个什么呢?就是我上电之后它它亮一下,就说明我这个上电成功了,我想给一个这样的一个效果啊,我就让这个灯也说白了,初始状态是不是全亮了,对吧?等正常工作初始化,完了之后,再按照我们前面的规定啊,我这就给低了啊啊,就让它先亮起来先亮啊,来low,那我就给low对吧?那下边推晚输出这个没啥问题,其他呢我们就不用配了啊,这个关键是userlabel呢,这个就有点麻烦了。我这个我也不知道它到底是前后左右到底是哪个,咱也不知道,一会儿咱们再就是咱们再调吧,这个东西我看就只能是这么着了,对吧?也没啥好招了啊呃,来吧,那咱就是先来一个LED它刚才原理图上给的是LD一,对不对?那我就LED一啊OK好,那接下来再来一个PA十一走,你这个一样的,也就是GPLOgood的啊。好,那这个我是不是都不用改啊,推晚输出,然后呢,默认是是不是这个低电平啊,对吧?哎,OK好,那接来来下边,我们来一个LED我就二就行了啊。呃下划线抬杆啊。行,那接下来呢我们再去看一看那个另外的那俩啊,另外俩一个是PB十五,一个是PB十四,对不对?那咱们就调啊,PB十五PB十四呃,还是搜一下吧。PB来一个十五,你找到它,这个也是GPIOoutput。
完了之后呢,找到他这边呢,咱们来一个LED三呃下划线三啊。ok好,那都不用改啊。然后下一个PP十四GPLoutput来找到他。这个呢来一个是不是LED后边跟上一个啥呃,跟上一个四是不是就行了呀,对吧?哎,好了,那这四个我是不是就都配好了,对不对?那所以接下来咱们要做的工作,是不是就是去进行相应的调整了呀,对吧?来吧,那现在我们先把这个代码生成一下啊,大家稍等好。那现在已经这个生成完毕了,升完毕之后呢,我们来到这里,首先咱们去改一下那个IT这个就有点麻烦了啊,改吧?呃,找到这个靠找到SRC找到IT点c啊IT点c那完了之后呢,我们给它加上那个下下划线呃,下划线啊,ASM啊OK拿过来controlc往下翻往下翻,往下翻往下翻,找到哎,那个往上啊,应该是这个嗯。行,那现在我们去编译一下啊,编译完之后烧录应该点击之后,应该会全部都点亮,对不对?哎,来,那现在我们就开始啊,呃我没查,我查看下来给它刷录进去。好,那现在我们看一下这个有没有全点亮啊,呃,大家能看清不亮了啊,亮了四个灯,这四个角数全亮了呀,对吧?呃,亮了之后,接下来咱们要做的就是测试了,你得测一下,就是哪个对应的,到底是哪个啊?
呃,这个咋测呢?这个东西呃,这个其实你就只能一个个试了,对吧?呃,我就给大家演示一下,怎么怎么测测啊,就不用每次都去,每次都去通过这儿改吧。你要通过这样改的话,那是不是就有点太麻烦了。同学,因为每次你重新生成代码那边是不是咱们都得去改那个终端呀?对吧?太麻烦了,咱直接进到哪,直接去改这个源码,这儿是不是有一个呃,GPIOEneet啊,对吧?哎,这注意看我这个在慢点c里面方法里,对吧?这是不是就是初始化那个GPI引角,对吧?你就点进来,你来之后呢,哎你看这是不是就是在配置咱们这相当于是四个引角,他们的这个呃不是这是高电平,这是配咱那引角吧,这是不是配这四个LED引角的这个就是呃初始呃初始质量呀,对吧?唉,所以接下来咱怎么着你位同学,我们就在这儿去进行这个相应的测试就行了,对吧?呃,你看啊它是俩角角属于因,因为我们PB两个PP两个个不对,所以这俩是一起设置的。你要是测的话,你得得给它分开啊。那所以咱这怎么写同学来。比如说我想看一看咱们的这个所谓的这个LED四是哪一个?那你这个就怎么配就行,你把这个是不是给它去掉,没没没问题吧。同学哎,然后呢,这个给他来一个reset,呃,当然这个我我删吧,嗯这个能看明白吗?就是这个我是不是一二,现在现在都是啥都是reset,那它是不是应该都是点亮的一个状态呀,对不对?然后呢,我给谁我单独给那个四一个啥,哎,我单独给四一个什么是不是set,那是不是也就是只有四是补亮的呀,对吧?那嗯嗯能能理解吧。那这样一来,你是不是就知道这个四到底是位于咱们这个前还是后还是左还是右了呀,对吧?哎,就是这么个意思啊,所以接下来呢咱们我这在做测试能看明白的同学就测完之后,一会儿咱这个是统一还得去在q版MS里面还得改一下啊,对吧?哎,这个我们编译,然后捎录进去。好,那现在咱们去看一下这个效果。呃,可以看到我现在是哪个灯灭了,注意啊,注意大家得得看清楚,我这个机头是朝哪边的。我我给大家调一下这个方向,我这个这是天线吧,同学这是天线啊,这是我的天线,这是我天线,也就是这是我的前边,对不对?这是我前边啊,所以说我现在灭的灯应该是是不是这个呀?这属于我的leftbottom,我的左边的,我的下边,我的左下角对不对?哎,OK那这个就是LED几,呃,这不就是那个四嘛,没问题吧。所以这块呢你稍微的记录一下同学啊,你在个地方方记一下来,那就就LED四。那我们这个对应的是对对应的,应该该left我们叫做BOTTTOMleftbottom,是不是?是是下下对吧?
LEFT那只能就是通过这种方式去试了,没啥好办法啊。同学那所以接下来呢我们再去试一下。呃,另外一个我们把三也试出来,这个你试的话是不是它俩稍微的调一下就行。当是它是side它是reset对不对?这回应该就是三是灭的了啊。OK好,那现在我们快速来一下啊,这个这个有点有点儿嗦嗦这东西啊。好,那现在看一下,那现在是不是也就是我的右下角现在已经灭了呀,没没错吧。呃,右下角,那也就是我的三,应该是右下角的那所以接下来呢咱们应该是LED三,就是谁?就是呃应该是RIJ,是right,是不是包特姆啊,对吧?右下角啊没问题吧。同学哎,好,那接下来我们再继续往下进行。呃,现在这俩咱们呃把它有实验,他有实验啊,有实验是吗?
能看清吗?啊,能看清吗?能哦,能看清是吗?没有钱长官,他让我看一下,我们以为你发四月份啊啊啊。对的。对的,我看一下六岁啊,这个四那左下角那个呃,然后三是那个另外人的,哎,那得那就不用改了,行行行,那就不测了啊。行,那这个咱就相当于是呃找着这个这个思路了,那咱就直接去调就行了。所以这个代码咱就不用改了,一会儿是不是它重新生成自动就再覆盖了呀,对吧?
好,那我们现在去改一下啊,来吧。好,我我的锅这把我的锅来吧,那现在咱们去改一改。那首先呢我们找到LED三,刚才这个咱们测出来之后,应该是LED,它是不是位于那个呃左下角啊,对吧?四十维左下角的啊,应该是你就直接给它改成left的什么BOTTOM是不就完事了LEDleftbottom,这个没问题吧。哎,好,那接下来我们再看改这个三啊三刚才我测出来之后,应该是rightbottom吧,对吧?来,我们这儿来一个,rightBOTTOMBOTT啊TTOM啊,这个没问题吧,这个我看对不对啊?BOCO没问题啊。好,那接下来我们再看这个一和二这个一和二呢应该就是呃看一眼呃,这个一啊带住了啊,一应该是左上角的那就是lefttop啊,那我们就改一下left,后边我们来一个top。好,接下来我们再改一下这个这个呢应该就是是righttop了,对吧?right?好好好了,这个是不是就完事儿了,对吧?行,那这个就完事完事之后呢,我们再重新给它generate一下大家稍等啊。行,那这个给它关掉,关掉之后,接下来还是得去改一下那个IT啊这个这个这个这个这个这个给它加下划线下划线ASMassembly。嗯,哎我看看啊,你给他加在呃,没地方讲,就是就就只能这么着了,来吧,完事儿哎,行了,那接下来呢我们再重新编译啊,这回应该就是咱这个方向呢,就算是给它规定好了,知道哪个是控制哪个的了啊。好,那行,那也就是GPI远景,咱就配好了。这个配好之后,接下来咱就可以去写这个相应的逻辑了,对吧?啊,哎我先停一下视频。
16-无人机-飞控项目-灯控任务-编码-上
cpp
复制代码
呃,来我们去搞一下这个接口层,接口层,我们应该进到哪儿?我们进到呃应该进到INT对吧?进到INT啊,进到INT这边来之后呢,呃,我们注意啊,你创建路径的时候,你点一下这个INT呃,他这是不是点谁之后,下边选中会有一下划线啊,对吧?在这个目录下边创建新的目录啊呃INT这个呢我们叫做LED对吧?哎,好,那现在我们里边创建两个文件,一个叫做INT后边LED点h,对吧?
再来一个INTLE点c啊INTTEED点,我们来个点c行了。那这个完了之后呢,我们接下来就可以去写相应的逻辑了。来吧,咱们开始声明这个对应的声明对应的这个函数啊。呃我们前面讲过,就是按照我目前的分析这个LED的状态呢,它其实一共是有多少种啊,呃好多种,对吧?但是我们总结一下之后,你会发现其实就是可以说是三种吧,要么就是常常灭,要么就是常亮,要么就是闪烁对吧?但是闪烁的时候,我这个频率是不是有高有低啊,对吧?哎,所以接下来呢咱们定义这样的几个方法啊,来注意观察一下我这这么定义。首先来一个INTLED我叫做什么呢?叫做on,这个是点亮,对吧?再来一个INT后边LED这个我叫做啥呢?叫做off,哎,这是熄灭,对不对?再来一个OI呃word后边再来一个INT再来一个啥呢?LED咱叫做blink,叫做闪烁,这是不是?一共是三个这个方法呀,对吧?但是大家要注意的是,这三个方法咱是不是得有参数啊,要不要有参数,同学得有参数啊?因为我是不是一共有四个灯需要去设置啊,对吧?啊,那每个灯咱们要求都可以进行独立的设置啊,所以说你想试哪个你能给它传参才行啊?好,那所以接下来大家分析分析这块咱应该怎么写这个相应的逻辑。呃,传餐的话,我传什么餐呀?其实是不是就是传一个GPIO的port再传一个GPIO的pin就行了呀,没问题吧。同学哎,所以咱这样啊,就是为了方便,我们传参我们这回不直接传俩它了,我们定义一个结构体吧,我们定一个结构体,然后把这个的把这个pport和p是不是都封装到这个结构体里啊。
对,我是完事之后呢,我们将来再声明四个结构体变量代表咱这四个LED那我是不就可以把直接把结构体传进来了呀,对吧?这样方便一点啊OK所以接下来咱这样,我们再重新的去创建一个对呃一个一个文件。咱们在咱们后边还要声明很多的结构体,我们所有的这个类型定义呢,我们都统一的放在一个文件里啊。好,这边咱这样这个公用的东西,咱是不是理论上按照我们分析放在com层啊,对吧?所以我们这样来一个COM啊COM里边呢我们去创建一个新的文件,叫做COM后边来一个啥,我这样呢就叫做typc点h这个没问题吧。各位哎OK好了,那当然呢呃com里边将来可能还会有其他的东西,所以我再套一层目录吧,这个叫做type啊。好,那完了之后,我在里边声明一个文件叫做COM后边跟上一个TYPE点儿typec点h。哎,好,那因为我们是不是只需要在这里边去声明各种类型就行了呀,咱们是不是呃不需要写原文件呀,对吧?所以说我们就只要一个h文件就可以了啊。好了,那接下来呢我们就在这里边来一个hider,然后里边咱们去声明一下这个相应的类型啊,咱们先定义。对对呃呃,第一个类型,咱们这来一个直接来一个啥tytype范,对吧?那完了之后呢,我跟成一个啥,是不是就是desportSTRUCTspart完了之后呢,咱们这儿直接就是起别名了啊。呃我这叫做什么呢?我这儿就叫做LEDSTRUCTspect这个没问题吧。同学然后里边咱是不是分析了,我们需要有两个这个属性,对吧?一个是port一个是啊,那这个类型是什么?咱咱们可以拿一下呃,这个从哪拿,咱从这儿拿吧,这个刚才这儿是不是咱写过呀,对吧?找到ppredpin,是不是就是这俩没没没问题吧,各位哎,好了,那所以接下来咱直接把这俩给它拿过来,我就给它放在这儿就行了啊。完了之后稍微调整一下啊,这个呢我们给它改成得改成分号吧。嗯没没没没问题吧,同学哎,好了啊。那这个咱们给它定义。好,当然这个类型他这儿能拿得到吗?拿不到拿不到,咱得怎么着得引头文件,对吧?引谁点GPIO是不是就肯定是没问题的呀,对吧?哎,隐搭就拿过来了啊。行了,那完了之后,我们改个名字吧,这个我们不叫这个了,有点难看啊,咱们就叫做port行不行,这个我就叫做骗,行,不行,没问题吧。哎,好了啊。行,那这样一来我们这个结构体的定义就算是定义完毕了啊。所以一会儿啊同学在LED这边呢,我们传参,咱就这么传啊,注意我现在找到谁呃,找到LED点c呃,找点h吧,点h点h点h在这儿啊,在这儿。那所以一会儿咱这传参,嗯,我想点哪个灯,那我就传一个是不对应的结构体就行了呀,对吧?哎,好了,这边,咱这样,我们呃英可录一下,你得把那个type四点h得拿过来,对吧?COML那个COM我是不是还没加?那个我加没加没加,咱们得加一下啊。呃大家现在能跟上吧啊,能跟上啊,因为还好还好啊,然后普通文件夹来,我们找一下那个COM对吧?点进来。行,那这个咱就呃搞定了,那现在能跳过去了啊,接下来在这里边呢,我们就去定一下它的参数类型啊,这块呢我们就直接直接叫啥LED是不是spa就行,对吧?呃,注意你这块儿这个类型咱是直接就是结构体,还是让它传一个指针针来呢,就是传个指针比较好,对吧?哎,OK好了,我们这儿直接来一个LED啊OK好了,那这个咱就定义好了。紧接着我们定义下边一个啊controlz拿过来,哎,想点谁,你就把这点亮啊,你就把把这个结构体传进来,然后进来就是它了啊。那这个光传一个LED行不行?同学这个就不太合适了,为啥呢?同学你要知道的是我们将来要干啥,将来,咱是不是要就是这个闪烁啊,我是不是可能会让这个灯以各种不同的频率去闪烁呀,对吧?所以我这儿呢是期望咱们实现一个就是比较通用的方法,这个通用的方法通用在哪儿呢?就是你想让它以什么样的频率闪烁,它就以什么样的频率闪烁,也就是说这个闪烁的频率,我们应该通过什么样的方式给它传进来呢?参数的方式,对吧?哎,所以这边呢咱们再定一个参数啊,这个参数我们就来一个uit十六应该也就够了吧。我这个给个呃周期我叫做periodPERI呃呃RIOD对吧?哎,这是我闪烁的周期啊,至于我们这个具体怎么实现,这个咱们就一会来说,我先把这几个方法给它定义出来。大家现在能能理解这个事儿吧。哎,好了,接下来我们实现一下啊,呃,走你呃,这个呢也是呃,走你啊,这个也是一样的啊。唉,好了,那呃呃这样时间有点长了,咱们这个具体的内容,咱下节课再写吧。啊,我们这个先到这儿啊,呃然后一儿下节课,我们实现一下这三个方法啊,这个实现完了之后呢,灯控咱们就算是基本搞定了,灯控搞定了之后,咱们这样呃,我们今天下午的呃,咱们再多多写点,一会儿,再让这个电机也转起来吧,让电机也转起来啊,咱今天基本上就完成这些就行了啊,来把这个视频停一下啊。
17-无人机-飞控项目-灯控任务-编码-下
cpp
复制代码
嗯,好了,各位,我们接下来开始实现这个灯控的这几个任务,你要开和关这个都没啥可说的,非常的简单啊,呃这个我就直接放在这儿了。呃,放这之后呢,我要做的事,是不是就是说白了就是写这个端口啊,对吧?哎,好了,那你看这次咱们封装到里边之后,我们直接这么写的不就行。GPLredpin,然后呢LEDportLEDpin,这是不是没事啊,对吧?啊,将来这几个LED的,我们再自己定义就行了。好,这边我们应该来一个GPIPinside,还是resetreset吧。
因为我这个是要点亮的对吧?哎,好了,那同样的道理,这个拿过来,咱们应该给它放在哪儿,顺便给它放在这个位置啊,对不对?这个我们来个啥,我们来一个是不是就是set就行了,对吧,这个是不是就关了呀?对吧?好,那接下来下边这个的同闪烁闪烁,其实应该就是理论上按照我们之前的逻辑啊,是不是应该就是耗直接就是GPL他go聘就行了,对吧?按理说就这么写就行,对吧?呃,但是但是我这个周期我这块我怎么去进行控制呢?闪烁的周期这个事儿可能目前咱们没法写,对吧?啊,这个确实是这个必须得结合着我那个就是咱们那个灯控任务的整体逻辑呃,来分析。就是这块那个呃周期应该怎么控制。所以这个我们暂时先不写同学,这个暂时咱们先吐吐啊,咱们先吐吐。那一会儿呢,我们再再来写这个东西啊,我先吐吐一下嗯,来速度呃补助啊。
行,那接下来呢我们回到这个freertostask点c这边来,我们先把这个灯控任务给它创建出来。完事儿之后,咱们再去干啥再去写那个就是呃闪烁的逻辑啊。好,那既然要有灯控任务了,所以我们先不说别的,我们先把这个是不是得搞出来啊,对吧?来一个灯控任务呃,换一下灯控任务。哎,好了,那现在这里边呢就让它快速的提示就得了啊,来走REtask哥,这个呃也幺二八就行,没啥问题啊,来走这个优先级呢,这个灯控任务的优先级,大家说它着急吗?
同学这个是不是不着急啊,对吧?哎,所以这个优先级咱们也不给太高,我们给个二就行啊,来接来往下走。这个LEDtaskhandle,这个是不是也就完事了呀,对吧?好,接下来我们把这个灯控任务先给它创建出来啊,来我们写一下这个注释呃,创建啊灯控哎,任务任务啊。好了,那等他给咱们提示吧。那行了,灯控任务现在就创建出来了,没问题啊。好,接下来实现一下这个函数来吧,看看咱这儿咋写,呃,看看咱这儿咋写灯控任务,这个有点难度啊,说实话呃,来吧,同学还是结合着咱那个图去看,呃,这是遥控的。我们看这个非控的啊,结合这个图去看。那结合这个图你分析分析就是咱这个灯控任务应该怎么写?灯控任务。说白了,它是要显示什么显示遥控的连接状态,以及我们这个飞机的飞行状态,对不对?那你想想这个遥控状态是不是可能随时改变,对吧?我有可能遥控,刚开始没连接,我现在突然连上了。那连完之后,我一会是不是还可能会断开呀,对吧?那能理解这个事儿吗?哎,好,那同样道理,我的飞行状态是不是也不是固定不变的,它有可能在任意时刻是不是发生切换呀?
没错啊,同学,所以说你觉得咱这儿应该怎么着呢?我应该让这个灯控任务定期的周期性的去实时的,是不是查看遥控的状态以及飞机的状态,对吧?一旦他们的状态发生变化,那LED的状态是不是也要随之发生变化,该应该是这么个逻辑吧。哎,哎好了啊,所以说这个灯控任务我们其实也是要是不是一直去执行啊,一直外绕循环,对吧?循环的去干啥呢?去根据呃当前的遥控状态和当前的飞机状态去设置,是不是LED的状态,应该是这么一个思路吧。同学哎,好了啊。那当然这个遥控状态怎什么时候变这个飞行状态什么时候变?那这个是不是由谁说了算,同学是不是由人家遥控说了算呀,遥控连上之后,那我们这边有通讯任务,通讯任务是不是得去负责去修改这个遥控状态,能能理解这个事儿吧。哎,ok好,那遥控还可能会给我们发定高啊,等等这样的一些东西。那这个定高来了之后,我们是不是也要去根据这个遥控发过来的数据去设置这个飞机的状态,对吧?所以怎么设置这几个状态,我们暂时先不用管,咱们现在呢就先关注什么?就是怎样根据这些状态去让LED以不同的状态进行展示就完事了。哎,ok好,这一点大家先先理解啊。好了,那接下来我们就开始呗,呃,怎么着了,同学怎么着?哎,其实这儿首先咱们先明确一个这样的问题。同学啊,你看这个遥控状态也好,飞机状态也好,它是不是会有两个任务会被两个任务用到啊,一个是咱们的灯控任务。还有一个是这个是不是通讯任务啊?没没没多少同学,所以说这应该是属于什么,这叫什么,这叫共享变量,好吧,那大家能理理理解这个事儿吧。同学哎,是共享变量了。那既然是共享变量,我们在前面学freeRTS的时候,是不是就得考虑到这个什么问题,是不是线程安全问题啊?没错,同学OK好,那问一一大大,咱咱这一会儿你你你说白了,你这个遥控状态也好,飞机状态也好,我们说白了就是定义两个程序变量呗,权益变量是不是让这俩任务一块访问呀,对吧?那咱们要不要考虑这个就是现程的安全问题。呃,前面也讲过什么时候是一定会有这个安全问题的呢?就是两个任务访问共享变量,它都会怎么着都会写,都有写操作,是不是有可能出现呀?但是咱这儿你分析分析,我们是两个都会写吗?其实不是,是不是我们通讯任务是不是负责根据遥控发过来的数据来去改这个遥控状态,或者是改这个飞行状态呀?它是写对于灯控任务来讲,咱们其实仅仅就是啥,我就是读这个是不是不不会出现这个所谓的安全问题啊,对吧?所以这个你可以放心的去使用这个共享变量啊,你不用去加这个什么临界区这些东西能理解这个事吧。同学啊,这一点要注意一下啊。好了,那所以接下来咱这样的同学呃,我们接下来要怎么做呢?
我们先去定义两个呃所谓的全局变量,一个表示遥控状态,一个表示飞行状态。呃,然后呢咱们再根据这俩个变量,然后呢去设置我们的这个灯的这个状态,就是这么一个思路啊。好了,那为了方便啊,我给这个遥控状态,我定义一个枚举类型,那飞机状态也定一个枚举类型,这是不是应该是很合理的一个操作呀,对吧?合理啊合理。那接下来咱们就去定义一下,那既然又要定义类型了。所以按照我们目前的这个项目的结构,我应该在home的types里边去定义,对不对?好,接下来咱们开始啊,首先我来一个type范,呃,后边呢我们跟上一个一呢啊,然后里边呢咱们去写一下这个相应的逻辑啊,我先把名字写出来。
这个我们比如说叫做遥控的这个状态,我就叫做derEMOTEremotestatus。这个没问题吧。同学哎,ok好了,这是咱们第一个枚举啊。好,接下来呢我再定一个枚举类型,这个咱们叫啥呢?这个叫飞行状态,我就叫做FRIGHTflightstatus。这个没问题吧,同学哎,好了,那接下来我们先定义第一个,第一个咱们只有两种状态,一个就是连接一个,就是未连接,对吧?哎,所以接下来我们写一下啊,这个未连接,我们就叫做unconnected,对吧?UNC呃ONNECTEDunconnected,这个没问题吧。哎,OKK那完了之后后呢,是不是就connenected的呀?哎连接未连接啊。好,这个我写一下注释吧,这个是什么?是遥控状态啊呃呃,遥控状态啊。好,那下边这个呢是咱们的飞行状态,对不对?飞行状态?好,上面这个结构体这是什么来着?是那个LED是不是结构体啊,对吧?嗯,OK好,我们把这个定义好啊。行了,那接下来呢我们再去定一下这个飞行状态,飞行状态这个有点多,我们一共是四个状量,这是我自己设计的,对不对?好,所以我把这四个状态呢,我都给它呃定义出来。哎,好,咱们定一下吧,咱咱盯在这儿,照这个写一下啊,呃,应该是有一个是idle状态,对吧?ID是不是EL啊,对吧?来下一个,这个是是rnormal,对吧?NORMAL这个没问题。再来一个呢就是fixhead。HEIGHT对吧?呃,再来一个就是falt故障。FAULT行了。那这样一来我们这两个是不是状态,就算是定义好了呀,对吧?定义好之后,接下来我们来到哪儿?我们来到福RRQttask点CE那刚才按照我们的分析,我们是不是应该定义两个全局变量作为共享变量,供这个两个task去使用了,对吧?那所以我们定义全局啊选局,那我们就在上面定义吧,来在这个位置。首首先我们定义一下谁,比如说我们的遥控状态。哎,好,那第二一个呢,就是咱的那个是不是飞行状态呀,对吧?哎,好了,我们在这定义一下,那当然呢你要定义的话,是不是得用到咱那个types那个文件呀?对吧?咱们也include一下啊,应该是c哎COM后边跟着一个types点h啊。好了,那接下来呢我们回过来,咱们去定义一下啊。首先咱们定义第一个,也就是REMOTremotestatus,然后呢来一个remotestatus。MOTESTAQS。好,那我们是不是可以给它一个初始值啊?同学初始值,咱们是连接还是未连接啊,咱就咱就未连接,是不是就行啊,对不对?OK好了,那接下来呢定义飞行状态,也就是咱那个是不是flightstatus啊,对吧?这个叫做那这个初始状态,咱们给它一个啥飞行状态,那肯定是fststatidol吧。IDEL这个没问题吧,各位哎,行了啊,行了。那现在呢我们这个定义好了,定好之后,这就相当于啥啊,是不是就相当于是我那个结构图里边的这个和这个呀同学,对吧?将来通讯任务要去改这俩变量的值。然后呢,我们登录任务,根据这俩状态的值去设置RE的状态,不就是这么个思路嘛,对吧?
好,接下来咱们就开始了啊,来吧,我们往下翻,各位看看咱这儿怎么写,咱就开始了。
呃,怎么演东西。首先呃咱们这个灯的状态它不是一直不变的,它是需要是不是任都呃随时可能发生变化。同学大家说是不是这个逻辑随时可能发生变化,因为我遥控的状态随时可能连接,可能断断联,对不对?那我的这个飞行状态,同时可能定高,也可能出故障啊,也可能进入idl,是不是随时可以变化呀,对吧?所以咱们这个LEDtask呢,它必须怎么着同学,它必须得一直循环,不断的去根据什么?是不是我们前面那俩全局变量的值,它来修改这个LED的状态啊,它应该是这么一个思路啊OK所所接下下来咱们就开始啊。哎,所以这个必须得在YO一里边写,对吧?哎,好,那我多长时间去检查一次这个状态呢?多长时间去检查一下咱们这个比如说飞机的状态呃,或者是检查一下遥控的状态呢呃,其实无所谓吧。你比如说我让他五十毫秒检查一次行不行?行,你五十毫秒,就相当于你一秒钟就让它检查多少次,五十次嘛,对不对?注意它仅仅是这个灯的一个反应速度吧,这个是不是无所谓,你让它稍微的慢一点也行啊,慢一点,它省CPU资源嘛,没必要频繁的去检查。好,所以在这边呢,咱们哎给它来个啥呢,来个五十毫秒吧。呃,我这儿也定一个它的执行周期啊,来这边我们来一个范啊,这个叫做delEDtaskPOD的对吧?那我们这儿呢,比如说来一个五十毫秒检查一次,那就行了啊。好,那咱这按照之前的逻辑啊,我们统一都使用啥,咱咱都用这个吧,咱们都用这种就是LEdedeleutil的这种方式没问题吧。来,我们先获取一下这个前一个时间,然后呢,咱再把这个controlc给它拿过来,这个就无所谓了吧。那个是这是就不分,我是先执行还是先延时了吧,对吧?
所以这个无所谓啊。好,那接下来那我们就在这这写呗,相当于我每五十毫秒是不是都会去检查一下LED的状态啊,对不对?
好,那接下来咱就开始呃检查查一下那个那个遥控的连状态态和飞行状态啊。好,这块儿怎么写?呃,每轮循环咱是不是都得去检查一下,遥控的连接状态,也得再去检查一下谁是不是这个飞机的状态呀,对吧?哎,所以你就得在不同的状态下去设置咱们这个LED的什么呀?这个状态嘛,是开是关你还是常亮,还是那个闪烁,对吧?哎,这样应该怎么写呢?呃,来吧,我们来个switch吧OK好,我们先检查谁呢?我们先检查这个remotestatus,这是一个全局变量,我这儿是不是能直接访问呀,对吧?那完了之后case啥呢?它无非就是两种状态嘛,对不对?ok好case,如果说他现在是啥了,如果现在是unconnected呃,按照我的定义unconnect的,我是不是要让我前两个灯怎么着?我要让我的前两个灯是亮还是灭同学呃,灭对不对?OK好,那你就得把这俩灯给它灭了,对不对?好,那完了之后呢,我们再往下走。好,那是不是还得再来一个casecase之后还有一个什么,是不是还有一个connected的呀,对吧?哎CONNECTED哎,是不是还有连接连接的话,我是不是就得让我前两个灯怎么着?我得让它亮,对吧?大家能理解这个事吧?哎,好,所以接下来咱们就需要在这个里边去干啥,是不是去调用咱们前面的INTLED后边你是按还是off,是不是在这调就可以了呀,对吧?那大家能想明白这个事儿不哎好了啊。那当然这块呢我需要引一下咱们LED那个头文件啊。好,这边拿过来INTLED后边呢我们拿一个啥呃,咱们就来一个INT后边跟上一个LED点h就行。你先不用管那个闪烁的事儿,闪烁那个事儿可能不好不好处理没关系,我们先把常亮长按先给它搞定啊,来吧。那也就是在这里边呢呃,如果我这次判断发现我的remotestatus已经变成了unconducted了,那我现在就要干啥,我是不是就要把我前两个灯给关闭啊,对吧?所以这应该是LED后边来一个啥,是不是off啊,对吧?好,那完了之后,咱是不是得给它传一个LED那个结构体的指针,这个大家没问题吧。哎,好了,那当然这块其实我们这个结构体是不是还没有定义出来呀?呃,所以接下来呢我们把这个结构体给它定义出来。
这个结构体我们其实可以定义为全局变量,你也可以定义为LED那个任务的一个私有变量,说白了是不是只有那个LED那个任务才会去访问LED这个结构体啊,对吧?啊,这个都行,我就定义成全局吧。这个咱们看起来方便一点啊,到时候这块块呢可以定义下这个是我们的remote结构体啊。好,那我们一共需要生有几个同学是不四个灯灯,对吧?首先LED呃STRUCTLEDstort啊。那这个咱们拿过来呃,拿过来之后呢,我们这儿就得起名字了啊,咱这是不是得分呃,前后左右啊,对吧?这个拿过来啊,来,我先定义第一个LED比如说我来一个lefttop,这是不是就是我的左上角的那个灯啊,对吧?
好,那它应该等于啥?咱是不是初始化的时候直接赋值啊,对吧?直接赋值,我们这里边一共有几个那个属性来着两个。那所以说我们这儿应该是LED是不是来呃left呃,然后后边来一个top再来一个啥,再来一个port吧,这这个没问题吧,这儿能不能跟上去,我是定义了一个这样的这个结构体是我们自己声明的啊,然后里边呢两个属性,一个是它的泡in一个是它的pin。那我在初始化的时候,我在生命的时候直接进行初始化,这个没问题吧。
哎,好,这个搞定啊,接下来呢我们再把另外的三个LED也都用同样的方式给它声明出来就行了啊,这是左上这个是呃右上。那接下来呢我们再来一个,这个是左下,这个呢是呃右下哎,这个应该是提示它给咱们自动生成应该是没问题的啊。好,有问题的话,咱们再改行啊。这样一来我们四个灯是不是就声级好了呀,对吧?好,接下来我们往下走啊,各位在这个位置,我现在我现在你看啊,我现在的遥控的连接状态是不是变成了已经断连了呀,对吧?断连按照我的定义,我的前两个灯儿是不是得怎么着得熄灭啊?所以那应该是他后边跟着一个谁,是不是咱们得传地址啊,对吧?应该是LED是lefttop吧,我这个top指的是哪儿啊?我这个top指的就是机头的能理解吧,top上下上指的是机头下,指的是机尾啊OK好,这一点要注意。那所以这个当然我就给它熄灭了,那除了它要熄灭,还有谁要熄灭?INT后边我再来一个LED后边来一个OFF啊,后边是不是righttop也要给它熄灭呀,对吧?我这个思路大家能跟上,不就是我这么写,有同学可能会觉得啊就是如果我这个呃遥控的连接状态,我长时间一直不变,我一直都是未连接。那你这个相当于是不是每五十毫秒都要去关一下这个灯啊,这个这个也不影响啥吧,我关它是不是仍然就是我我重复的关它是不是依然也一直都是不点亮的一个状态啊,对吧?所以这个不影响啥啊,这个没事啊。好,那接下来我们往下进行,下边一个就是连接上了,连接上了就简单了,我就只需要给它怎么着就行,我就给它点亮了,是不是就行了呀,对吧?我把这俩off是不是统一的,给它改成啥改成on就行了呗。好,这个大家现在能能哎,怎么没了,来哪一个啊?好,那现在是不是就完事儿了?同学哎,好了,那也就是到目前为止,咱这个所谓的遥控的连接状态的一个逻辑,咱就写完了。
哎,好,咱们测试一下。同学那按照我们目前的分析,我这个遥控的状态,默认它是初始值是unconnectt的对吧?所以我现在呢捎录进去之后,那咱的这个前两个就是机头的两个LED它应该是灭了一个状态吧。
那它呃这是我的机头,这是机头啊,我这呃这么看转过来,这是不是机头,对不对?那现在它是不是就已经是灭了一个状态了呀,对吧?
哎,好了,那说明我现在那一会儿,我要是把它给它改成啥,我给它改成那个呃connected,那是不是就点亮了呀,对吧?哎,所以将来啊另外一个任务,也就是那个通讯任务,它只要去改变这个remotestatus。那我的LED是不是就会立即跟着进行变化呀,对吧?啊,当然也不是立即我这个LED变化的周期是多长时间呀?五十毫秒啊,五十毫秒已经很快了。其实对于这个灯来讲啊,它没必要太快嘛,对吧?一个灯嘛,对吧?好,那这个它就搞定了,接下来呢我们再去处理一下呀,是不我们还有另外两个灯的状态,需要去主处理啊,对吧?另外两个就是没了,就是那个呃飞行状态了,对吧?啊,咱这是不是也同样是来一个switch就可以,对吧?呃,飞行状态,这里边呢我们应该写一个flightstatus。好了,完了之后,我们在这里写上它这个相应的判断逻辑啊。ccase首先IDEL是不是有idle对吧吧?哎,好,那同样的道理,我把另外的几个状态也都给它声明出来啊,来我回车,我回车走,咱们再改啊,有add是不是?还有一个是正常状态,也就是normal啊,对吧?来我们来一个NORMEL好,还有一个啥来着?还有一个fixhead,对吧?定刀还有一个什么来着?还有一个是fortFUYLT对吧?好,那接下来咱们处理这个,你看这个点亮跟熄灭这个事儿好说,关键是闪烁,对吧?呃,我再明确一下同学,我的定义是如果是爱豆状态,那我要让这个灯它怎么着低频闪烁闪烁的慢一点。哎,如果进入到noml状态之后呢,我要让它高频闪烁,是不是应该是这么个逻辑啊?哎,好,现在开始咱把这个闪烁的逻辑写一下啊,怎么着呢?同学怎么着啊,呃怎么着?同学,我的思路是这样的啊,就是甭管怎么着,你就直接调咱们INT那边提供好的方法就行。
咱是不是有一个INTLEDblink呀,对吧?好,那我应该是让谁让咱们后边的那两个灯是不是进行闪烁呀?对吧?所以说我们需要给它传入,是不是咱后两个灯的指针,对吧?也就是LEDleftbottombottom是不是就是底部,是不是就是机尾那两个呀,对吧?好,高频低频闪烁,低频闪烁,说明我这个闪烁的周期我要怎么着,是不是我要我要长一点啊,对吧?我那个参数是周期啊,同学来,我这比如说给个一千千好同样的道理,那你说下边边儿应该怎么着呢?
是不是应该是让INT后边来一个LEDblink,然后那里边我们给它传啊。好,应该是rightabout,这是是不就是我机尾那俩单儿啊,对吧?好,我把这个传进来,然后另外一个,比如说进到tonovel模式之后,我想让它干啥,我想让它高频闪烁,高频闪烁这块儿,你是不是这个比如说我来个一百,哎,这回是不是闪的就非常的快了呀,对吧?哎,好,我这儿想实现的这个编程的逻辑就是这样的,就是这样的。好,那大家现在想一想,你说我那个blink方法,咱这儿应该怎么实现,大家想想怎么实现啊?大家一定要记住啊,就是这个方法它是不是会周期性的执行啊?没没问题吧。同学就是在比如举例子,如果我现在一直处在idle的这个状态下,我如果一直处在idle的状态下,那这个方法是不是相当于会一直循环不断的执行,没没错吧。同学,那他执行多少次,他执行多少次呃,就是就是多多多长时间执行一次,是不是按照我们这个周期来,我这儿是五十毫秒,是不是执行一次,对不对?
但是我期望的我这个闪烁的这个呃这个这个这个频率是五十五十毫秒一次吗?同学不是我期望它是怎么着呢?是一千是不是毫秒,我改一次状态,一千毫秒改一次状态呀,对吧?哎,而到了这种状态下呢,我希望它一百毫秒改一次状态,这个一百毫秒改一次状态。你想想我这个里边的逻辑应该怎么写,这个应该怎么写,咋写来吧,就来到这儿了。记住这个方法会循环被调用,对吧?然后呢,我要保证是不是这么长时间去改一下这个LED的状态呀,不就是这么个逻辑吗?同学,所以怎么着就行了,所以怎么着就行,哎,这么做就行啊,你注意观察。同学,我其实给大家演示过类似的写法,你看我怎么做啊,我这么做,你肯定不能在这里边上来之后就延时啊,怎么做呢?你注意观察,我就这么写,我每次进来之后,我都先怎么着呢?xtask呃,后边呢get一个啥,哎,我这还掉不了是吧,我这是不是没演那个freeRQS的那个头文件,对吧?我们演一下啊,应该是来一个free二tos点h,然后呢再include一个啥pass点h好,然后呢我在这里边我这么写啊,我直接调用xtaskget什么七个count,我每次进到这个方法里,因为这个方法会被循环调用,对吧?好,我每次来我都先获取一下什么呀?当前的tick值来,我声明一下,uint三十二t对吧?后边来一个,比如说CULENTcurrenttick。好,这个没问题吧。同学,我们每次进来我都先看一下当前的时间。然后呢,各位然后呢,然后这块儿怎么写,能能能想明白这事儿,不然后是不是就判断一下当前的时间和上一次闪烁的时间相隔了,是不是超过它了?超了,我就改一下状态,是不应该是这么一个思路同学,那是不是就能够以这样的一个周期去改变咱们LED的状态了呀?哎,就这个思路啊。好,那上一次改变状态是什么时候呢?这个是不是就得定一个全局的变量了呀,对吧?来,我们定一个变量啊。好,那这边呢比如说我叫做uit后边我们来一个三十二t对吧?呃,来这个这个这个这个拿过来。好,那这个呢我叫做什么呢?我叫做last,比如说tick。哎,好,那完了之后,比如说最开始初始值,咱们就给它一个零,这个没问题吧。各位同学,哎,好,那接下来往下进行,你看我接着写啊,这个方法会被循环不断的调用啊。好,然后每次进来我都先获取一下当前时间。然后呢,我在if判断一下判判断判断断当前前时间间去来一次次的这个个化化时间lasttik好好,不是大于等等谁谁这个period好,那如果超了,那就证明是不是我现在该干啥的同学,是不是该去修改这个LED的状态了呀,对吧?所以这个时候我就调用how后边跟着一个呃,是不是GPIO后边来一个touoin就行了呀,对吧?好,完了以后里边呢我把这个对应的port和pping给它传进来。好,那这样一来,同学想一想是不是就完事儿了,对吧?当然改完这个状态之后,你得记录一下什么?哎,是不是上次的时间就等于这次的时间了呀?没错吧,同学你看这是不是就我在最开始咱们讲CR和s五,当时给大家写了一个例子,让俩灯是不是以不同的频率闪烁呀,对吧?当时我是不是就用这个思路写的,现在是不是还是这个思路啊,对吧?一样的哎,一样的。哎,好了,那这样一来的话,大家想想啊就相当于啊我们这儿是一个什么样的逻辑呢?相当于是这个free呃这个这个LEDtask,它实际上是每五十毫秒都要去检查一下我是否要改变这个LE的状态,每五十毫秒都要去检查一下我是否需要去改变l一的状态。大家能理解这个事吧。哎,好了啊,那如果需要改变的话呢,那就会调用相应的方法去进行相应的修改了,就是这么个思路嘛,对不对?但是但是说实话,咱这个方法这么写多少问题,同学有点问题,有点麻问题了,这个是有点问题的,有没有同学能想到有有有有啥问题?你看啊这个方法是不是一个公用的方法同学,对吧?你看啊,那我比如举例子,我现在是idle状态,那我是不是在在设设置个个EEDleft包。tom的时候我得调一下这个方法。那这个方法它是不是有可能会改这个lasttick的值呢?那他改了之后,我下次再调他再调他去改另一个灯的时候,是不是这个lasttick就不对了呀,对吧?所以说跟咱之前一样,是不是也应该是每一个LED都得有一个他自己的lasttick呀?
大家能想明白这个事儿吧。哎,所以我在这儿呢,你要定义的话,你正常你得定义几个,你得定义。呃,当然对于我目前我可能只需要修改俩啊,但是我们考虑通用的话,通用话是不是四个灯,每个灯都应该有一个自己的last一个,对不对?都应该有一个应该是四个才对,但是这是四个,我定义在这儿就不合适了,我我倒不如直接给它定义在哪?同学,我直接定义在结构体力行不行,对吧?每个人有一个自己专,有的是不是lasttick呀,对吧?
哎,我就直接在这里声明了啊,结构体咱们改一下。uint后边来一个三十二t后边呢,我来一个lastTSC可以tick。好,那完了之后呢,它的初始值我们需要给一下啊,初始值是咱统一都给零就行了,对吧?所以我们来到呃这块儿,我们再声明这个结构体的时候,我们把这个初始值给它传进去啊,来走这四个,咱们一块给值逗号。然后来零好,那这样一来我们这呃这个这个这个初始值就有了啊。好,有了之后,接下来我们再去改一下,谁改一下blink这个的逻辑啊。这回这个lasttick是不是咱就不要了,同学就不要了啊,不要了,那不要了之后,咱这儿怎么处理呢?每次来我还是先获取一下当前的时间。然后呢,是不是你现在设置的是哪个灯儿,我就拿哪个灯的,是不是lastt去进行比较啊,对吧?哎,当前值跟这个灯上一次呃,改变状态的时间相比呃,对吧?如果已经过了这么长时间了。好,那我就去改,是不是咱们当前这个灯的状态啊,对吧?改完之后是不是就得把当前这个灯的是不是上一次修改的时间,改成啥,是不是改成当前的时间了呀,对不对?那这样一来是不是就OK了?各位就写完了啊,就写完了啊OK那我们当前的这个方法就能够随意的去修改每一个LED它的闪烁频率了。哎,好了啊,那OK那这个完了之后,接下来我们先先不测试啊,我们先去干啥呢?我们先去把剩下的这俩也给它写完,这俩写完之后,我们再统一的测试,剩下的就简简单了。这俩facehead和这个fault,那它俩实际上就是怎么着同学,是不是就是我前面也定义了,facehead呢,我就让它干啥来着,我就让它是不是常亮啊,对吧?常亮的话,是不是就直接点亮,对不对?那所以接下来呢,我们这儿复制一下,我改一下就行。那也就是这边呢,咱就直接调用来这个拿过来,这直接就是让它on就行,对吧?哎,小写的on啊。好,那完了之后,这俩咱就不需要了,删掉。哎,好,这是常量。那如果出现故障之后,我就让它干啥,我就让它灭了就行了,对吧?所以这边呢我们叫off这个叫off。哎,好了,那这样一来咱们这个就算是完成了,就算是完成了。同学啊,那接下来咱这样,我们就开始去做测试了啊。那以目前目前咱这个fatstatus为例,它目前的初始状态是idol对吧?那现在我试着去看一看,那按照我目前的写法,也就是它应该是以一个低频低频闪烁的这的一个状状态呈现,对吧?那我看一下是不是啊呃,稍等一下呃,注意观察同学呃,这边儿呃,往前一点,这边是机头,对吧?这玩意机头机头目前它没连接,所以它是什么没连接,所以它是熄灭的一个状态,对吧?那前边这个机尾它应该是一个什么是一个低频闪烁才对对吧?同学,那你看一下它是不是低频闪烁,现在这是机头啊,咱们看机尾看这儿是一个频频闪烁,但但个频频率怎怎感觉觉好像有点太对劲儿呢,你看一看,你看一看。同学,你看哎,我我那块儿写的应该是是不是一千毫秒,我让它改变一次状态呀,是不是?也就是我我我写的是不是一线。呃,我来看一下啊,是不是一千一千,也就是应该是呃一秒钟,是不是改变一次状态呀,对吧?但是明显它现在这个闪烁的频率是不是有点儿太太低了呀,对吧?咱们看这俩灯啊,咱看这俩灯他也在闪,但是好低,对不对?这个是为什么呢?他也在闪,其实是在闪的,为啥这么低呢?呃,我们来看看是为啥啊,咱们来看看为啥呃,我目前是这个,哎,咱们看一看为啥这块儿,我给的这个是不是五十啊,对吧?我看下边是不是五十,我这边哦,我这个没改,我这个没改,这我正常是不是应该让他每五十毫秒,是不是闪烁一次,我这个我我这个忘改了,我这个用的还是谁?呃,我我用的还是l还是那个是不是十十秒钟才检查一次啊,你十秒钟才检查一次,那我这个状态要改的话,你你你是不是肯定也就是至少得十秒钟才改一次状态呀?对吧?哎,我这个应该是五十毫秒,让他检查一次啊。好,那完了之后,这次咱们再来看一下啊,这回应该就正常了。大家稍等好,现在是不是基本上就是一秒钟改一次状态,一秒钟改一次状态啊,对吧?当然它可能不是说严格的一秒钟,为什么?因为以我目前的逻辑,我是不是那个task,每五十毫秒才会去检查一下状态,然后才去进行修改啊,对吧?哎,是这样的啊,每五十毫秒它呃不过也应该差不多,因为我一千是不是正好是五十的整整呃整数位啊,对吧?那也差不多啊。好,那所以说这是这个低频闪烁的效果,咱们就实现了。接下来呢我们再去看一下这个高频闪烁啊,来来我往往上翻高高频闪烁,怎闪闪烁啊,这边我是不是只需要把它的状态改一改就行了,对吧?假如说现在遥控,现在给我发了一个什么呢?比如发了一个解锁的一个信号,那我不是是不应该就进入到了,是不是这个normal这个状态了呀,对吧?normal状态它应该是一个高频闪烁来,现在我们看一下这个效果。好,你看是不是现在它就高频的闪烁起来了呀,对不对?好,那如果说我现在呢我进入到了一个这个定高的一个状态,那也就是一个fixheight,对吧?好,那现在我们再给它编译,再给它捎录,那它应该就是一个什么状态了,同学应该就是一个常亮了,对吧?好,你看这俩字是不是就常亮了,对不对?那假如说我现在一不小心这个出问题了,我现在进入了一个呃错误状态啊,fortFAULT好,那它应该就是一个常灭的状态了。我们看一下是不是啊来稍等同学等你好,哎,是不是就已经熄灭了呀,对吧?哎,好了,那也就是说目前我们是不是就已经实现了实现了什么实现了这样的一个效果,就是只要这两个全局变量,这两个状态的值发生变化。那我这个LED的效果是不是就会发生变化呀,对吧?它可能是高频闪烁,也可能是低频闪烁,可能常亮,可能长按啊就是这么一个意思啊。OK好,那这个remote咱们也就不测了,remote,应该没啥问题啊。好了,那我再恢复到这个初始状态,应该是idol啊。好了,那这块儿咱就完成了,这是我们的灯控任务的完整逻辑啊,好,停一下视频。
18-无人机-飞控项目-飞控任务-定时器配置
cpp
复制代码
好了,各位同学,那接下来呢我们再来呃实现一下咱们的第三一个任务。当然第三一个任务,咱们不可能一下把它做完啊。呃接下来要给大家演示的谁呢?是这个非控任务,这个飞控任务前面也给大家讲过啊,它实际上是一个非常非常重要的任务。对于我们这个飞行器来讲啊,它做的最核心的事儿是什么的?同学是不是就是设置咱们这四个电机的转速啊,就是它做的个核心心的事,设置电机的转速,但是它是根据什么去设置的呢?它需要综合是不是多方面的因素,对不对?它首先需要考虑我们当前飞机的状态是什么?如果你飞机状态是oidol,那我这个电机转速是不是一直都是零才行?对不对?ok好,这一点大家应该能想明白啊。
ok好,那我们继续往下进行。那如果我现在呃除了飞机状态,我还得考虑啥呢?遥控数据,对吧?
遥控,你是不是得参考那个油门啊,对不对?参考油门啊?好,那除此之外呢,是不是还PI机计算的值啊?比如我现在要定高,那你这个到底给多大油门,是不是由定高的PID说了算呀,对吧?唉,ok好,总之你要综合多方面去考虑啊。好,我们现在呢先不考虑这么多同学,我们现在呢就先实现最简单的一个任务,就是你先让这个电机转起来,先让让它转起来就行啊。OK好,那转起来我们应该怎么让它转起来呢?是不是通过PWM去控制这个电机啊,对吧?哎,好了,所以咱接下来要做的就是首先我们需要去配置一下,咱们这个就是q版MS里边的定时器,对吧?我们需要让这四个定时器输出PWM波r完了之后呢,我们再去写相应的转码,然后呢去设置这个电机的转速,能理解这事吗?同学,我们先完成这个电机的接口层的这个代码就行了啊。好,接下来咱就开始y开始同学啊,从从哪开始,咱们先从是不是q吧?MS开始啊,对吧?来,那我前面就给大家说过,我这四个电机呢,是不是都是使用定时器去驱动的呀,对吧?一共是正好四个定时器驱动咱的四个电机好,但是哪个定时器驱动哪个电机?这个咱是不是得去看一看原理图啊,对吧?并且大家要知道的是我们每个定时器,他这儿是不是有四个输出呃,还有这个呃输出呃呃呃呃比较和输出捕获呃,输入捕获和输出比较,是不是有这样四个通道啊,对吧?
那这四个通道我到底哪个通道连上了咱们的电机,那是不是咱也得去看一下原理图啊,对吧?这个都得搞清楚啊。对了,那接下来咱们去找一下这个原理图和这个电机相关的这部分内容啊,咱们就翻呃,找一下啊,找一下应该在哪儿,应该在下边呢?哎,儿这个展示出来的就是我们这四个电机的连接情况啊,来吧,大家简单的看一看看能不能看明白。实际上这个这是一个电机啊,这是一个,这是一个,这是一个,一共是四个啊。好,然后这四个电机呢,其实跟我上午给大家呈现出来的那个咱们的电机的驱动系统找一下啊,动力系统,哎,是不是跟这个驱动电路是一样的呀,跟这个电路是一样的啊,大家看看能不能看明白啊。
呃,首先先明确一下这个是啥?这个是插座儿。你看我们的电机和咱们这个PCB是怎么连系上的,是不是通过一个插座插上的呀,对吧?所以这个就是我们那个PCB上面的插座啊,这一点大家要注意,这是咱这个插座。但是这个插座你可以看到啊,就是它里边是不是有一二三四有四个引角啊,但实际上啊我们只用了两个引角,为什么呢?因为一个电机是不就是正负极,大家能想明白这个事儿吧,正负极是不是我就只需要两个眼影就行了,对不对?其实你可以看一看,就是咱们那个插座啊,你拔开之后那个插座它里边啊它应该是呃有两根呃,只有两个插头,这个没问题,对吧?只有两个插头,但是它底下跟我们这个哪儿呢?跟我们的这个PCB接触的时候,它的引角实际上是有有有有有四个。所以说呢呃咱们这块呢不用管另外的那两个三和四,你不用管,你只管一和二就行了。一和二注意同学,它连接的是咱们的电机能理解这个事儿吧。同学,所以它这是怎么连的呢?是这么连的啊,首先大家先忽略三和四三和四这俩眼角,你看它直接怎么着了,同学是不是直接就接地了呀,对吧?所以说这些东西你是不用看的,你们管。然后呢我们只需要管一和二就行,这个一和二这块其实连的就是啥呢?连出来的就是我们的电机,这比如说就是咱那个电机那个马达能这个事儿吧,同学比如这样的有正负极能看懂,对吧?哎,好了,那我们继续往下进行啊。那完了之后这儿看一看这个二这边连的是啥呢?二这个连的其实就是这个东西注意这儿是不是有一个VM啊,这儿是不是有一个vbat呀,对吧?这个vbat可能我们现在我就不切连油画了一些图了。vbat我告诉大家,这个直接连的就是咱们那个电池的正极直接电池是不是就连接到我们这个电机上了呀,对吧?因为电池输出是不是正好是三点七伏,咱们电机也正好是三点七伏,所以直接供电啊。好,这其实是咱们的电池,然后中间过了一个是不是零欧的一个电阻啊,对吧?但到了这个VM啊,所以这个直接连的就是电池的正极这一点是不是能想明白同学相当于咱们这个电路怎么走的呢?是不是走这电池的正极过来,完了之后呢,是不是走到我们这个电极的正极啊,对吧?然后经过里边的线圈出来之后,走负极,完了,往这走正常负极,是不是应该是接地啊,对吧?但是它直接接地了吗?没有,中间,是不是经过了一个n型的mos管啊,对吧?OK好,接到了这儿。
好,那接下来呢又来到了这儿。好,这一部分电路大家应该就熟悉了啊。好,显然这个对应的应该是我们某一个定时器的一个PWM输出的通道吧,对不对?这儿输出PWMY完完了之后呢,用它来控制这个mos管的,是不是呃打开和关闭啊,对吧?
哎,这样一来就能够去通过呃这个PWY的占控比来控制我们这个电机的一个是不是这叫什么呀?是不是转速的呀,对吧?就这么个一个逻辑啊,就这么一个逻辑啊,这一点大家注意就行了。其实这个原理图呢,就是你把我画斜线的这部分去掉,剩下的内容,其实跟我在这儿给大家画的这个图是不是完全一样啊,完全一样,这个大家注意就行了啊。好了,那这是咱们这儿这个原理图的一个说明。好,说完之后,接下来咱要做的工作是不就是照着这个图去配置一下我们这四个定时器了呀,对吧?那咱现在就一个一个来吧啊呃这块儿我给大家明确一下这个left零left零啊,指域指的是谁?指的是我们左上角的那个电机来看一下,我的左上角应该是谁?哎哎哎,我这个哎哎,我这个跑哪儿去了,你撞哪儿去了呃,长锅沟,他整的有点儿呃,我都不知道他到哪去了,我我我我调一下啊,我让他那个往下走。嗯,好,回来了啊。行,然后大家看一下啊,我的左上所谓的左上角应该是哪儿呢?给大家看一眼呃,来这么看吧。好,那注意这个是不是我的机头,对吧?
嗯,呃这是我的机头啊,所以左上角应该是谁,是不应该该他呀,对不对?所以大家左上角下角这个事儿需要搞清楚啊。OK那他他他又他又他又抽风了,先管管他啊。好,那所以接下来咱们应该怎么着呢?我是不是应该是根据,就是他是左上角,那这个呢应该是左下角这个那右上角这个是不是右下角啊,对吧?哎,好,那这是我们的一逻逻辑。好了,那接下来咱们就开始同学,我们现在要做的工作,就是去配置这个q吧MS了啊,这是咱那个flight的这个是啥呀?这个我看一下这个pro麦,哎,这也是我是不是哎,我开了两次是吗?呃,行,这个先关了吧。ok咱们用这一个就行啊呃算了,这个也关了吧,我这个到时候不知道是哪个了,咱们乱了来把这个打开打开,然后重新开一下啊,flight然后呢,这个给它打开,我们配这个定时器啊。呃,首先我们先配一下左上角的这个左上角,这个咱们看一看,应该是应该是对应的,谁啊,是不是left零啊,对吧?来咱们往下翻这块给咱们记录了,就是它连到了哪个定时器的,哪个输出通道上啊?呃可以看到它连的是谁?是tem三CH一,也就是tem三的定时器三的时候通道一啊,对吧?那所以接下来呢我们要去找一下这个东西来吧,咱们就开始配啊。呃,首先我们去找定时器应该是timas,然后呢应该是t呃tem三,对不对?通道一对吧?啊,那我们先进到TH一那tem三里边,我们这块儿有些参数需要去配置啊。首先slavemode,咱们这儿用到slavemode了嘛,从模式我们不是从模式,对吧?什么时候需要用从模式呢?就如果你比如举例子,你需要通过其他定时器来去触发我当前的这个定时器,那这是不是从模式啊,对吧?那咱们没有,所以这个不配disable啊,那triggersource肯定也是ddisdisable了,对吧?然后我们的时钟是不是选择internalclock呀,对吧?
哎,好,内部时钟啊。好了,那接下来往下走,下边咱们要做的是不是就是需要去启用对应的这个通道了呀,对吧?那我们刚才看到的是CH一嘛,对吧?所以说我们要来找channel一,那那这里边有这么多的工作模式,那我们应该选谁呢?直接是不是就PWMgenereration啊,对吧,是不是输出PWM我们是不是选这个就可以了,对吧?点哎,那点完之后,接下来我们有一些这个定时器的参数需要去配置啊。来那我们先找parametersetting,那这里边都有啥需要配置呢?首先最基础的就是这个countersetting,咱们这个计数器对吧?这个计数器咱应该咋配呀?计数器这里边其实咱们就重点关注一下这俩参数就行了。一个是预分频能理解吧。还有一个是啥呢?哎,是咱们这个啊ARRautorelate呃rereloadregister,对不对?哎,好,那这样咱们怎么配呢?配多少比较合适的。首先那我们先来回顾一下,就是他这个PWM这种工作模式的原理是什么样的啊?呃,来咱们稍微的回顾一下。呃,首先啊同学,那不管你这儿这个预分频配多少,你这个counter的这个period的也就是ARR配多少。那咱们这个计数器的值,它实际上是会周期性的,是不是进行递增或递减呀?对吧?那我们这儿这个countermode是up,所以它应该是递增,对不对?
比如说这是它那个零啊。好,那上边比如说是那个最大值,比如说我就写这个ARR啊OK好,那完了之后呢,它是不是会周期性的哎,递增,然后呢,到头之后呢,是不是又回到零了呀,对吧?哎,再递增,哎,再往下走,再往上再往下,这是咱们那个counter的值的一个变化的逻辑,对吧?好了,那我这个PWM它呃是如何去产生的呢?是不是咱们还得去配置一个PWM的一个什么值啊?一个CCR吧?是不是就是那个呃,capturecompare那个register啊,对吧?哎,CCROK好,举个例子,比如说我就配了一个中间的值啊。好,那当然这个PWM里也有多种工作模式啊,比如说我们用工作模式一啊OK好,那这个时候会出现一个什么样的PWM呢?是不是就是当counter的值小于你那个CCR的值的时候,那我就输出什么电平啊?
比如说输出有效的,比如说就是高电平,当然这个极性是不是也能调整啊,对不对?比如说我们现在输出高电平啊。好,那超过这个值之后呢,那我怎么着?是不是输出低电平,对不对?OK然后呢,到这个变小之后,是不是又继续输出高电平?对吧对,为这是你设置的那个CCR的值吧,对吧?OK好,那完了之后呢,我再继续往下进行,现在该输出高还是低了,是不是又是高了,对吧?唉,然后超出之后呢,又输出低电平,那这是不就是咱们这个PWM的一个工工作逻逻辑,对吧吧?好了,这个咱咱们先回忆起来,先回忆起来啊。好了,那完了之后需要给大家说明的一点,就是你思考一下,同学思考一什么呢?那就是我配这个值,还有这个值会影响到我们这个PWF的哪些内容啊?比如说周期呀啊还有什么呀,还会影响到什么呀?等等这些这事儿,咱们要考虑清楚,同学是不是主要就是周期,对吧?它和它它俩综合起来是不是会影响到我们最终产生的PWF的周期,这个事儿应该能想明白,对不对?哎,ok好了,那接下来我们继续往下进行,咱这儿应该是理解了。那接下来咱们继续往下进行。那我们现在单考虑这个值,你说它会影响到什么,他会影响到什么,它是不是会影响到我们将来配置的这个谁是不是这个pose这个pose,也就是它那个是不是迈宽呀,对吧?ok这说白了,这个值就是就是谁,是不是就是那个CCR啊,对吧?没没问题吧,同学你这个就是这个值AAI呃,这个ARR它的值是不是会影响到你这个呃它的一个一一个取值范围啊,能理解这块的同学。比如举个例子,我这六五三五,那你这儿能给的值,是不是就是零到六五三五吧,对吧?那我这儿比如说一千,那我这儿能给的就是呃,是不是就是最大值就一千啊,对吧?它会影响到它。好,那再继续进行,你说它会影响到什么,他是不是会影响到我们这个占控比的是不是这个取值啊,对吧?能能能那个事儿吧,再具体一点,就是它会影响到我们调整谁调整这个电机转速的时候,你可以理解是那个档位,大家能想明白这个事儿不举个例子啊,我这个值现在这儿给一千,那它能取的值是不是就是零到一千,也就是我的这个占控比我的占控比是不是就是零到一千只有一千种可能性啊,对吧?对不对?那也就是说我的电机转速是不是就有一千档能能能理解这个事儿吧。
哎,好,那如果说我这个位置我给十好,那你这儿是不是也就只能是有一到呃,十档了,对吧?大家能想明白这个事儿吧。哎,所以说呢就是这个位置直接决定了,我们将来就是控制电机转速的时候,它的那个档位的这个个数,我这个值越大,我这个电机的档位是不是就越多?哎,就是这么个意思啊。ok好,这一点咱们要考虑清楚。所以说我们综合考虑上述这些内容啊,那咱们这这个到底怎么去配这个预分频和这个conter的period的呢到底怎么配呢?我们先配它,先配它这个我给多少呢?同学,我给一千也就证明,也就意味着将来同学咱的这个呃电机,它的档位有多少,是不是就是一千档啊,能能能能理解这块吗?同学当然这块呢我们配的话是不是应该是给它减个一啊,对吧?
这个一定要注意啊。好,这个咱们先定下来。那接下来呢,我们再定上边这个预分频器,那这个我们给多少呢?这个给多少同学就取决于啥了,取决于咱们这种空心杯电机,哎,它对PWM波的这个频率的要求了。
呃,就是一般情况下,我们在驱动这个空心杯电机的时候呢,你给它输入的PWM波的频率,呃,要在二十k赫兹以下能理解吧。同学要小于二十k赫兹,这一点,大家一定要注意,不能太快啊啊,太快的话它承受不了啊。OK它一定要呃在这个范围之以内啊。ok好,那这说白了是一个它的频率的一个上限,对不对?好,那它有没有下限呢?那当然是有下限了。如果你想频率太低,你这个PWM频率太低,那就会导致一个什么问题?是不是我们这个电机它转的就不连贯了呀,对吧?你你比如说最极端情况下啊,我这个频率,比如说我这个给它整成啥呢?比如说我这个呃这儿一秒,这儿一秒,这一秒秒这一秒。那说白了,你这个看起来是转一秒,停一秒转一秒,是不是就这种效果来对吧?
所以也不能太低,也就是我们尽量是不是高,然后呢,在二十k赫兹以下是不是就行了,能理解这个事吧。同学,那所以我在这儿设成一千的情况下,我这个设成多少就能保证咱们这个是在二十k赫兹以下呢,就是PWM二的频率是在二十k赫兹以下的,这给多少合适啊,给个几比较合适了。呃,首先咱们得明确一下啊,最终生成的PWM端的频率应该是怎么算,应该怎么算?呃,首先我们原始的这个内部时钟频率是不是应该是七十二兆赫兹的。没错吧,我这儿呢就来一个乘十的六次方啊,同学好,它应该除以,谁是不是应该是除以咱们这个PSC预分频器再乘以,谁再乘以你下边的这个是不是ARR这个得到的结果是不是才是咱的那个PWM二的频率啊,没没没问题吧,同学这个能不能绕过来啊,应该是能的啊。ok好了,那我们继续往下进行。那我现在ARR是不是已经给了呀,对吧?我这已经给成多少了,是不是已经给了呃,一千,也就是十的三次方了,对吧?所以咱们直接消掉啊,这儿是不是变成十的三次方了,十的三次方是不是就是k了,对吧?也就是七十二k是不是再除以它,它应该怎么着,是不是小于二十啊,对吧?小于二十k那同时呢应该是尽量的接近它。所以我这个PIC给多少就行了,给个挤就行了,给个四是不就行,对吧?给个四给个四的话,你七十二除以四等于多少,是不是正好等于十,应该是十八,对吧?四八三十二,然后进三一四,然后加七十二,是不是正好是十八,十八,是不是就是在二十k以下呀,对吧?哎,也就是这么一回事,所以这应应该是给四啊,那当然给给四的,我我们该该给给给,所以也就写四点一,是不是就行了,对吧?
哎。OK那也就是这样配,其实比较合理的一个呃一个操作。哎,给大家总结一下,就是你这样怎么配?首先先明确这儿这儿是不是直接决定了你这个电机的转速有多少档啊,对吧?我们这块尽量量精细一点,我们给它一千档啊OK一千档啊OK好,那完了之后呢,它有了之后呃,再根据具体的这个频率的要求。
因为前面讲过它这个昆心为电机呢,它要求我们的这个就是PWL频率,不能超过二十k赫兹啊,尽量在这个范围之内。那所以我们再根据这个再去算它啊,就能算出来了,差不多是这么一个逻辑。这个大家注意啊,行了。那也就是说我们现在呢这俩最重要的值就配好了。这个配好之后,其他的我们看还要不要配同学啊?呃,这个除以个个库是不就不用配呀,对吧?哎,好,那接着往下走outpWMgenerarychannel,这个我们得看一看,呃,其实需要重点关注的,是不是?就是它这个是不是咱们那个相当于是那个CCR的一个初始值啊,对吧?初始值我们给多少就得给零,你别给别的,你要给别的的话,相当于是我这个输出的PWM它的占控比不是零对吧?初始不是零,是不是你只要一上电,这个电机就开始转了呀,对吧?所以这个一定要给零啊,这个一定要注意,能能理解这块吗?同学哎,好,那将来我们调整转速的话,其实你就是设置谁的值,是不是就是动态的去调整它的值就行了呀,对吧?它的值的范围呢是零到一千,我们有一千档的速度可调,就这么个意思啊,能理解这个事儿吧。哎,好,这个搞定。好,接下来呢我们往下进行这个定时器,咱是不是就配好了呀?同学当然这个一定要注意配好之后,一定要看一眼它的GPL引角注意它这是PA六,对吧?然后呢,看一下咱们这个文档上是PA六吗?同学team三CH他没用PA六,这样他用的是PB四,他做的是不是重定向了呀,对吧?那所以这块呢咱们一定要调整一下同学啊,所以咱们需要找到呃,我们这个对应的这上面的引角应该是多少PB四对吧?你就直接找PB四PB后边来一个四啊。好,那回车呃,应该是在上面这个位置,对吧?你点它一下,点完之后,你就发现它这儿是不是就可以重定向到TM三的CH一啊,对吧?你点一下。哎,好,那这个就过来了,注意一定要看一下这个引角啊,看一下,对不对啊?好,那这块儿它的呃配是是不受影响的,这个没啥问题。行,那我们第一个定式器就算是配好了啊,接着我们往下进行同学看。第二一个呃第二一个我们要配置的应该是啥?left一对吧?也就是左下角那个它应该是team四的CH四呃PB九对吧?我们按照这个逻辑去配一下tem四的CH四,我们快速的配啊,这个就是重复的操作了。来吧,咱们开始首先internalclock,这个没啥问题,对不对?然后是channel四,对吧?team四的channel四,所以我们应该是PWMgeneration,是不是CH四啊啊,对吧?点你啊点完之后呢,接下来我们配置出的相关参数paralrametersetting首先配预分频PSC这个我们给是不是四啊,对吧?
四减一完了之后呢,往下走,这个呢咱们给是不是一千减一啊,对吧?一千后边给给给跟一个减一啊。好,这个就搞定了呃,下边的这些东西,我们是不是就不改了呀?同学哎,咱们就不改了。好,这个就不改了,然后这个引角也看一下GPOPP九,这个是没问题的吧。PP九这个没问题啊。好,那接着下一个应该是t二的CH二,这个就快速配啊。走你呃,这回咱们这个往下翻呃clocksource,我们得选一下是不是internalclock啊,对吧?其他的还是一样的配置,这个呢我们就直接给一个呃四减一。然后这个呢我们给它一个一千减一呃,注意啊,一千减一行了,那这个就搞定了呃,搞定之后看其他的东西呃都不用配,对吧?都不用配。呃,哎哎,这个通道我是不是选不呃,没选通道是吧?选通道啊,应该是TM的,是不是CH二啊,对吧?CH二我们找到PW呃m略日的gench二,这个名字千万别选错了啊。呃,行,那这个普通的配置还是保留下来没问题。然后呢GPL咱们看一眼PA一是不是PA一啊,便宜没问题啊,下一个该right一了,right一,这个我们找的应该是team一的CH三啊。team一,咱们找呃crossce我们选择是不是internal啊,对吧?然后呢呃应该是chh三找到output呃,找到PWFgenerationc十三,这个没问题啊。好,接下来配相关配置啊,先配呃基本参数,这个呢我们给四减一就行啊,四减一。好,那往下翻这个六五五三五这块呢又又飞起来了,小心啊。呃六三五这边我们给多少一千,是不是减一啊,对吧?其他东西咱就不配了,看一眼GPOPA十PA十是不是?PA十PA十行没问题吧。好,那这样一来同学我们是不是就已经将咱当前的这四个定制器就都配好了呀,对吧?配好之后,接下来咱们就直接生成这个代码就行了。我们摘去去ercode啊,好走,你这个大家配的时候细心一点啊,别配错了。好,那现在呢就完成了完成之后,接下来我们进到咱这个项目当中,然后需要注意每次重新生成代码之后,一定要先重新的编译一下。好,编译完之后,这里边会有一些问题,需要我们解决啊,首先要解决。第一个就是IT点c这块,对吧?这个一定要注意,这边,我们应该来一个下划线呃,下划线ASM。好,然后刚才有同学问了,就是呃他发现对这个汇编代码做了一个格式化之后,就发现这个编译它通过不了了,对吧?有同学遇到这个问题了吧,这这个是为啥呢?因为你这个汇编啊们这个VSSdede对这个汇编进进编编的时候,他其实他不理解汇编编的语法吧吧,他格格化化时时候按照c语言去给你格式化的能理解吧。所以他遇到这种括号逗号什么,它会怎么着呢?他可能会给你换行,你注意啊,这是一个完整的汇编指令,对吧,对吧?
这是我的指令名。这是我操作的寄存器,这可能是在取它的地址,对不对?你这一个指令这一行,你不能你不能换行,能理解吧,你可以有空格,这个都没啥问题。但是你这同一行的指令,你不能让他换行,换行之后,它就会出问题,能大家能理解这个道理吧。所以呃尽量保持这个原来的这个比如说格式不要动啊。行,这个咱们处理完了之后,我们重新编译,看有没有其他问题啊,哎,是会有其他问题的,对吧?你看他报的是什么错误,同学是不是找到找不到这个team相关的代码了,对吧?
这个是我前面给大家讲过,是因为我们直接通过QBMS生成的这个定时器相关的代码是不是没有就是EIDE没有自动的帮我们加到这个项目资源里边来啊,我们需要手动的去添加一下啊,添加咱们添加俩地方,这个一定要注意哪俩地方呢?首先第一个是application这儿找到user,找到call这里边,首先是不是得先加上那个team相关的内容啊,对吧?好,我们添加文件之后,你就找对应的路径callSRC这里边你看这儿是不是有一个team点c啊,对吧?添加进来哎,进来了啊,除此之外呢,我们还得去找一个啊,还找谁driver里边,也就是咱们那个库文件是不是它一开始也没有啊,对吧?这也要手动的添加啊,在这里边我们呃重新导入就行了。呃,重新导入的话呢,就是呃会有一个问题,什么问题呢?
你会把你在这里边儿,因因为你重新导是从哪儿重新导,是不是从KO那边导啊,能能理解事儿吧。同学,你从q里边导注意,我前面一再给大家强调就是EIDE和kill它俩是独立的。
一旦你把EIDE的项目从q里边导过来了之后,能理解吧。同学,这这个这个项目就和q就没有关系了,能理解吧。那我之前我在KO里边,我我在EIDE里边,我创建的文件,比如说我的INT我的com等等的这些我是不是也已经添加到这个资源文件里边了呀,对吧?但是你这个操作KO那边它有吗?k门KO那边是没有的,所以你就不能再重新导入啊,你重新导入的话,会把你EIDE里边原来做的EI的操作全覆盖盖白了。你你些EINE啥的,还得重新添加,大家能理解这个道理吧,所以就比较麻烦啊。呃你你确定会保留吗?这个我还真测过啊,他我反正我测的是不会保留的,我测的是不?
我不知道你怎么重新导入的,你是你是直接点这个重新导入吗?是吗?还是怎么着?我我测试不会保留的,我这个要要要是保留,我肯定我直接那么做了啊。
这个一会儿我大家可以测试一下啊,我测试不会的啊,所以我我我我我就只能在这边我重新添加啊,是不会保留,我测试不会保留啊,这个呃可以再试试,就是咱这个添加一下,也不方也不麻烦啊,怎么着呢?咱们找谁同学,是不是就还是找到咱们刚才我刚才是不是添加的driver啊,对吧?这个找driver,然后呢找他就行。然后点SRC之后呢,找到我们刚刚的这个team文件。呃,这儿有一个team,还有一个team的扩展,对吧?这两个我看一下它的呃都添加进来吧,我看有没有重复,有重复,咱们再删啊,来翻译一下都进来。这个是team,这个是team压CC是不是都进来了呀,对吧?哎,这个就没问题了啊,之后呢,我们重新给它编译一下,看有没有问题。好,现在是不是没问题了,对吧?一定要记得就是呃保证它没问题了之后,我们再继续往下进行啊。好,那大家也可以试着重新导入一下,我反正还是直接会把原来的给覆盖掉啊。行,那这个完了之后,我填一下视频啊,同学。
19-无人机-飞控项目-飞控任务-电机转速控制
cpp
复制代码
视频好了,同学那接下来呢我们快速的去实践一下控制电机转速的这样的一个逻辑啊。那首先我们还是从接口层开始,同学接口层开始啊,我们在接口层里边呢,我们新建一个文件夹,这个咱叫啥呢?叫做MOTOR是不是就是电机呀,对吧?motor马达啊好之后呢,我们在里边新建文件,我快速创建一下啊,INT后边来一个MOTOR点HCTRL一ccontrLC走你。然后呢,我们再来一个是不是点c对吧?这个是不就完事了。同学在h里边呢,我们新建一个这个头文件啊。好,那接下来咱们往下进行同学,大家先先想一下啊,就是你这要应该定义什么样的方法,我先把这个内容给它添加一下啊。项目资源普通文件夹完了之后呢,我们找到INT是不是找到这个呃,找到这个这个power就行了,对吧?但是我最好我我在哪儿,我在这儿吧,我哎哎你看它是不是因为我加进来了呃,已经加进来了,对吧?也就是说我之前因为我之前我添加的是INT这个根目录,对吧?所以你在这个根目录下边去创建新的子集目录的时候,是不是自动就添加进来了,所以这个我就不用再添加了啊。嗯,行,那咱们就接着写吧。那大家现在想一想,你说我这边应该定一个什么样的方法用来设置电极转速,你觉得会需要一个什么样的方法呀?是不是就是设置电机转速啊,对不对?因为因为你想啊,我们前面讲过嘛,就是咱这个整个任务的这个逻辑,非公用的逻辑,就是前边你需要去做一大堆的操作。但是归根结底,最终最终你要干啥?是不是要去设置电机速度,对不对?所以我们接口层这块的东西很简单,就是提供一个最基础的函数,就是干啥?就是设置电机的转速,所以这边咱咱就直接来一个y的IT后边来一个啥MOTOR呃后边来一个啥呢?来一个是不是setSPEEDsetspeed,是不是就可以了呀,对吧?呃,然后需要大家注意的一点,就是我这个我需不需要给它呃设置参数呢?当然得有参数了,你设置哪个电机呀,你是不是得告诉我呀?同学哎OK这一点一定要注意啊。好了,那参数到底是什么?这个一会儿咱们再分析啊。那除此之外,我这还不要不要一个其他的函数,得有一个,咱这个得有一个拿的这个必须得有个初始化,为什么?因为定时器是不是kill他,不会帮我们启动啊,kill会帮我们初始化,但是不会帮我们启动。所以将来我们在呃控制一个编辑的时候,是不是得先启动定时器啊,对吧?大家能想明白这个事儿吧。哎,所以这个我们这需要两个啊,那现在呢我们把这两个方法都给它实现出来,我们先把第一个实现出来吧。第一个比较简单,也就是enet这个这个就直接怎么着就行,启动定时器吧,对吧?来,我们现在来一个INTinclude对好,是是来直接该tem是不是点HR对吧?哎,好,拿过来之后呢,咱们去实现一下这个初始化的一个逻辑啊。好,这个简单直接后后边跟着啥,是不是team啊,对吧?再来一个啥,后边应该是咱们是带着PWM的这种启动吧,没问题吧,同学是不是PWMstartting对吧?那这里边我需要传入哪些参数呢?还记得吗?俩参数一个是定时器的句柄,还有一个是不是咱们那个定时器的通道啊,对吧?哎,好了,那这回你到底起哪个?这个是不是也得照着谁,是不是也得照着咱们的这个这块儿去写啊,同学啊,哎来,那现在我们开始啊,首先我们需要去启动一下,这个稍微放大一点啊,应该是team三的,是不是CH一啊,对吧?那我们就开始往里传hteam,是不是三后边来一个啥,是不是应该是teamchannel几?
呃,一这个没问题吧,各位哎,好了,接下来我们往下走啊,呃就先让它复制,我们再改吧。
这个应该是team四的CH四啊,这个呢应该是team几的呃,team二的CH二,这个是team一的CH三。哎,好了,那这样一来是不是咱们这个初始化的逻辑就写完了呀。这个简单接下来重点看这个设置电机转速理论上啊,同学,咱这个方法应该是一个通用的。我不管设置哪个电极的转速是不都应该调它呀,对不对?那所以说同学那将来人家在调这个的时候,是不是得让他把那个电机的相关信息给咱们传进来呀?没没错啊,同学,哎,所以你说他应该让他传什么参数呢?传什么参数?其实取决于我在设置这个电机转速的时候,我需要什么参数吧,对不对?咱们设置电机转速是不是就是改那个CCR的值啊,对吧?所以这会儿我们调哪个方法能改那个CCR来着还记得吗?
是不是有一个下划线下划线后边来一个号号什么来着?是不是有一个set呃teamteam啥?后边是不是有一个setcompare啊,是不是有一个这样的方法?大家还记得吧,那这个方法里边需要哪些参数?各位看里边需要哪些参数?哎,咱们点进来是不是里边一共需要如下这三个呀,对吧?一个是什么?这是一个红函数对吧?一个是handlehandle,是不是?就是咱这个定时器的句柄,还有一个是channel,这是不是就咱定时器的通道?还有一个,这是不是就是你要设置那个值了,各位同学没错吧。哎,好了,所以接下来呢我们是不是就可以给这个方法定义这三个参数了,对吧?当然,各位为了方便起见,我不这儿,其实可以怎么着?也像LED那样,咱们去定一个什么东西结构体,我把这些属性我都给它封装一下,是不是比较好啊,对不对?所以接下来咱们去做一下这个事儿啊,来吧,那现在我们还是得进到哪儿去定义这个类型还是累进到com,是不是types里边啊,对吧?哎,来这个它又给我变了啊,我再给它调回成是不是GBK就行了呀?对吧哎好,那现在呢我们去继续定义类型,这回定义的是谁?那电机是不是结构体啊,对吧啊,电机结构体啊。好了,那接下来呢我们typedefine后边来一个struct,那后边我就叫做motorstruct,这个没有问题吧。同学哎,好了,那属性咱们这儿应该有几个按照我们刚才的分析,应该得有三个属性,分别是定时器的句柄。哎,通道以及谁是不咱那个速度啊,对吧?好,那接下来我们去复制一下这个参数类型,你在这边复制是不是复制不了啊,对吧?这个可以去哪儿在上面这个方法里复制是不是就行,这里边是不是有矩柄,以及咱们这个通道的类型啊,对吧?哎,好,那拿过来拿过来之后呢,我们回到这个type这里边来啊。好,我就直接把这个拿过来就行了。这个中间咱们改一下啊,这个改了呃,这个完了之后,这儿也给它加一个这个分号啊。好,这个没问题吧,各位啊这是定时器的句柄,我就就就叫这个吧。然后这个呢是title啊。好,接来往下走。呃,这个我小写吧,我保持一致CHANEL啊。
好,那再有一个是不是就是咱那个speed了呀,对吧?SPEED其实说白了就是给CCR的值嘛。那问一问一下大家这个speed的值,我们给多少比较合适呢?咱给多少比较合适呢?啊,不是直啊,就是它的类型类型类型呃,按理说它首先应该是一个无符号的对吧,对吧?那无法是十六还是八呢?十六,就因为我们的范围是不是就是零到一千啊?对吧?所以这边呢我们正常就给一个无符号的十六位的值类型就行了啊。但是但是各位同学一定要一定要记住,切记切记,我们这儿呢先不要使用无符号了,我们先给他一个有符号的。呃,为什么啊?同学首先首先给有符号的,我这个范围也不会受影响吧,对吧?六五五三五,你除以二,你还三万多呢?所以呃正数的范围在零到一千,也没有任何问题啊。好,我这为什么要这么做呢?是因为我们将来啊,我们将来再去计算,就是咱们这个就是电机速度的时候,我们不是直接给的,你要直接给你,肯定是零到一百这个一一千,这个没啥问题,我们将来是用什么?是用那个是不是PID算呀,对吧?你PID算它是不是有可能会给你整成一个负数什么的呀,对吧?
好,就是将来呢我们需要怎么着?我们需要去判断,如果它要是负数了小于零了,那我是不是得给它是不是给它再设置为零啊,不让它小于零的列一个串吧。同学,那如果你这儿直接就给它一个无符号的那将来我们速度算出来之后,你直接就是啥,它不可能出现零吧,对吧?它是可能小于零了之后之后变成一个很大的值,是不是就可能很危险啊,对吧?那所以咱这儿呢先给它一个int值,到时候大家就能体会到它的作用了啊,一定要注意,先给验t先给ent,我强调一下啊,先给验t不要给无符号了啊。行,那咱们就先这么着啊,呃这个定义好定义好了之后,接下来我们进入下一个环节,下边我们进到呃咱们这个motor点h这块,那这边是不是咱们得去重新改一下,我们第二一个方法,也就是设置速度那个方法的定义了呀,对吧?
我们呃come后边来一个啥types点h好,那这一块呢我们来一个啥,应该是motorstruct同理,咱这还还是给给啥给指针,是不是比较好,对吧?哎,好了,那接下来我们回到这边来啊,controlc完成之后,来到它的c文件给它是不是加上一个这样的参数就行,对不对?那这回你再去设置这个compare,是不是就简单了,同学怎么做就行,是不是直接调用motor?MOTOR里边点儿先来谁htem,对不对?再来HI再来channel,是不是再来那个死闭的就可以了呀?这个大家看有没有问题没问题吧,各位哎,没问题啊,没问题。行了,那这样一来我们就完成了咱们这块的相应的这个逻辑了,是不是不难吧?啊,整体来讲不是很难啊。行了,那接下来咱们要做的是不是就是测试了呀,对吧?接下来我们进到哪测试是不是得进到咱的偶像收起来进到咱的taskfreertospasserc是不是得在得在这里边测试啊,对吧?好,测试的话,那设置电机速度这个事是由谁来负责的,是不是按照我的规划是由我这个飞控任务来负责的呀,对吧?它最终要设置电机转速,我们现在呢就先只测一下这个东西,别的咱们先不管啊,来,所以接下来我还得再新建一个任务。各位啊,来吧,那我们把飞控任务给它创建出来非控任务。哎,好,那现在呢我们声明一下相关的内容啊,flatpask没问题。呃,然后这个走你没问题,然后这个是它的占的空间,这个占空间,我们这儿这个稍微给高点同学,为什么?因为你看我这里边啊整个任务我要执行的内容实际上是很多的,我要做这么多的操作,对吧?各种计算乱七八糟的,所以这个它相对来讲比较耗这个占空间,所以这个我们稍微给大一点啊,我们乘个二吧,double一下二五六啊。好,那这个完了之后往下走,这个优先级呢,前面一再强调非控一定是最高优先级,对不对?同学,所以这个呢我们来来试啊,就是它得时时刻刻的去设置电机转速,这个不能耽误啊。
好了,接着往下走呃,往下走的话,是不是就是它得有一个这个taskhandle了呀,对吧?好,那再往下走,下边咱还得干啥同学,是不是还得有一个这个任务的,它也得有一个执行频率。因为我设置电机转速同学,我也不是说只设置一次就完事儿了,我是不是得时时刻刻的?根据我的计算结果去干啥去设置我这个电机转速吧,大家能想明白这个事儿吧。所以而且这个它设置一个电机的转速的频率一定得怎么着,一定得高,一定得非常频繁的去设置这个电机的转速,我是不是才能对这个电机转速有一个更好的控制啊,对吧?所以这个执行的周期我们给低一点,我这儿呢测试的比较好的,给四毫秒是比较合适的啊,比较好啊。那这个其实呃你要是设的太高的话,你就会你会出现一个问题。什么问题呢?就是它的响应速度会非常的慢。举个例子啊,我这就给十呃,再长一点一千,说白了就是什么意思呢?也就是将来我这个飞控任务是不是一千毫秒执行一次啊?那也就是我设置电机转速,我一千一千毫秒一秒钟设一次能理解吧。这个响应速度是不是会非非常的慢呀,对吧?我都歪了,但是你还得等一秒之后,我再去调整它,那肯定是来不及调整,所以这个一定要尽量的快啊,这边呢我们给四给四啊四毫秒,这个注意一下就行了。那这个完了之后,接下来咱们要做的是不是得把这个呃任务让它呃执行起来呀,对吧?来,我们这儿来一个呃,走,你创建,这叫什么呃,飞控任务,对吧?来,我们稍微等一等好,让他把这个参数给咱传进来,行,这些代码都不用,咱自己写啊,行,来往下倒。接下来咱们要做的是不是就去实现一下咱这个函数了呀,对吧?这个函数其实啊同学没啥,现在咱们没啥可写的,我们就随便写一下,我们就来一个well一啊。因为正常这里边的判断逻辑非常复杂,你得接收遥控的数据,你得计算PID然后得到一个最终的结果去设置电机转速,我们现在先不这么先不搞这么多啊,我们现在呢就只需要设置电机转速,我们直接写死一个值就行。哪同同学我们这儿呢还是以这种方式去做就行,先拿一个这个当前的时间,然后呢做一个是不是周期性的延时啊,对吧?哎,注意这回记得改一下啊,刚才就忘了改了,这个改成谁同学是不是改成我们呃,这应该是motor呃,这个flight对吧?flighttask后边跟上一个是不是period的呀,对吧?没问题吧,各位哎,好了,这个就行了。那完了之后呃,正常情况下啊,你这里边是有很多东西需要去做的。我这儿来一个土度啊,这里边呢就是好多计算这个电机速度啊,我们这写一下吧,我这儿就叫做计算电机速度。哎,好,那我们现在还不计算啊,我们现在直接扫不着同学,咱就直接给他设置就行,直接调用是不是INTmotorsetspeed的就可以啊。
同学好,那这里边咱怎么写,是不是你得给它传一个电机的一个结构体的指针进来呀,对吧?哎,好了,那同学我现在有这几个电机的结构体吗?没有没有的话,我是不是也先像LED那样把这个电机的结构体给它定义出来呀,没问题吧。
同学,所以这边呢我们这儿来定义一下啊,这个应该是电机结构体呃,结构体结构体啊。好,那现在呢咱们就开始。首先我们来第一个MOQR后边来一个STRUCTstact。好,那我们这个电机是不有好几个呀,对吧?我们是不是分成了?MOTOR我这儿是不是有lefttop,也就是左上角,对不对?那它应该等于谁,你是不是就得传他了,对吧?你得传你左上角的那个电机对应的这个是不是定时器以及通道没没问题吧。同学,然后再有就是它的初始速度,初始速度,咱们统一给多少给零,是不是就行了,对吧?哎,所以这边呢咱们怎么着来吧,来开始啊,我我应该怎么写,先写,是不是咱第一个应该是通道三的CH一p呃,没问题吧。那所以说我们就写通道三呗,那你当然这块需要引入,谁需要引入咱们那个定时器,对吧?incluclude啊呃其实其实那谁已经引了,是不是咱们那个motor已经引了呀?哎,我motor我还没引过来,那motor也引引过来啊,因为咱们需要去调它的方法吧。哎,好好,那接下来我们定时来进行。那这边首先应该是定时器的句柄,所以应该是and一下谁后边我们跟上一个HTM级tem三,它的CH一对吧?那也就是后边我们来一个呃teamchannel,应该是一这个没问题吧,速度是不是给零。哎,好了,那接下来我们往下进行后边一个就是该righttoprighttop我,我我还是先写leftbottomREFT啊BOTTOM呃,这个对应的应该是谁?刚才咱们看到了,应该是left一左下角,对吧?啊,应该是team,四CH四啊,那我们就写呗,这个是四这个呢也是四啊。OK好,那接着往下走,下回下回该谁了,是不是该righttop了呀,对吧?
righttop,我没记错话呢,应该都是二吧,应该是呃,team二CH二,这个没问题啊。好,最后一个让他给咱们提示,应该是rightautotomttotom这个应该是team,一CH三呃,没问题吧,各位哎,好了,那这样一来我们这四个电机的结构体就算是定义完毕了。好,接下来咱们往下翻下边,咱是不是就可以在这个位置去设置这个电机的转速了呀,对吧?哎,好了,那现在开始呗。那比如说我先来一个呃andlefttop那回车走,大家稍等啊。好,这个是leftbottom来走,这个是righttop,这个呢是rightbottom,这是不就是在设置咱们这个电机多转速啊,对吧?然后大家一定要注意啊,我们目前要是给它启动起来,它其实速度应该是多少啊,幺二是零对吧?那你要是测的话呢呢,你这儿呢可以先给他赋个初始值。因为正常情况下啊,你你这块是需要计算的啊,我这儿呢就直接在上边咱们付一个初始值就行啊,来这边咱们直接motor。呃,比如说lefttop,然后点儿speed呃,让它等于多少呢?呃,不要太快,因为我们最最最高速是一千,对不对?你先给他来个五十,你要是太快的话,上了一千,直接是不是就飞起来了呀?同学这个很危险,一定要注意啊,来我们先给小点给五十就行。你要想给高了,你拿着他用手拿着他别伤人啊。同学五十他飞不起来,这个我测过五十飞不起来,呃,现在是不就没问题了,对吧?然后测的时候看看它有没有,就是被那个线什么的绕住啊,要是绕着的话,你给它捣腾捣腾泥,然后你再那啥,你再给它烧入这个只要一烧进去,它是不是就一直断了呀,对吧?咱目前的这个逻辑是这样的啊,来现在我们开始呃大家稍等一下,我扫你去。哎,你会发现他不转没转,我这儿没转,对吧?为啥没初始化,对吧?咱们时候没对,我们声明了一个初始化,但是我没没调那个方法吧,没错吧,哎哪哪我写错了是吗?哪哪儿写错了呃,初始化那个方法是多写了个东西是吧?呃,就写不写,我也没调它啊,嗯嗯,哪哪个哪块是初始化吗?呃,呃,这块儿是吗?呃啊哦哦这个应该是二二是吧啊,二二啊。对对,就是我这首先写错了,再一个,我我我压根儿我都是没调它呀,对吧?我没掉它,所以这个得调一下啊,那初始化的事儿,咱们都得在哪做来着。同学还记得不初始化,咱们统一是不是在启动这个定时器呃,这个调度器之前呀,因为它后边的代码是不是都不执行了,所以我们应该在上面在这个位置啊,咱们去做这个初始化的操作啊OK比如说这边呢我们先来一个呃初始化呃,初始吃屎了,怎么初始化?这个应该是谁?应该是电机,对吧?哎,我们叫做电机啊,电机啊OK好,那完了之后我们就直接调那个是不是引进分方法就行了呀,对吧?哎,好了,喂,什么情况,你是不是打打到线了呀?来,我们现在给它烧录进去,我这回掉了,对吧?初始化方法来烧录进去。呃,大家注意观察,那我这儿就已经转起来了啊,我冒着打手的风险就拿起来给大家看一眼啊,我这儿已经转起来了,对吧?但是速度很慢啊,就是五十都能转,这四个都能转。就证明我目前应该已经是把这个给写好了,吓我一跳啊,行,没问题了。那完了测完之后,同学一定要注意啊,你再怎么着你你你就是测完之后确保它没问题了。然后我们短时间内就用不到这个电机了啊,你就再怎么着,你再都给它设为零啊,同学,或者说你这块代码呢,你再给它注了。注了之后,初值是不是就是零了,对吧?这个你就是烧滤进去,它也不会怎么着啊,它也不会转了。呃,能能理解这事儿吧,或者说保险起见同学,你把这几行代码你给他注了,省得他突然啥时候突然转起来了,能能理解吧,就是你测通的时候就尽量不让不让他转了啊。行,把这个个事停呃,把这个视频。
145-无人机-飞控项目-电源任务-纠错
cpp
复制代码
呃,来各位呃,刚才呢我们完成了这个所谓的电源任务,咱已经创建了一个任务,然后让它定期的去干啥,是不是让它定期的去帮咱们唤醒这个电源芯片呀,对吧?哎,但是这里边有一个很致命的问题,什么致命的问题呢?我刚才我烧录完之后,我把这个线拔了,它确实是一直能够正常工作,对不对?但是我刚才给它关机了,关机是不是咱们双击这个按钮,它就关机了呀,对吧?哎,然后注意观察,我再开,你看我能不能开开,我把这个调大点呃,有点儿太小了啊,大点儿。好,那注意观察同学来,我现在摁一下这个开机,哎,你会发现注意唉,开不开了,对不对?这这很致命的错误,对吧?这是咋回事儿?大家能不能想明白啊,别的是对对,其实相当于是咋回事儿呢?能不能想明白这个事儿,我摁了一下,对不对?然后相当于你刚上电之后,是不是咱们这个任务就开始执行了呀?执行之后,上来之后就干啥了,这是不是就按了一下,他把这当成连续两次案了,大家能理解这个道理,不两次按是不是就关机了呀?对吧?所以他就关他他他是这么一回事啊,就是这这个他有一个这样的问题。所以所以咱这个在写的时候一定要注意,你知道怎么改一下就行了。同学,你别上来就按你干啥呢?你先延时先延时十秒钟,我这是十秒钟,对不对?你十秒钟之后,你再是不是一次一次的去给我唤醒就行了呀,你别上来就先唤醒一次,能能理解这事不同学,哎,这么写,它就没问题了。来咱们测一下啊。OK这个其实是想演示的,我给忘了呃,来拿过来,就是你先延时,它也可以。哎,拿过来。行来。现在呢我们再呃重新的看一下,我这儿已经刷进去了,对不对?刷完之后呢,这回还是得把这个拔了啊。好,拔掉拔掉之后呢,你看我给它关了,哎,双呃,双击关了,对不对?然后呢,再开,哎,这回是不是就正常了呀,对吧?哎,就是这么一回事儿啊OK其实你自己也可以模拟一下嘛,对吧?你看就是我连着按两次,就是在它关机的情况下啊,我连着按两次,你看它它是不是也是关呀,他也是不开呀,大家能理解这个道理吧。同学啊ok啊好了啊,ok哎,应该是能看到的啊,嗯就是有同学可能理解不了这个事儿啊,你要你要注意同学,就是咱们这个电源芯片呢,它其实是一直都在工作的,他一直都在工作的,我关了,它其实并不是真的关了,它只是进入什么模式了,同学低功耗模式了,低功耗模式,它会关闭什么?它是会关闭这个呃这个升压输出呃,关闭什么关闭它的LED电源指示灯,对不对?那个电量指示灯哎,关闭那个照明LED它是不是把这些关掉了,对吧?但是它内部的比如说检测按键的逻辑,这个逻辑它并没有关吧,同学对吧?所以说你不管它是在开的状态还是关的状态下,你但长呃按两次按一次,它其实都是能识别到的,能理解这个事儿吧。同学,哎,所以在它关的情况下,你按两次它本身它也不会点亮的那按照我们刚才逻辑也是一样的嘛,对吧?哎,我按了一下,这算一次一上电,正好在一秒之内,相当于按了两次,那相当于相当于是两次按按了嘛,对吧?它就要关了,就是这么个逻辑啊,这个大家注意一下就行了。呃,能能理能理解吧。同学那按按下那个个位啊,一定定让让它怎么着,按按延然,然后呢再去唤醒啊OK避免启动的时候直接就是double了,对吧?哎,这个注意啊,听一下视频。
day02
00-FreeRTOS-中断处理脚本使用说明
cpp
复制代码
这个呃来吧,各位给大家说一下,就是我们这回到底怎样去处理福瑞RQS那俩中段就能够避免每次都重复的去处理它了啊。
呃,大家注意观察一下这个,但是但是这个仅限于就是大家使用EIDE这个插件呃,EIDE这块呢大家注意观察一下啊,你看在它的这个构建配置里边构建配置,也也就是编译是吧?哎,然后找找到这个构建器选项同学啊,呃,你看他这儿是不是有一个用户自定义任务啊,对吧?用户自定义任务里边呢,你可以添加什么呢?就是构建前任务和构建后任务啥意思呢?啥叫构建前,就是在我点这个按钮的时候,它会先执行这个构建前任务,然后再去执行实际的编译命令。哎,然后呢,编译完之后是不是还要去执行一个构建后任务啊,对吧?所以我昨天晚上就想了想,我能不能直接让他在这个构建前检查一下我的那个IT文件里边有没有咱那个重复定义的函数,有的话直接让他给它删了就行了。大家能理解这个道理吧。哎,所以昨天晚上呢,我就让那个AI让让GPT给我写这个脚本,然后呢咱直接把它添加到这里边来,其实就行了,就能实现这个咱们想的效果了。
这样一来,你每次重建代码之后,你就啥也不用管你上来,你直接编译就行。你一编译的话,他就算那边QMS自动生成了,是不是也会通过这个构建前任务给咱们删除啊,对吧?哎,就这么个逻辑,非常的非常的这个优雅呢,对吧?接下来给大家说演示一下,就是这个怎么去使用啊?好,我先把那当然这个就咱就没必要去那么折腾了。对吧?你要用删除的这种方式,我还用每次我还用去拷贝那个什么freeROS给咱们提供的那个源码吗?同学是不是就不需要了呀,对吧?这些就不需要了啊,不需要了。那所以说呢我现在呢就先把这些东西先给它部部除除,咱们就模拟一个这个实际的这个效果,这个是不是正常情况下每次重新新成代码之后,应该是这样的呀,对吧?好,同样道理,另外一个其实也是一样的啊,呃,这个咱们也是给它删掉,我恢复到原样OK大家一会儿做的时候也可以。
呃,嘿不是不到这,你看到这儿吧,对不对?这是不是他那个代码的原样啊,对吧?前面那个东西也是没有的,对不对?那然后呢,这回我需要进到哪儿呢?需要进到咱们那个呃callINC找到这儿。完了之后呢,咱把这个是不是得放开呀,对吧?同学哎,就是原来咱们在上辅月二十课基基础课的时候,当时怎么处理呢?你就还怎么处理就行了啊,只不过呃之前我们是手动的去把这俩函数是不是给它注掉啊,对吧?那这次让脚本帮我们删除啊。OK好,那接下来呢先给大家演示一下目前存在的问题啊,我直接编译。呃,这编译的话呢,肯定会提示我是不是这儿会有重复定义啊,对吧?哎,好,所以接下来呢给大家演示一下啊,这个脚本呢一会儿我会发给大家的这是一个powershell的脚本啊OK好,那现在呢controlc拿过来拿过来之后呢,我放在哪儿,我就随便你就随便找个地方。呃,我就建议大家呢直接放在咱们这个项目的根目录就可以啊。好,这是不是就是我这个项目的根目录啊,对吧?你就直接controll以拿过来,呃,直接点击粘贴啊,粘贴完了之后呢呃不要呃,其实也可以手动执行啊,其这这脚本也能手动一执执行的啊OK好,手动执行,其实它也会给你自动去删除。但是咱没必要啊。好,那这个是咱们当前的函数,然后大家需要注意的一点,就是啊呃这个路径呢,这是谁?这是不是就是咱们那个IT文件的路径啊,对吧?它是一个相对路径啊,相对于谁,相对于我这个文件的路径,所以大家呢你要注意一下,如果这个文件你没放在这个项目的根目录,那这个路径是不是记得改一下啊,对吧?你得能够让他找到,就是你要修改的那个文件啊。好,那完了之后呢,这个就是一些shell的呃语法了啊的语法。那这里边是读这个文件的内容啊,然后呢,这块儿是在寻找,就是我让他删的这俩函数嘛,对吧?proshok然后下边呢往下翻,如果找到了之后呢,他就会删除。如果没找到,因为因为举个例子啊,你第一次用QMI的生成之后需要删除。但是你第二次再编译,因那个编辑前的务是不是还会执行啊,对吧?还会执行,就不能再让它重复删了,对吧?因为没有了,所以找不到的话呢,就会提示你,没有找到目标函数文件未做任何修改啊,所以这个脚本大家拿过去直接用就行啊。呃,OK这也不是我写的,我也是让这个GPG勾写的啊呃这个来吧。那接下来我们往下进行呃,往下进行。因为你这玩意儿,你要自己写的话,这个你得学它那个shell的语法对不对?这个没必要啊,那没必要。行。那接下来呢给大家看一下,就是这块怎么找呃,怎么怎么配啊,来我们找到EIDE,然后呢找到这个呃构建配置,对吧?然后后下翻找找这这关键词选项,然后呢找到用户任务,然后呢我们找到构建前任务这块儿,你可以给呃任务起个名字啊,我比如说我就叫free二tos那这个呢叫做中断处理吧呃,处理啊。好了,那完了之后,这一块就是你要执行的那个命令了,对吧?那我们现在要执行的命令应该是啥呢?
是不是就是执行咱们当前的这个项目的呃,根目录,这下下边的这个脚本呀,对吧?
所以这边呢呃怎么去执行一个proshed脚本呢?这么执行power,后边跟上一个呃POWIPOWEL对SHEEL后边呢跟上一个杠fill杠fill,后边呢指向你那个shell脚本就可以了啊,我这个脚本的名字是不是叫做这个呀,对吧?咱们直接复制一下同学我叫做interrupthandle呃,handler,对吧?是不是就是专门用来处理这个呃这个这个这个中断的呀,对吧?哎,好,拿回来就这么写一下就行。这个注意啊,这也是其实说白了,这也是也是一个什么命令,也是一个这个这个这个什么什么路径啊,相对路径,它是直接在根目录下边去找啊OK所以说我们就放在根目段了,直接这么解说就行了,对吧?好,那完了之后,下面还有选项disable,就是你将来不想用了,你直接disable就行,你不用把它删了啊。好,第二一个呃abortiffield,就是如果这个命令失败了的话,那是不是直接就apport呀,对吧?那然后呢,这个是直接就怎么着的,直接失败了。如果这个任务失败了的话,那就直接stop他们不用管,咱们用默认值就行,然后一定要记得保存一下。哎,保存。那这样一来我们每次去编译这个项目,它编译之前呢都会去执行这个脚本的逻辑。好,注意观察。刚才我编译是不是有问题啊,同学那我这次我再编译走简易。好,哎,你看首先他这是不是已经给咱们打印出来了呀?说这个福瑞RTS中断处理已经完成了,对吧?目标函数已删除,对不对?
那接下来我们再回到这个IT里边去看一眼,你就会发现它就确实是已经删掉了啊。来点进来,哎,你搜这个pen的SV哎,应该是没了啊,有的话,他是不是也编译不过呀,对吧,是不是没了呀,对吧?只有这个注释了啊。好,那这样一来的话呢,咱是不是就可以随意的去这个生成这个新新的这个呃这个这个这个代码了呀,对吧?都无所谓了。哎,行,那这个脚本呢我发给大家啊,完了之后呢,呃大家呢就你现在要想着急配的话,可以配上啊。呃,这样我再把我刚才的这个命令也一块儿给大家发过去啊,呃在哪儿也在在这个这儿,然后呢找到构键器选项找到他和他。因为昨天昨天晚上我备课,实在是生成了之后,重新改这个东西实在是太麻烦了,不想不想再改了,然后就想了起来,这样还行,没啥太好的办法了。就呃然后呢我把这个命令给大家发下来保的来配置。嗯,行,那这俩东西呢我一块儿发给大家啊,大家上一下非丘上下非丘,我直接直接通过这个非球全局发,或者我放我共享目录里,大家自己下一下得了啊,有有因为有些可能没登上啊。行,我放在共享目录呃,笔记无人机,我就放在咱们今天的这个视频的目录里嘛,d零二电零二里。哎哦哦我这录着视频呢是吧?嗯,行行,我停一下。
01-无人机-飞控项目-通信任务-SI24R1-简介
cpp
复制代码
嗯,好了,各位同学,那接下来呢我们就一起来呃,看一看咱接下来要做的具体内容啊,呃按照我刚才的分析,我们这块儿是不是要先做一下这个通讯任务的,相当于是接口层啊,对吧?啊,这个接口层呢,其实主要就是呃实现一个什么操作呢?实现一个就是呃无线通信就是这么一回事啊。其实大家看我这个画的这个结结构图其实也能够看出来啊,我们这儿的无线通讯呢,其实使用的是一个什么?是一个SI二四r幺这样的一个二点四g的无线通信芯片,对吧?呃,首先需要给大家说明一点,就是这个SI二四二幺呢,它实际上是一款国产的芯片,它仿的是一款国外的专门做二点四g通讯的芯片,这个仿的挺彻底啊,就是它里边的各种结构寄存器啊指令命令啊等等,这些基本都是一样的啊,所以说你你基本就是一一回事,只不过这个就相对来说要便宜一些啊OK好,然后一会儿再给大家介绍,就是它怎么去使用啊。然后你先看我这个图应该能够看出来它的一个核心的使用逻辑应该是什么样的呢?就是我们应该是怎么着呢?需要通过,是不是SPI接口,对吧?跟这个无线无线通信芯片是不是进行通信啊,对吧?比如举例子,我要想发送什么数据,那你需要通过SPI将数据是不是给他,对不对?然后他是不是就会自动将这个数据转化成无线电信号,然后是不是发出去啊,对吧?
哎,那同理,你要是接收的话也是一样的那接收是不是也是由他去接收这个无线电信号。对吧他接收完之后呢,会去对这个信号是不是进行解析?解析完了之后,那我们的单片机要想读怎么读呢?也是通过一个SPI接口去读,这是不就是它的核心的使用逻辑啊,对吧?啊,所以无线电通信对于我们来讲确实挺挺难的啊,如果是真是让你去自己从从头去实现无线通信,那太麻烦了,你你得懂很多的物理常识,对不对?咱们那个电磁波怎么去传输数据啊等等。这个太太太麻烦了。所以咱们正常不可能呃这么做啊,所以一般都是用这种呃成熟的芯片啊,然后呢我们只需要通过简几个简单的SPI命令OOK能够实现这个无线数据的收发了啊,其实起起还是比较简单的啊。好了。那所以接下来的同学,我们呃首先要做的应该就是干啥呢?是不是得去学习一下,就是这个芯片,咱们到底如何使用了,对吧?啊,虽然用起来简单,但是你至少也得知道啊,比如我想发数据,那咱应该通过SPI给他发什么样的命令,对吧?我想读我应该是不是发什么样的命令,是不是得把这些事搞不清楚啊,对吧?啊,所以接下来呢咱们先去学习一下这款芯片的用法啊啊这个芯片咱去哪找的同学啊,咱应该去找这个是不是资料,资料里边有一个二点四g通讯,对吧?哎,好,然后大家可以看到啊,这里边呢给大家提供了两个数据手册,一个是简单版的,呃,里边呢非常简呃就是内容他他他说做了做了删减啊,就是非常简陋啊。那我们正常就看这个就可以啊。然后呢,大家就观察上边呢,还给大家提供了两个安装包,这俩安装包是啥呢?这是从网上下载的,就是这两个,这这个就是咱们当前用的这款芯片,它的一个通用的驱动。也就是说一会儿咱们用它的时候呢,我们其实可以直接把这个人家提供的驱动给它移植进来啊OK好,然后需要大家说注意的一点,就是你看这有俩包对吧?一个是SI二四二幺,这个是我们目前使用的这款对吧?然后另外一个是啥呢?NF二四l零幺,这个是啥呢?这个实际上就是它所仿的外国的国外的那款芯片啊OK好了,那当然一会儿我们用的时候呢,用这个就行啊OK但是一会儿你就能发现,其实就是他给提供的这个官方的驱动里边呢仍然有什么呢?这个的影子啊,就是里边还有一些注释,还带着它的名字呢,所以这俩通驱动基本上都是通用的。这个大家注意一下就行,别的不多说。那接下来呢我们打开它的数据手册,咱们只能是照着数据手册去学习的啊,来吧。那现在我们打开呃,不要打开这个briefbrief,是不是简单的意思啊,对吧?我们找下边这个SI二四二幺幺。好,那现在呢我们回到最开头啊,来咱们从头开始学习啊,来我们看目录吧。呃目录。首先我们看一下这个简介,看一下简介啊。呃然后呢呃这里边可能会就是遇到一些特殊的概念,大家不知道啥意思,咱们没不不用呃,不用着急,慢慢给大家解释就行了。首先我们从第一句话开始啊,他说SI二四二幺是一颗工作,在二四四g赫ISM频段段专位低功耗无线场合设计的集成了嵌入式ARQQ带带协引擎擎无线收收器器芯片。呃,这这里边就是短短的一句话,里边是不是有太多,咱们不太知道的这个概念了呀,对吧?
啊,OK好,没关系啊,那我们先明确出它的定位,这是一款无线电收发器呃,收发器对吧?也就是说,这款芯片是不是既能收又能发呀,对吧?那所以说在我们这个项目当中,我们的无人机上,还有这个遥控上边各有一颗这个芯片啊,遥控用于发。哎,无人机上那个用于收啊,它是既能收又能发这一点要注意啊。好了,那接下来呢再给大家说一下,那前面也给大家讲过,就是无线电通信,它靠的是什么?靠的是所谓的电磁波对吧?电磁波。ok好,那大家都知道这个电磁波呢它是不是有频率啊,对吧?那一个一个波儿它的特征都有什么呀?大家大家能想起来一个波的特征,它有什么有频频频率,没频频率,应该大家理解这个事儿,对不对?那还有什么呢?还有振幅对它还有一个特征是它的振幅,这叫它的振幅大,这是不是叫它的振幅小啊,能理解这事吧。同学啊ok好,那然后我们现在讨论的这个二点g赫兹指的是这个电磁波的什么呢?是频率啊。ok啊好了,那实际上大家都知道,就是呃其实除了就是咱们这个无线电通信会用到这个电磁波。
你像我们生活当中的,我们见到的光线,其实本质上也是啥呀,也是电磁波,只不过就是他们的频率是不一样的,频率不同,我的这个可见光的范围其实呃呃频率不同,我的可见光的颜色是不是不一样啊,对吧?这个大家还还有印象吗?嗯,哎甚至一些最高频的这个电磁波,就是可能不知道有没有没记得啊,就是那个伽马射线,其实也是电磁波啊啊,就是其实这些东西都是电磁波,只不过就是他们的频率不同啊,这一点大家都要注意啊,然后需要给大家说明的一点就是啊既然这个电磁波有这么多的频率。那所以说国际上呢就会对这个电磁波的频率啊去做一个呃划分啊,ok不同频频段的电磁波只能用于什么呢?特定的用途啊只能用于特定的用途啊,你像呃我们目前所使用的这款二点四g赫兹,那它它的用途是什么呢?它的用途就是ISM这个ISM是什么?其实这个东西你一搜你就能搜出来,咱们可以去看一下啊,给大家看一下。呃,你就搜ISM频段就行,直接回车。呃,你看这儿有一个维机百科,对吧?它那对它进行解解,解释了,咱们可以简单看一看啊ISM频段。呃,它的中文意思是什么呢?是工业的,也就是industrial,对吧?科学的scientific和医学的medical是不是就是工业科学呃,医医还有医学对不对?就是在这个呃领域里边,我我们是不是可以使用这个二点四g赫兹的这个频段呀,对吧?那至于其他频段那都用在什么呢?呃,这个一会儿你要是感兴趣可以可以搜一搜啊。呃,有一些比如说是专门用在核潜艇的,有一些是用于广播的啊,有一些呢是用于这个呃这个什么什么对讲机无线电通讯的等等,乱七八糟的,非非常非常细啊,这个划分的啊OK那当然呃每每个国家它它的划分可能也不太一样。这也跟大家简单了解一下就可以了啊。好了,然后为什么咱们这是用这个二点四g呢?其实人这后边也说了啊,他说了这个呃,我们看一看哪儿呃,呃,看这儿同学看这儿啊,他说应用这些频段无需许可证,或者是费用。就是说如果你使用这个SM也就是二点四g赫兹啊OK你是不需要任何的许可或者费用,你可以随便用啊OK只需要遵循一定的发射功率啊,不要对其他频段频段造成干扰机子能理解,这是吧?那所以你看这儿也说了啊,我们日常生活当中的无线电局域网,也是咱们那个wifi,对不对?你像蓝牙等等的,他们都其实是可以公布在二点四g频段上的,但是目前的wifi它处理有二点四g是不是现在也有五g了呀,对吧?啊,注意就是wifi里边的五g是不是跟我们就是呃手机信号那个五g它不是一回事吧吧,k大家一定要搞清楚啊。OK首先二点五g是不是那个既是generation的意思?就是第五代,对吧?然后然后这个wifi里边五g呢指的是是是咱们那个无线电那个呃那个无呃电磁波的那个频率是五g赫兹的OK这一点一定要注意啊。行了,那这就是ISISM频段的这个意思啊,这一点大家要搞清楚啊。好,然后后边呢还有一个概念叫做专为低功耗呃,无线场合设计。呃,一会儿其实咱们看它的这个芯片的工作模式,我们就能看出来,它其实是确实支持这个低功耗模式了。好,那这个咱们一会儿来看啊,所谓低功耗模式是啥意思呢?如果我有数据需要去进行收发。好,那我是不是就进入就是全副武装的这个状态呀,对吧?
正常的工作状态,如果我现在不需要收发数据,我是不是进入低功耗状态呀,对吧?就这么个意思啊。好,那接着往下走,后边还有一个概念,可能咱不太理解这个叫啥呢?ARQ基带协议。ARQ这是一个传输协协议啊,同学ARQ是啥意思呢?呃,我记得这个手册前边是有一个表格的。
你看人家这块是不是有对一些术语的描述啊,对吧?ARQ第一个就是ARQ它的意思是啥呢?是autorepeatrequest,是不是?就是自动重传请求啊,对吧?就是啥意思呢?我们当前的这款芯片呢,它支持这样的一个操作啊,因为它是收发器嘛,对吧?比如说这边发送送端,这可返发送端。哎OK好,那那现发送端端接收端。比如说发送了一条信息,哎,发过来了。好,那这个时候啊,同同学这个发送端,他他了了,保这个个数据成功的发送到这个接接端。好,他要求什么呢?他可以求求就是我这个接收端怎着着同学给他返回一个,你觉得应该返回个啥东西啊?哎,对,ACK啊好了,那这个发送端呢收到这个ACK之后才会认为我上一条数据发成功了。如果在他规定的时间内,他可以配置操作时间。在规定的时间内,如果没收到这个ACK好,那他就会认为上一条数据发失败了,发失败了,它会怎么着自动的重新发送上一个数据包,能理解这个事儿吧。同学ok好,然后这是不是就是一个所谓的自动重传呀,对吧?这个自动重传或叫做自动重发请求。这个东西完全是由他内部的这个硬件,实现了,我们无所稳,无需干扰,稳不无需干扰。你只需要告诉他,我要发什么就行了,然后他就会确保这条数据顺利的发送到或者成功的发送到接收方能理解事儿吧。哎,这是他所提供的一个非常不错的一个功能啊,这点大家理解一下。哎,好了,那现在这句话大家应该基本上是能够理解了,对不对?好了啊,那接下来我们往后看,同学后边又提到了,说咱们这款芯片,它的工作频率的范围是什么呢?是呃,两千四百兆赫兹到两千五百二十五兆赫兹啊,你看啊这是不是差不多,就是二点g赫兹的这个这个这个这个范围啊,对吧?对不对啊,二点g这注意这个是兆嘛,对吧?兆,你乘个十呃十的三次方不就是g嘛,对吧?哎,这点大家注意一下就行了啊。OK好,那所以说呃它具体的工作的频率范围是这么多。然后这也提到了,它说它一共有多少呢?一共有一百二十六个一兆赫兹带宽的信道就是啥意思呢?这句话怎么理解?同学这句话怎么理解?哎,其实很简单,同学它是这么一回事啊,就是说咱们这款芯片呢呃它支持的这个电磁波的频率的范围是哪儿呢?是从两千四是不是到两千五百二十五啊,对吧?但是它实际工作的时候呢,就是我在给从比如说这是发送端,对吧?这是接收方啊呃TROK好,那它俩在传入数据的时候呢OK它可以选择这个范围当中的任意一个频率,能理解这事儿吧。同学ok一共有多少选择呢?一共有这样的一百二十六种选择,那分别是多少呢?我可以以两千四百兆赫兹的这个频率去发送数据。我也可以以比如说两千四百零一兆赫兹的这个频率去收发数据。我也可以以两千四百零二兆赫兹的这个频率去发收发数据,大家能理解这个事吧。啊,那当然呢你在呃去呃呃选择这个频率的时候啊,同学具体的工作频率的时候,你的收你的发他俩是不是必须得统一啊,同学哎,是这样的啊,这是不是就是是所谓的这个有一百二十六个信道啊,对吧?你可以算一下吧,对不对?所谓的一百二十六个信道。那以后同学大家想想在咱们这个教室里边,我们是不是每个同学人手都有一套这个东西啊,对吧?咱们自己再去呃做这个相关的测试的时候,那我们每位同学是不是必须都得选择不同的这个工作频率啊,对吧?也就是选择不同的什么不同的信道嘛,对吧?啊,一百二十六个应该也够咱们用了。如果说你要是两个东西用的是一样,你俩之间是不是就相互干扰了,对吧?你a发的b能收到,b发的a也能收到,是不是就会乱了呀,对吧?那这一点大家要稍微的注意一下啊,同学这就是所谓的信道的这个概念啊OK好,这一点大家理解一下啊。好了,那我们接下来继续往下进行。后边呢是说说它内部集成了一个LDO电源,它可以保证这个宽电源范围的一个稳定使用。这个无所谓啊。好,接下来我往下走,我们再看第二段话,这样的话又会遇到一些不太理解的东西啊。他说,SI二四二幺采用GFSK和FSK数字调制与解调技术。呃,来我们先把这个基础概念普及一下啊,首先我们先得搞清楚什么叫做调制和解调同学什么叫调制,什么叫解调啊呃调制借条呃,其实大家生活中就降这玩意儿,大家家里都装过这个宽带,对不对?哎,宽带是不是会有一个什么东西,是不是有一个所谓的光猫啊,对吧?咱是不是管它叫光猫,对吧?
那个猫那个猫是怎么来的?那个猫实际上是从它的英文名字来的啊啊,modify对吧?呃,应该是那个单词吧,我也忘了读怎么读了啊,但是开呃,那个首字母是m啊。ok好,那其实那个m就是啥意思?就是调制的意思,调制解调器,就是那个光猫啊,那在我们的家庭宽带当中,那个光猫那个所谓的调制解调器,它的作用是什么呢?它的作用是不是就是将你的一般现在我们都是光纤,是不是传播这个这个信号了呀?对吧?OK它将你的光纤信的里边的光信号能理解吧,给你所谓的解调成什么呢?
解调成是不是我们能识别的数字信号啊,对吧?好,那反过来,你要是想通过这个呃你的宽带往外边发送出去,那你需要先怎么着?先把你的数字信号是不是还得调制成,是不是这个可以在宽带里呃,在那个光纤里边传传播的那个光信号啊,能能理解个事吧。
同学,这就是所谓的调制与信号啊,总结一下所谓的调制呢,就是将你的数字信号给它,是不是说白了就是给它,你可以理解为就是呃转化成呃,是不是可以在其他的这个介质当中传播的信号啊,对吧?OK好,那对于光纤,那你你是不是就是那个那个那个相当于是光线信光信号啊,对吧?OK好,那对于我们这个无线电呢,无线电通信的时候,你是不是也要先把你的数字信号调制成什么?是不是无线电信号啊,对吧?哎,那反过来在你接收收到这个无线电信号之后,你还要干啥,你还要做解调,对不对?你再把它怎么着,是不是解调为所谓的,是不是数字信号,大家能理解这个道理吧?哎,好了,那这样一来是不是我们的呃,MCU对吧?我们单片机是不是就能够跟这个芯片是不是进行通信了呀,对吧?呃,因为咱们单片机是不是只能识别这个数字信号,对吧?呃,它识别不了这个无线电啊OK这就是所谓的调制和解调啊。好了,完了之后,我们再来看一下前面这个概念GFS和FSK是什么意思呢?呃,这个你要不知道的话,其实前边这个表格里也有说明啊,在这儿呢,这是不是那个所谓的GFSK或者是FSK啊,对吧?这是啥意思呢?这个这这是高斯的意思啊,高斯什么东西呢?frefreenck是什么意思?频率的意思对吧?ok好,那完成之后shift是什么意思呢?呃,移移动移频对吧?然后q就是这个东西,咱们是不是连起来,我考完每个单词我都知道啥意思,但我连起来不知道啥意思,对吧?那翻译过来之后,也不知道啥意思。高频呃,高斯移频呃,频移监控,对不对?在这是读起来很拗口。呃,所以这个东西呃我就给大家说一下它的作用是什么就行了啊。首先大家要搞清楚一个这样的问题,你要想通过无线电信号,通过电磁波传输数据,对吧?同学,你得思考一个这样的问题,就是我怎么让这个电磁波去携带数据呢?比如举例子,我想发个一零一零一零一零,是不是因为我们数字信号本质上是不是还是一零一零零啊,对吧?
我怎么把这样的一段数字信通过无无电波波,也就是电磁波对吧?怎么通过它传播出去呢?就是怎样让这个呃电磁波承载我这个信息说白了就是这么一回事,这个大家有没有什么思路啊?比如说这就是一个无线电的一个电磁波啊。好,我怎么让它去表达零或者是表达一呢?这个是不是好像不知道怎么搞啊,对吧?它不像我的数字线杠,我有高低电瓶,我可以表达零一,对吧?
你这个无线电波,你怎么表达零和一呢?两种最简单,最好理解的方式就是什么呢?一个是通过调整这个电磁波的频率来传输我这个信息。因为前面讲过啊,一个电磁波它的这个特征就是啥?咱们能理解的有频率是不是有有这个振幅啊,对吧?那所以说你要想让它表达出不同的信息,你是不是除了就是调整它的频率,就是调整它的振幅啊,对吧?就是还有一种方式就是调整它的相位啊,那这个咱们就不过多的介绍了,我们就了解这两种方式就行。先说振幅,比如说我振幅大了,对吧?我就认为这个传输的是什么?是一对吧?我振幅小了,我就认为我传输的是零。当然你这个振幅的大小这个东西呃,谁谁谁谁跟谁会去解决这个事儿了,是不是调制和解调它们俩会统一的去协调这个事儿啊?对吧?哎OK好,他认为我发的时候,呃,我发的时候,我认为呃振幅大的就是一振幅小的就是零。但你那收的时候候是不是得按照这个逻辑去去解析啊,对吧?不就这么个逻辑嘛,哎,这是靠什么呢?这叫靠振幅来传达我这个数数据。好,那还有一种方式,那就是通过调整过这个频率调整我这个频率啊,比如说我频率快快点儿OK这叫频率快,对不对?同学好,我就认为我传的是一,那我频率慢一点。哎,好,那我就认为我传的是零,大家能理解这个事儿啊,呃这就是所谓的就是呃这个这叫什么呀?这叫移频监控啊,还有一还有还有控制咱们那个幅度的那种方式啊,呃这个所谓的移频监控呢,就是什么意思?
就是通过控制这个电磁波的频率来传输这个数据啊,就是这么一回事啊。好了,那这一点大家注意就可以了啊。好,那当然有同学可能会说了啊,不对呀,不对呀,你控制频率,那我这个是不是会出现问题?因为我这儿是不是规定了,就是我一共有一百二十六个一兆赫兹的这个带宽啊。那你举个例子啊,那我不是必须得工作在这个频率才行吗?就是我我我我同一个信道,大家能理解这个呃呃呃,是不是有可能会这么想啊,对吧?那我要控人的频率去传输零一,那我是不是可能会干扰到其他的这个信道啊?有有同学会有这种疑问,对吧?有这种疑虑,其实不用担心啊,同学你要知道的是你这个带宽是什么?
是一兆赫兹啊,对吧?相当于说我一个信道,我的实际可用的这个频率的范围是多少到多少呢?比如说是二四零零兆赫兹到多少?二四是不是九九九九九九九赫兹啊,大家能能想明白这个事儿吗?就是兆后边是不是跟了十呃,跟了这个十的六团跟了六个零啊,对吧?那实际的频率范围是不是从这儿到二十四后边跟一大堆的九啊,对吧?这是你实际的一个信道,它的这个带宽嘛,嗯宽宽宽宽是不是肯定得有宽度啊,对吧?所以它是这个范围里边,这是一个信道,所以说那它在在这一个信道里边,这个频率是可以随便用的。所以说在这一个频呃一个信道里边边,对吧?比如说我高频呃,对吧?高频比如说接近二四九九九九,这就是的高频嘛,对吧?哎,好,我代表是一,那我接近二四零零零啊,好,那我传的就是就是零了,对吧?哎,大概是这么一个意思了啊,就是大家体会一下就行了。OK好,这就是所谓的GFSK和FSK啊,这个大家稍微再调呃理解一下就行了。总总之呃,明确一下,就是我们这款芯片呢,它是通过调整什么调整电磁波的频率是不是来表达我这个数据的呀。对吧?哎,这一点注意就行了啊。好了,然后传输的过程当中呢,他说可以支持这个速度的调节支持这么呃几种这个传输速率啊,这个了解一下就可以啊。行,这个咱们就不再看其他的了。然后呢,我们往下翻看还有没有什么咱们需要不了解的东西啊,呃这个是关于它低功耗模式的一个介绍,对吧?
哎,这个咱就不多说了。然后呢我们往下看,哎,这儿有一个哎操作的一个基本逻辑。这儿提到了,他说SI二四二幺操作非常简便,只需要我们的单个耳机通过SPI接口对这个芯片少数的几个寄存器进行配置即可。实现数据的首发通信,这是不是就是它的核心使用逻辑啊,对吧?我们刚才其实也已经提到了啊。好,然后再往下走。这边呢他说呃集成了这个ARQ这样的一个自动重传请求,对吧?这样的一个通信机制啊,所以说呢是支持自动重发的,所以这个呢也是大家呃了解了,这个咱就不多说了啊。好,然后我们再往下走啊,他说这个需要非常低的系统应用成本,只需要一个单片机和少量的外外电路啊,然后呢就可以组成一个无线电的收发系统啊OK这里边其实也有它的典型的应用原理图。在这个位置呢啊,实际上你要是想用它去做这个收发的话,持续参考它的这个应用内图就行了。我们这其实也是参考的这个啊行了。那这就是对咱当前的这款芯片的一个基本的介绍啊,然后这儿是不是还有一个它内部的一个结构图啊,对吧?啊,一会儿我再单独给大家说这个结构图啊。好,现在我们稍微的总结一下同学啊,关于咱们当前的这款芯片呢,我们需要了解的内容有什么?首先第一个唉,它是一个工作,在二点四g赫兹频段的这样的一个无线收发器,对不对?唉,好了,那它是呃具体的这个这个这个这个工作的频段是上到多少呢?是二四零零零兆赫兹到二五二五是不是兆赫兹的对吧?然后一共提供了多少个,是不是一百二十六个一兆赫兹带宽的信道啊啊,对吧?OK大家一定要理解,就是这个一兆赫兹带宽指的是什么意思啊?也就是它这一百二十六个信道,具体指的是哪哪一百二十六个,咱得得知道不是应该是二四零零零零零到二四九九九九九,对吧?然后后边再干一个啥,是不是二五零零零零零,再到是不是二五九九九九啊,对吧?哎,这是它所提供的一百二十六个一兆赫兹带宽的这样一个信道啊。好了,大家体会一下这个事啊,行了,就是这个意思啊。好了,然后再有呢就是它是怎样去呃通过这个无线电传输数据的呢,是不是通过调制这个无线电信号的一个频率啊,对吧?呃,高频比如说代表一低频代表零等等等等啊,这个其实就是无线电通讯的这个专业领域的知识了啊,还挺复杂的啊。行,呃,这个咱们理解,然后再有一个需要大家注意的就是我们在使用它的时候,咱的核心思路就是通过SPI接口是不是跟它的少数的几个寄存器进行配置啊,对吧?就完事儿了,然后就能实现收发了啊。好,然后再往下呢呃它内部有一个自动重重传的这样的一个机制啊,所以说是能够保证这个数据的安全可靠的啊,这一点要注意行了,就说这么多啊,这是对这款芯片的一个基本。
02-无人机-飞控项目-通信任务-SI24R1-芯片结构
cpp
复制代码
有呃好,各位啊,那接下来呢咱们需要再来看一看,就是他这块儿给咱提供的一个系统结构图芯片结构图啊一个框图啊,一个简图就是我们大概了解了,了解它里边都有什么结构,然后它的一个基本的工作流程是什么样的啊,来我们快速的了解一下同学。呃,首先各位啊我们现在呢先来看一下左半部分吧,左半部分其实大家能够看到啊,这两这两个东西你可以看成看成一个什么东西,看成一个模块啊,这是什么东西叫做transmitter,是不是发射模块啊,对吧?叫做发送模块。好,然后这俩东西呢你可以给它看成啊一个部分,这个叫做receiver是不是接收部分呀?
没错吧。同学OK好,然后我们来分别看一看,就是这两部分都是啥啊。首先我们看这个这是一个所谓的GFSKFSK的什么东西?这就是那个猫嘛modullator对不对啊,咱们就这么读吧啊OK好,那这是不就是那个所谓谓调制器器,对吧?好,那与之对应的这边有一个啥,是不是第modudulator啊,对吧?这是不是就是一个解调器啊,对吧?哎,OK好了,那完了之后,你注意观察一下,同学就是这个p制器也好,解调器器也好,就是它的两端都分别联接到了哪儿?我们先看这个,哎,你看它的输入端是谁?是不是这个所谓的ARQ引擎啊ARQ引擎是不是专门用来做这个就是自动重发的呀,对吧?哎,发送数据是啥的,都是由它来说的算的,要想发送一个数据OK是不是由它来发,对吧?他他要发的话,需要怎么着?先把这个数字信号给到这个调制器,是不是让让它调成调制成什么?是不是无线电信号啊,对吧?哎,OK好,不就是这么个逻辑嘛,你看这人箭头是这么标的嘛,对不对?OK好了,那完了之后,你注意连的是什么?看一看也就是它输出端连的是什么?是一个PAPA就是功率放大器的意思。因为他需要把这个呃是不是无线电信号发出去啊,出去啊,对吧?对,所以说为了让这个信号更强,哎,它会进行一个功率放大啊。好了OK那这样一来的话呢,就会把这个信号发出去。好,注意,那这两侧连的是什么啊?是两侧连的是天线啊,这个天线就直接发出去了啊。OK好,这是不是就是一个大概的一个发送流程啊,对吧?好,那解调是什么样的?呃,就是接收是什么样的呢?注意,这是不是咱们那个接收接收端呀,对吧?接收端这块呢,首先这儿连了一个放大器,这其实也是一个放大器啊,叫做低噪声,放大器啊OK好,它会去做一些这个滤波的一些处理啊OK好了,那总之它会把什么呀?那左侧是不是连接的是天线,这是天线啊。好,那它会把天线上边收到的,是不是这个感应信号是不是转换成是不是这个数字信号才行啊,对吧?OK好,那怎么转换呢?先经过它放大,放大完之后给谁是不是给这个低啊,对吧?是不是一个所谓的解大器啊,就能把收到的无线电信号器啊,哎解调为数字信号的好,数字信号就给到谁了,是不是给到了这个modumomolatataRQN这样对吧?哎,是这样的,也就是他说白了是一个专门负责,是不是发和收的一个核心的引擎啊,对不对?
发什么收收什么?他说了算啊,他来控制这个事儿啊。行了,那这个完了之后,我们再看右侧同学,咱看这右边首先看这儿这儿有个啥东西TXfaelTX是不是就发送的意思?fafoffirststeinfirstsalout这说白了就是一个什么东西,就是一个队列啊,用来做啥的,用来做缓冲的啊。OK好,那如果我们将来想要发送数据,我们不是直接把数据给它,咱们应该给谁呢?同学给这个是不是队列呀,对吧?你只需要把你需要发送的数据放到这个队列里。好,那它就会自动的从队列里边读数据。读完之后呢,是不是给到它,然后呢再给到它,然后就发出去了,对吧?哎,就是这么一个思路啊。好了,那接下来呢我们再往下看各位同学再看这儿,哎,同样的道理,这还有一个什么RXfaflsalout对吧?是不是也就是一个接收的缓冲区,对不对?同理,我现在要想接收数据的话呢,怎么着呢?你也不用直接去找它,它会自动的把收到的数据给到哪儿,是不是给到这里边啊,对吧?我们要想接收数据,我们只需要读这个fafo就行了。哎,是这样的啊。好了,那现在问题来了,同学我们怎样去读那这个fafl或者是怎样往这个fafl里边去写呢?很简单,哎,咱通过谁呀?同学SPI嘛,前面讲过咱们单片机跟它通讯的接口是不是叫SPI接口,对不对?然后这块儿呢,其实它那个SPI的四个引角啊OK好了,那完了之后,我们要想往这个肺复里写,你通过它哎就可以写进来。那读的话也是通过它就可以从里边读了。这个大家应该是能想明白这个事的对吧?哎,好了,就这么一个思路嘛。好了,那完了之后,这块表达达来的是啥呢?是一堆堆寄存器,一堆的的存器器,要想配置一些参参数乱七八糟,你需要去配置这个寄存器。当是配寄存器的话也得通过,是不是SPI接口啊,就这么一个思路啊。好了,那同学现在呢大家关于这张结构图里边呢,是是哪儿还不太了解的这这还有俩这这俩其实就是俩引角啊,各位同学这就是俩引角啊,包括这个是不是是是部的引引,这是不是也都是给咱们暴露出来的引角啊,对不对?OK啊好,这个是接天线的,这个是SPI接口这俩是啥呢?我们来看一下,先看CECE应该好理解CE是不是checkenable呃,enable对对吧?
是是就是是enenable对吧?就是说白了就是使能信号嘛,对不对?哎,你要给它置一好,那咱们这个就能够收发出去置零,它就收发不了,就这么一回事儿啊。好了,完了之后,这个IRQ不知道大家能想明白是啥意思?不房子IRQ这个是重发的意思吗?不是啊,i是interrupt的意思,r呢就是RQ就是request嘛,是不是就是中断请求啊,对吧?哎,好,有没有同学能想明白这个中断请求的作用是什么?你看它这个箭头的同学箭头指向里边的那就是你需要是不是给它这个芯片输入信号啊,那指向外边的,是不就是他给咱们外边发送信号啊,对吧?
你看这个SPI是不是也能看出来MOI是不是指向里边的?MISO是不是指向外边的?哎,没错吧。哎,好,那所以说这个IRQ它是指向外边的,说白了就是它向我们的单片机发送数据的一个引脚吧。哎,好,那大家能想明白它的使用场景是啥?不举个例子啊,同学咱现在这个芯片是不是既可以发又可以收?比如我现在收到了一条数据,收到数据,你说我单片接分得读他这个数据啊,对吧?那你怎么知道他这儿收到数据了呢?无非就是两种思路,要么就是轮询,我一直去查他有没有收到数据?是不是可以可以拿到了,对吧?可以及时的拿到好,那还有一种方式就是就是啥呢?哎,让他是不是把这个眼角接到我们单片机的一个眼角上,我们眼单片机眼角开个什么东西?你开个外部中断呗,大家能想明白这个事儿吧。哎,好,开,外部中断断了之后呢,他这儿是不是一来数据,唉,直接通过他给你的中断引角发个信号,那你当片机不就知道了吗?知道之后不就可以去读他的数据了吗?是不是也可以这样做呀,对吧?哎,两种方式都可以啊。
呃但是经过实际的测试,它的这个中断引脚有点问题,它工作不稳定,工作非常不稳定。那所以这块咱们项目当中并没有采用这种中断的方式啊,其实还是采用的呃轮轮的方式。那啊这一点大需需注意意下下啊OKK那那这是于它的整个芯芯片的一工工作。呃,流程程测测试程程么?读读写数据,咱们大概应该清楚了啊。行,我听一下。
03-无人机-飞控项目-通信任务-SI24R1-工作模式
cpp
复制代码
啊,好的,同学,这是咱们当前这款芯片,它的这个所有的银角啊OK好了,然后呢我们往下翻这块是不是就给出给出介绍了呀,对吧?呃,这块咱们就不用过多的去看了啊,就是咱们这边只关注和咱们和咱们什么呀,和咱们这个呃相关的这个银角就行啊,其实相关的角主要就是这几个正常情况,咱们看这几个就行,对吧?来明确一下都是啥啊,这四个引角这四个没啥可说的吧,对吧?这是我们的SPI的是不是标准的一个四线通信的一个引角啊,对吧?哎,有它的片选信号,有时钟信号有它的输入,还有输出,对不对啊?有这些啊。行,然后数字之外呢,还有一个就是咱那个CE眼角,刚才也看到了它的作用,是不是就是芯片的开启信号,说白了就是使能对吧?
要想发送或者是接收数据。这个你得至一才行啊OK好,然后你注意看看它这个所谓的端口类型DIDIDO这个啥意思呢?
DII的意思就是input对吧?b就是d类的数字输入,对吧?那这块呢你像这种是不是数字输出啊,对吧?
哎,这个大注注意下,ILQ呢这个是一个终端信号,什么叫做可屏蔽终端信号呢?就是你这个可以用,可以不用,那能能理解这事事吧,同学就是可屏蔽吧,对吧?能用你想用,你就用,不想用,你就给他屏蔽了也行啊,就这么一回事啊。好,然后是什么有效呢?低电平有效。也就说白了,他这儿如果收到数据了,他给你发了一个呃这个这个这个呃这个这个终端信号的时候,他是不给你一个低电平啊,平时它就是高电平呗,那意思就是就这意思啊,行了这些咱们了解一下就可以了。像其他的咱们就不再一个一个去看了,有些接什么天线的这些东西,你按照它的这个呃这叫典型,应为原理图去做,这不就行了吧吧?关注咱们跟咱相相关的就行啊,这吧,关于它的引角的一些说明啊OK再往下呢,我各位同学要给大家介绍的就是啥?
就是他这个芯片的工作模式了啊,我这个这个文档非常多啊,同学,但是我不可能都带着大家看,我现在就挑核心挑特别重要的东西跟大家说啊,那首先我们看一下它这个所谓的工作模式。呃,这块呢他说这个芯芯内部是不是有一个所谓的状态机啊状态机这个概念大家现在能理解了吧吧,对吧?所谓的状态机呢,就是说我有的东西呢,它有各种不同的状态。然后我这些状态呢是不是可以来回转换呀,对吧?在某些特定的条件下,可以来回转转换,就整个的一个转换逻辑,就是它所谓的状态机啊OKstatemachine就是这个意思啊。
好了,那之前咱们讲freryRTS是不是咱们那个任务还要有状态机呢呀,对吧?哎,来这是这个芯片的状态机,呃,我稍微调小一点,哎,算了,就这么看吧啊。好,他说这个芯片呢一共提供了五种工作模式,也就说白了五种状态呗,对吧?哪五种呢?shutdownstandbyidolTXTXRX就是说核心就是是在看名字,咱就能看出来啊,真正的可以发送数据和接收数据的模式,是不是一定是这俩模式啊,能理解刘事吧。同学。那所以你想啊就是如果说我只是为了收发数据的话,那其实没必要设计这么多的模式嘛,我这俩模式是不是就够用了呀?
那前面那些模式都是干啥用的呢?你听他的名字,瞅着就像低功耗,对不对?什么特shdowndownstbyidle,这哎是是不就是低功耗啊,对吧?哎,是这么一回事啊,所以说它实际上是为了实现这个低功耗的模式呃,低功耗,所以说才设计了这么多的模式啊OK好,我能我需切发的时候,我就进入到发送和接收模式。我不需要的时候呢,我就要不就沙特down,要不就standby,要不就idol呗,不就这个逻辑吗?同学哎,就是为了省电,说白了就是啊好了,那接下来呢我们需要了解一下,就是这几种模式,他们都是啥意思?
完了之后呢,他们之间是怎么切换的?因为你将来你写代码,你是不是得知道就是我我怎么切换到TS,我怎么切换到RX啊,对吧?这事咱们得清楚啊,来吧。那现在我们就快速的过一下,这是它整个的一个转换的逻辑图是不看起来还挺还挺啰嗦的呀,对吧?不过也没关系啊,一会儿咱们其实这个写代码也写不了太多。因为我们是不是直接用它官方提供好的驱动啊,对吧?啊,所以一会儿咱们稍微的改改代码就行,就这个咱们了解就行啊。来我们先看最开始的这个沙特down模式说沙特down模式杀down是不是就是关关闭的意思啊,对吧?就这个模式下边呢收发功能啊,模块关闭,注意收发功能模块其实指的是哪个东西,是不是就是这这这个模块啊,你像它的调制解调功率放大这些东西是呃包括这个射频模块,就是往往外发数据,这个这个时候它都不工作呀,对吧?这个是它最省电的一个模式啊,这个大家要注意一下啊。OK好,那我们继续往下看啊,呃然后呢芯片停止工作,消耗电流最小。但是啊哎哪儿呢?内部的寄存器的值和缓冲区的这个值保持不变。我们的单片机呢仍然可以通过SPI对这个寄存器进行读写。好,这时不就是它这个所谓的沙特down模式啊,对吧?哎,好,这一点大家要注意啊。OK好了,那接下来我们往下进行看第二,一个模式standbystandby工作模式。
啥意思呢?他说在这个模式下,只有晶体振荡器电路工作保障了芯片,在消耗较少电流的同时,能够快速启动。呃,是这个意思啊。ok来什么怎么去理解这个事儿呢?其实非常简单,晶体震量器,其实咱们前面没提啊,但是你应该知道它它的作用应该是啥呀?是不是提供时钟信号啊,对吧?比如说它内部其实也是有一个时钟信号的OOK是在这种模式下边呢,我的时钟信号是有的,有它的话有什么好处呢?他说能够在保证我消耗较少电量的同时,能够怎么着快速的启动?来我们看上面的那个转换的原理图案去呃,怎样从你看最开始芯片上电之后,是不是先进入关断模式啊?对吧在这个沙特浪模式,也就沙特浪模式。ok好,这个模式下边我们前面讲了,是不是只有那个寄存器是可以读写的,其他所有电路是不是都不工作呀,对吧?好,那完了之后,我怎样进入到这个下一个模式,所谓的待机模式呢?是不是这有一个寄存器叫做PWRR这是寄存存里里边的某一位啊,你给它置一是不是就进入到待机模式呀,对吧?好待机模式跟关断模式有啥区别呢?首先,待机模式我能收发数据吗?同学也收发不了,我的收发模块,也不工作,能理解这个事吧。同学但是他谁工作了呢?时钟信号有了,你时钟信号有了之后,你将来要想去收发发。据行,你从这你你切到这个接收,或者是等送模式,是不是要比最开始那个沙特down,切到这个模式要快啊,对吧?
说白了,我这个时时刻准备着吗?对吧?不就是standby的意思吗?对吧?不就这个意思吗?哎,好能大家能理解这个事吧。哎,就这意思啊OK好了,接下来我们再往下走,再看另外几个模式啊,对吧呢?就是idolTS模式,还有这个模式模式了。这个我就不再看这个文字了,我直接看这个图,给大家解释就行。
非常简单来,我们先看这个RXRX我们听名字就知道,一定是接收模式,对吧?哎,好,接收模式需要从哪来呢?是不是从待机模式就可以切换到所谓的接收模式啊,对吧?
怎么切的?你看一下啊,首先第一个CE得等于一,大家还记得CE吧,使能演讲,这个必须得使能,对不对?好,那完了之后,这儿还有一个什么东西,什么prayMRX显然这应该是寄存器里边的是不是某一位啊,对不对?OK好,你把这一位之一RX嘛RX之一。好,那就进入接收模式了OK好了,那我要想进入发送模式,怎么进呢?来看一看啊,它这儿不是直接进到接发送它,还有一个啥发射空闲模式,什么叫发送共闲呢?说白了,就是你可以理解为,就是等待发送模式,等待发送模式,他等谁呢?同学是不是等那个发射的缓冲区里边有没有数据啊?大家能想明白这个事儿不啊解释一下啊。OK你看它这个转换逻辑其实很简单啊,注意观察,要想从待机模式进入发送模式。首先你得先将谁先将这两个东西呃,给它搞定CE肯定也得等于一对吧?但是这个标志位RX哎,这个标志位是不是就是这个标模位,对吧?说白了啊,这个标志位你可以怎么解读呢?就是是否进入接收模式等于一是不是就进入接收模式等于零,是不就就发送模式啊,对吧?OK好,那完了之后需要注意的就是我进入到发送模式之后呢,我不是说立即就会真的进入到这个发送的模式,它得看什么呢?它还会看你的这个发送的缓冲区里边有没有数据,其实想想也是这么回事儿,我要是里边没数据的话,我在那儿我那个发射模块,我工作有意义吗?
同学是没意义啊,对吧?哎,他会判断这里边有没有数据,你没有数据的话,那我就等等,就进入所谓的发射空闲模式。好,那什么时候就真的进入发送模式呢?好,这里边有数据了,我是不是就进入发送模式啊,就是这么个逻辑啊,就这么个逻辑啊?同学好了,这就是它的这样几个状态态机啊?好了,其实它为什么要设计这么复杂啊?它不是为了就是增加难度,它说白了就是为了实现低功耗模式,对对吧?哎,好了,同学这一点大家要注意一下就行了。哎,了了,这就是它五五工作模式式,我简简单了解一下就行了。那将来我再去使使它的时候候,我发数据据和接收模式,我们肯定直接就是进入到呃RXmode以及这个TSmode了,对吧?哎,这个大家注意就行了。行了,这是关于它的工作模式的一个介绍。那这一个时间长了,我我先说一下,后边两位还得看啥,你课下,你可以自己看看啊,我们后边还需要了解什么东西呢?呃,什么东西东西我们需要再了解如下,这三张这三张分别是啥啊?了解首先第一个数据包处理协议。哎,其实里边我们重点要了解的就是啥,就是他发送的那个数据包的格式。因为因为一个协议,一个协议是不是肯定是说白了发送方接收方需要约定好一个数据的格式啊,对吧?这不就是协议嘛,我们需要去了解一下人的这个协议,它的这个结构是什么样的?哎,OK好,这是这一张需要了解的内容。好,那第二下一张是什么呢?哎,咱们需要去了解一下它的这个SPI的数据与控制接口。说白了,就是我要想通过SBI的数据,我怎我我需要发什么样的命令,对吧?我要读数据,我需要发什么样的命令,是不是咱们得通过这一张去了解啊,对吧?其实跟咱们使用密切相关的啊,其实就是谁,是不是这是最密切的呀?就是这是一个啊。然后再有呢,就是咱们需要去了解一下,它内部都有哪些寄存器,就这些把这些看完了这个芯片咱就也咱就能用了。
其实下边好像也就没啥了,对不对啊,基本上就是这个文档,咱们需要差不多通读一遍吧。哎,行,就这些,我把视频。
04-无人机-飞控项目-通信任务-SI24R1-通讯协议
cpp
复制代码
呃,来吧各位,那我们接下来呢要学习的内容就是FI二四二幺。呃,咱们当前的这款芯片的这个传输协议了啊,也就是它那个所谓的是不是ARQ协议啊,对吧?哎,呃,我们前面大致了解了一下这个ARQ它的工作机制是不是说白了就是发送方给接收方发数据。发完之后呢,我要等我要等一个什么东西,等一ACCK对吧?当然他它不会无限限等下去啊,他它肯定会有一个超时的时间,对吧?超出时间,如果还没等到,那它就会怎么着重发。哎,就这么一个意思啊。OK好了,那接下来我们来聊一聊它的细节啊。呃,首先这提到了说FI二四二幺基于包通讯啊,什么叫包通信呢?就是它会把你要发送的数据封装成一个它规定的这种ARQ包。哎,这是它那个包的格式啊,一会儿我们了解一下。完了之后呢,它是一个包一个包的发的啊,然后我重发数据的时候,我最小的重发单位是什么呢?就是一个包,这个包发错了,我就把整个包重新发一下,就这个意思啊。
好了,然后支持平等式ARQ协议,这儿提到了一个停等式啊,停等,其实很好理解。什么叫平等式啊?就是我发先发一个包,这个包发过去之后呢,我就直接停下来,我就等着等什么等ACK嘛,这不就是停等式嘛,对吧?哎,停下来等着ACK就这意思啊。好,收到ACK之后,我是不是再发下一个包啊,对吧?就这意思,这就是停等式ARQ协议啊,简单了解一下就可以了啊。
好了,那完了之后呢,我们往下进行各位,其实它这儿呢这个ACK是可选的。你看到没有?他说你可以选择有ACK,也可以选择呃,不等这个ACK能理解这个事儿吧。同学那显然等ACK是不是它的这个速度要慢。但是呢我这个数据的可靠性要高啊,对吧?那我要不等ACK呢,那显然就是传输的速度快,但是可靠性比我也不知道到底有没有传成功能理解这个事儿吧,就是它容易丢包啊,就是你要是noACK的话啊。好了,那接来再往下走,还有一些需要了解。他说ARQ这个协议呢它支持什么呢?一到三十二个字节的动态数据长度。啥意思?就是我通过这个咱们这个芯片往外发数据的时候呢,我可以发送变长数据,发送变长数据。哎,你这个长度呢可以是一到三十二个字节,你可以随意的去选择,能理解这个事吧。同学。但是有一个要求,你要是采用这种所谓的动态,呃,变长数据啊变长数据你得怎么着呢?你得把数据的长度给它放在哪儿,放在数据包里。其实这个东西跟咱们自己写函数是一个道理。你要是想比如说呃操作这个变长数据或者是怎么着呢?你是不是除了要把这个数组给他,你还要把长度给他呀,对吧?这样一来,人家处理方才知道我到底应该接收多少数据嘛?对吧这也是一样的道理,你要是发送变长数据,你得把那个长度告诉人家,哎,当然你也可以选择发送什么,是不是定长数据啊,对吧?那定长数据你这个长度需要在寄存器里边指令发送方接收方都要指定这个长度。那这样一来是不是人家接收的时候,他才能知道我到底应该收多少啊,对吧?就这个意思啊。好,那这就是他的一个ARQ的一个基本的呃流程啊。好了,那完了之后我们往下走。呃,还有一点,他说这个ARQ的这个呃处理单元呢,它会怎么着呢?会自动的完成解包打包自动回复ACK等等自动通话。这个所有的操作是不是全是自动的对吧?哎,这个咱们了解一下就行。然后还有一个东西,呃,这个我们用不到啊,但是咱看一看啥意思啊,他说这个处理单元呢,内部有六个通信管道,然后呢可以直接支持一比六星型网络,这个是什么意思呢?同学给大家解释一下啊,它是这么个意思。呃,哎我记得后边有个图来着啊,算了,我给大家画一下啊,呃什么叫一比六星星网络呢?他是提到了说假如说这是我的一个芯片,这是我的接收方啊,同学接收方,它一共有六个管道。ok哎,我这个画的这是几个了,这这就六个了,对吧?呃,我稍微画好看一点啊,画的尽量的像一个星星。哎,OK好,这是不是它的六个管道啊?同学它支持一v六,然后呢星型网络什么意思呢?这是我的接收方啊。好,他可以同时去接收六个发送方给他发来的数据啊OK好,那当然呢你这个发送方在给这个接收方发送数据的时候呢,你得指定你要发送给他的哪个管道啊?他这个管道是可以配置地址的,每一个管道都可以单独的配置一个地址,大家能理解这个事吧。同学哎,好了,完了之后呢,你的发送方再给他发数据的时候呢,你需要指定发送给哪一个管道啊,他发给他他发给他,他发给他他发给他。
好,这就是一个所谓的是不是一比六的这样的一个新型网络呀,对学就这个意思,那是这样的啊,大家理解一下能能理解吧。哎,好了,那接来我们往下进行各位同学这个当然我们这儿用不到,我们其实就是一v一吧,对不对?咱们遥控呃,还有我这个无人机一v一嘛,对吧?哎,好了,那接下来往下走,下边呢我们就可以来了解一下,就是他这个ARQ协议里边的这个包的格式了。ARRQ的for的格式看起来还挺复杂的,有那么多东西,对吧?呃,但实际上我们需要关注的,只有这咱们需要重点关注的,只有这儿啊,其他就是了解一下就行。首先我们看第一个前导码,r啥叫前导码呢?看它的解释前代码字段呢,主要用于接收数据的同步。
接收数据的同步。也就是说你把这个数据包发给谁,发给咱们的那个接收端之后,对吧?它会识别到这个前导码,其识别到前导码之后呢,我这个接收方就开始逐步的解析整个包的数据去了。你可以理解为这就是一个啥咱们常见的通讯协议,它前面都会有一个什么东西,是不是起始标识啊,对吧?你像串口是不是有一个起始位,那iphonec是不是又有一个起始信号能理解是吧?就是类似于那个东西啊OK用来同步这个接收数据的啊,那这个东西也说了,你发射的时候,芯片自动附上接收的时候,芯片自动去掉,对,用户根本就不可见。所以咱们是不是都不用管它呀,对吧?哎,好了,那接来往下进行看。第二一个呃,这个啊,这当然这个地址咱们也很关键,我们也得重点关注一下东西啊,这个东西是啥呢?指的是是不是这叫啥地址,字段为是不是接收数据放在地址啊,对吧?哎,OK好了,那刚才提到了,说咱们当前的这个芯片是不是支持一v六啊,对吧?完了之后,一v六是不是每一个芯片,它接收的话都有六个信道,可以用来接收数据啊,对吧?啊,好了,那完了之后,你的你这个地址其实应该说白了,说的严谨一点啊,并不是说是接收方地址,而是什么呢?而是接收方的里边的,是不是那个具体的通道的那个地址啊,它六个通道嘛,对吧?你到底给谁发,你是不是得告诉人家,对吧?
一般情况下啊,你像我们这种一v一的情况下,我就发给通道,姐,我就发给通道零就行了,能理解这个事儿吧。同学哎,好了,这个注意啊。ok好,那继续往下进行,这后边又提到了后边这句话说的就是接收方了啊,就说只有当这个地址与接收方芯片的地址寄存器里边的地址相同的时候,那是不是接收方才会接收啊,对吧?
什么意思啊?比如说我这儿有一个接收方,对不对?因为你是无线电信号嘛,对吧?那空气中是不是随便的去进行传播呀?那它不是说我直接就是说通过线连接的,所以说这个接收方啊,他可能会经常接收到,是不是呃这个信号啊,对吧?但是哪个信号他是发给他的呢?人家是不是有地址啊,对吧?我看地址能理解这事吧,同学地址跟我相同,我是不是才会怎么着,我是不是才会接收啊,对吧?哎,是这样的,这这有点类似,于是不是有点类似于iphonec里边的,是不是那个从机地址啊,对吧?我从机我是不是收到得跟我这个地址一样,我是不是才处理这个呃这个数据啊,对吧?
啊,一个一个意思啊OK好,继续往下就行。然后这个地址的长度呢,咱们是可以配的同学地址长度呢,我们可以通过配置寄存器配置AW呃呃这这是一个寄存器AW是啥意思?a就是addressw就是宽度嘛,vice对吧?说白了就是地址长度,就这个意思啊。好了,那完了之后呢,你这个地址长度可以选择啊,你可以仨字节四个字节,五个字节都行啊,这个无所谓啊,就是咱知道怎么着就就行。
然后往下走,需注意意的是你这个地址的最高字节,你不能设置为这几个值,他说可能会导致么呀,接受失败啊,我我的理解啊,当是他也没说说为什么接受失败啊,我的理解应该是啥呢?你看同学,他这个地址跟前导码是不是挨着呢?同学最高次节是不是跟前导码挨着呢?对对吧?也就是说有可能这几个东西会跟它的前导码是不是产生这个干扰啊,对吧?因为无电信号无电无线电信号之间,它可能是不是可能会出现前后的一个关系啊,对吧?就可能会导致前导码受影响,我的理解是这样的啊。好了,呃,然后前导码受影响了,它是不是用来同步接收数据的呀,对吧?你太有影响了,那我我是不是后边就接收失败了呀,对吧?哎,你可以这么去理解这个事儿,总之按人要求就行。一会儿咱们改地址的时候,这个信号不不不要要不要不要忽略略,一定要注意一下这个事儿不要瞎写。
哎,好,呃,然后需要给大家说明的一点,就是你想一想同学,我们现在办教室里咱们有这么多同学,对吧?然后呢,每个人都有一套这个东西,那你到时候地址是不是咱们不能重啊,对吧?尽量尽量不要重啊,这里边不要重的东西有啥呢?首先咱们最开始那个那个信道是不是有一百二十六信道啊,对吧?而信道不要重,然后这块是不是咱这个地址尽量也不要重啊,对吧?哎,OK好,这个大家注注意就行了啊。但是严格意义上来讲,同学我信道要是不一样的话,我地址相同,其实也没事吧,同学理论上上也没事啊,但是保险起见是不是咱们尽量都让它不一样啊,对吧?哎,OK这一点大家注意一下就行了啊。好,接着往下走,下边咱们要干啥的,下边咱们了解解是第三部部分做做包控制字啊,这是用来做控制的啊。这个控制呢一共有九位啊,注意是九位,不是九个字节,这九位都是啥意思呢?首先第一个数据包长度,大家还记得吧,我们这个呃他这个协议是不是支持什么来着,是不是支持传输变长的和定长的数据啊,对吧?
如果传变长,你是不是得把你这个数据的长度给人家放在这个包里啊,对吧?就放在这几位上,哎,一共是六位,为什么是六位呢?为什么六位呢?同学因为我一共是一一到是不是三十二个字节啊,对吧?哎,按理说一到三十二个字节,我是不是五位就够了呀?因为二的五次方是不是就等于呃,三十二了呀,对吧?那为什么是六位呢?他这还能传空包,你看到没有?同学,如果这个六位全是零表示的是空包,什么叫空包呢?空包就是你后边这个实际的数据是没有的,啥也没有啊,它它有一个这个东西啊,所以说五位是不就不够用了呀,对吧?所以他就搞了一个六位啊,这个大家注意一下就行了。好,那接下来往下走,看这个PID这个PIDAA是个啥呢?注意它不是咱们那个做PID控制那个PID啊,这是干啥用的呢?我们来看一下哈,他说PID这个字段适用于告知接收端。这个包是一个新包还是一个重发的包,可以防止接收端重复接收一个包,就这意思。哎,好,他的工作机制是什么样的呢?我给大家说一下,其实非常的简单来大家试想一个这样的场景啊,比如说这是我的发送方,对吧?
这个是我的接收方,大家大家不要走神啊,就是这个东西确实有点枯燥啊。这个但是咱得了解啊,对,不要不然然话一一儿咱们用明白这个东西啊来不要走神。好,那他再明确一下PID是不是用说白了是用来干啥的,用来防止接收方是不是重复接收同一个包啊,对吧?哎,我们来看他怎么重重复发生的呃,重重复接收的。我们先来看一下什么情况下会重复接收。举个例子,现在发送方给接收方,我发了一个包过来了。过来之后,这个他明明接收到了,理论上接收到之后,他要干啥?他是不是要回复一个ACK啊,对吧?但大家想想啊,你说有没有可能我收到这个数据之后,我的ACK发出去了,但是他没收到呢,有有没有这种可能性,有这种可能性,对吧?比如说我这个信号不知道怎么收到,干扰了等等等。总之他没收到,但是呢人家接收方是不是已经实实在在收到这个数据包了呀,对吧?OK这个时候这个就会出现一个什么问题?那t是不是没收到?ACK这就会认为那边没收到啊,没收到,我是不是就会再重复的发送这一个包。哎,那这样一来是不是就会可能会出现重复接收这个事儿啊,对吧?如果不做任何干扰,那你接收方这边只要收到包,我就接收,只要收到包,我就接收,那肯定会重复的对吧?它是有一个这样的潜在风险的这就是这种你ARQ它是一定存在这样的一个问题的,对不对?那所以它是怎样避免这个就是重复接收呢?很简单,他给这个每一个包啊都分配一个ID都分配一个ID这个ID呢是可以自动累加的啊。ok好,我每发一个新包,我这个ID就加一,也就是说同一个班,我的ID是什么样的同学是相同的。呃,比如说我这个是我发的第一个包发的是零,对不对?好,那这边ACK没收到。好,我再重发重发的话,我这个还是啥?我这是不是还是零啊,对吧?你这个接收端这边你是不是就发现了?哎,我上次接收的是零,我这回收到还是零,那是不是说明你这俩是一个班啊,对吧?
OK一个班,那这回我还接收吗?我就不不实际的去接收了,我直接怎么着呢?我直接就给你返了ACK告诉你,我收到了。哎,那这时候他是不是就可以继续发下一个了呀,对吧?
下一个人再发,是不是这个就是一了呀,对吧,就这么个意思啊?好了,那当然这种机制呢能够就是实现就是这个一定程度上的,避免这种就是重复接收的问题,但是他不能完全杜绝,为啥呢?你看就是他这个位数是不是只有两位,只有两位的话,我这个只有多少同学,是不是嗯只有零一二三,是不是得有这个东西啊,对吧?啊,ok好了,那也就说这种情况下,它有可能会出现一个什么样的问题呢?比如说我连续多个包我都丢了,是不是就可能会出现一一些,这个就是当然可能不会重复,但是可能出现丢的问题,对吧?啊,总之啊就是这个大家简单的了解一下就行啊,就是说这边呢他是只有只有两位零一零一二三四,它是轮轮着来的对吧?我第一个零啊,一二三后边是不是又来一个零啊,对不对?那这个什么时候会出问题呢?呃,我就举个简单的例子吧,比如说呃我想想啊,哎其实也还好,也还算是比较安全,对吧?我刚才可能想错了,咱们咱们咱们分析啊,比如说我最开始发的是零,对不对?你要是发的是零的话,我想的是啥呢?如果说他这一轮,比如说一二三都没发过去,然后又来了一个零,但是他明他俩明明不是同一个包,那我这边是不是会认为它是一个零啊,那是不是可能会有这种这种问题出现呀,对吧?那后来想来好像也不是很容易出现这种情况啊,为啥呢?因为我这个零没发过去,我我我我是不是不会发译啊,对吧吧,他是不是零会重传呀,对吧?对吧?其实呃出现刚才那种情况的概率其实很低啊。ok呃,除非什么时候呢?就是他有一个有一个问题,就是他他他可能会有一个重试的最大次数,他不可能一直无限的重试,对吧?比如说我重试十次之后,我就不重试了,那可可能可能就会出现这种,但是概率极低啊,所以说这个情况下就不考虑了啊。好,所以这个还是比较安全的啊,理解下这个事就行。再接着往下的同学下边这个是啥呢?是这个noACK这个就简单了。这个其实就是告诉我这个接收方,我这边边我到底要不要ACK对吧?前面不是讲过嘛,就是咱们可以选择有ACK选择没有也可以选择,不要ACKK嘛,对吧?就是通过它啊,那根据它的命名,我们应该能看出来啊,如果它应该是制一质疑,就是noACK吧。置零是不是?就是有ACK啊,对吧?所以想要ACK这个得质零才行。哎,好了,这就是它所谓的包控制字,就是这部分内容。好,最后就是这个负载了这个简单了吧,同学哎OK好,需要注意的就是它的长度是零到三十二,对吧?
你可以发空包啊。好了,接着往下走,最后一个三十c这个是用来做啥的呀,做校验的对吧?OK注意同学这个CRC这个值呃这个CRC它的计算原理是啥呢?是不是针对于整个包,我算出来一个数放在这儿啊,对吧?然后接收方呢敲到数据之后,是不是再针对整个包算一下,然后呢,再怎么着,是不是在跟这个原来的数做一下比较啊,对吧?相同就说明没问题,对不对?好,这一系列的计算比较这些逻辑都不用我来做,都是这个芯片自动完成的。
哎,是这样的,同学说白了同学咱们将来你要想去用这个芯片发数据,你只需要重点关注啥就行了。我们可能需要去配备这个地址,然后呢数据负载,这是不是需要我们关注的呀?你像其他这些东西是不是咱们都不用管啊,基本上就这么个思路啊。同学好了,那这个完了之后往下走包的格式,我就给大家介绍完了。
05-无人机-飞控项目-通信任务-SI24R1-ACK通信流程
cpp
复制代码
呃,好了,各位啊,那接下来我们进入下边一个环节,下边一个环节呢,就是ARQ的通信模式。通信模式。其实我我们是不是前面也简单了解了一点儿来,对吧?然后这块可能有一些细节需要咱们扣一扣,那咱们就扣一扣啊,咱们扣一扣。好了,先来看一下它对整个通信模式的一个基本介绍吧。我们看看目录呢呃这个目录结构什么样的?你看前面是不是讲的是这个包的格式啊,对吧?然后讲的是这个下边其实你说的是通信模式不太合适,说的是通信的流程吧,对吧?它呃通信模式有这么两种啊AC有ACK的这ACK的对吧?动态长度的静态长度的呃,就是变长和和这个配漏ad,是不是就是那个数据负载啊,对吧?呃,配load的这个动长呃,动态就是那个什么意思?变长的这个就是呃就是定长的对吧?
其实咱们都是咱们理解的概念啊。呃,然后呢,我们现在呢呃先看一下它这个概述,然后一会咱们重点关注一下这个ACK模式就行了。你像这个模式,咱们是不用管呀,对吧?像这个呢其实就是配个寄存器的事也比较简单,这个是多信道通信,就是那个EV六呃动多通道,通信啊,多通道呃,一v六,那那个咱们也是简单了解一下。我们先看先看一下这块啊,先看一下这个概述啊,看这他说通信的时候是不是必须得进入发送和接收模式,还记得这个工作模式一共有五个,对吧?前面有低功耗模式啊,然后呃这俩发送和接收模式。我们先看这个tts说了,在TTS式式边呢发发送,将将自动将将导导码址址包控制字负载数据CCC包通。通过这个频模块块,就是我们前面讲的那个天线,对不对?哎,将信号发出去。呃,对不对?将这个信号调制成天线调制,然后通过天线发射这个大家好说的看接收方接收方这边呢呃他在RS模式下边会怎么着,会怎么着,会在接收到的解条信号中不断的侦测地址,哎,侦测有效地址,对吧?什么叫做有效地址?同学是不是只要那个包里边的那个地址和他自己的地址一样就行了,对吧?那其实一个接收方他可以有几个地址东西?按照我们刚才的描述,一个接收方是不是有六个通道啊,对吧?它其实可以有六个地址了,它有六个地址了OK好了,那只要跟任意一个地址相同,是不是?他就会认为这是发给他的呀,对吧?哎,他就会去处理这个数据了。好了,接着往下走,一旦侦测到地址与接收地址相同,然后就会开始接收数据。
哎,好,如果接收到的数据有效,那就会将负载数据负载数据是不是就是咱们那个真实的数据啊,对吧?
它会自动的将数据放到哪的同学好到接收的缓存里边,这个跟我们之前的描述是不是一样的呀,对不对?
然后产生一个中断,是不是通知MCU对吧?这跟我们描述也是一样的啊,然后MCU可以通过SPI接口访问RX非fo计算器进行数据读取。
哎,你看这个是不是闭环的同学,哎,咱们今前讲的一样的啊。好了,接下来我们往下走,这是一个一个整体的一个工作流程。接下来我们重点关注一下它的ACK模式应该如何使用?因为咱们一会儿用的是不是就是ACK模式啊,对吧?来看一看怎么用啊。好,来读一下这段话,他说了,我们要想发送数据。好,你需要向这个芯片发送一个这个命令,你看这个命令叫做什么?WTXpayload是不是就是发送负载呀,对吧?你需要呃这个命令需要发给人数,发给他一芯片啊,对吧?咱们怎么发?是不是通过SPI接口发给他呀,对不对?完了之后发给他之后呢,就可以通过这个命令向哪儿向发送端的这个发送缓区写写数据好,是这个命令向发送缓冲区写数据好,是不是剩下的事儿,咱就不用管了。哎,同学对不对?OK好,这个时候这个芯片就会自动的打包数据,打包数据啊。好,那完了之后呢,呃打包数据的同时,它会将控制字流那个noACK给它整成什么?是不是整成负位啊,负位是不是就是零零,是不是才是有ACK的呀,对吧?我们接着分析了OK好了,那接接着往下写,这是发的流程。所以对于我们来讲,发的流程非常简单,你就是通过这个命令往非for里写数据就行了,剩下的是不是都不管了,就这么个意思嘛,对吧?好,那接着往下走,接收端,在接收到这个一帧有效的数据之后,它就会产生一个是不是RXDR就是接收成功,接收是不是成功的一个中断呀,对吧?好告咱咱们MMPUOIMCU啊。好,完了之后它会怎么着?它会自动,是不是返回一个ACK呀,对吧?哎,好了,那发送端在接收到这个ACK之后呢,就会自动之后TX非for里边的数据。哎,大家想一想,它为什么要在接收到ACK之后再清除啊,你得劝人家收到了,我是不是才能清,我要没收到,我就清了,我一会儿重发的话,我是不是没了呀,对吧?哎,这这个是不是应该是比较安全的一个操作,对吧?他应该能理解的啊,好,接着往下走,哎,然后再产生一个发射成功的终断表明此次通信成功。哎,这就是它的一个完整的发送和接收的流程,还是挺细节的啊。好了,接下来我们往下走,各位同学员这句话非常关键。这句话非常关键。来读一下,看能不能读懂啊,他说接收端在发送ACK信号时,哎,注意啊,接收端是不是得给这个发送端返回一个ACK啊,对吧?好,那你想一想,所谓的返回ACK是不是也是在发送数据啊,是在接收端在给发送端发送数据,对吧?那你只要发送数据,你是不是得声明那个接收端的地址才行。当这个事儿吧。同学好,你看看他这怎么描述的啊,这个接收端在返回ACK的时候,它会直接取接收管道的地址作为目标地址来发送ACK大家能想明白这个意思不?它表达的是什么?他表达的是什么东西?这句话的言外之意是什么?这好好你好好想想啊,这个东西这挺关键的啊,这是什么意思?嗯,大家能不能想明白呃,有耳绕啊,我给大家解释一下,它是这么一回事儿。前面咱们讲过啊,就是首先咱们接收数据的话,我是不是可以配置六个通道进行接收啊,对吧?OK好了,那比如说我们现在这是我这是我原来的接收端啊。好,比如说我用的是通道零,是不是进行接收啊,对吧?好,那前面也讲过,我发送方在给接收方发数据的时候,这是t啊。好,那理论上啊,你这边指定的地址,其实严格意义上来讲应该是什么?应该是你这个接收方是不是具体那个通道的地址啊,比如说我给这个r这边啊,它的通道零配的地址是a,然后呢,我发送端这边给谁给咱们的这个呃就是接收端啊,接收端发的时候,我我我发的就是通道零。那所以说我接收方指定的这个目标地址是不是应该就是a呀?
大家能理解这个事儿,那就会发到接收方的通道里OK好,现在说的是啥呢?是这个接收方返回ACK对不对?返回ACK的时候,他是什么需要取接收管道地址作为目标地址能理解吧。也就是说这个接收方返回ACK的时候,会直接把自己接收数据的这个管道地址,是不是?也就是我这配的这个a呀,对吧?直接把a作为什么作为目标地址往这边发能能理解吧。那有同学可能会说,你这不就是相当于发给自己了吗?呃,不会的啊,因为咱们这个无线电信号是不是往外传呀,对吧?你这个接触他自己这个天线是收不到自己发这个信号的。咱们可以这么理解这个事儿啊,同学能理解吧OK好,那既然他直接取自己的地址作为目标地址,那这就要求什么同学要求你是不是得给接发送端它的接收地址设置,为什么跟他的这个接收地址得是什么样的?你得是一样的,是不是他才能收到你这边的ACK信息啊。哎,他是这个意思,你看后边其实也说了,他说所以你你发送端注意指的是原来这个发送端啊,需要设置自己接收管道零的地址与自身发送地址相同,自身的发送地址,也就是是不是这个地址啊,对吧?哎,它得相同才行,说白了啊,就是你将来到时候设地址的时候,你是不是不管什么接收发送全设一样的就行了呀,对吧?人家是这么个意思,这儿稍微有点绕,但是两者人那个要求来啊。OK好了,那接下来我们往下进行同学。呃,下边呢还有一小段儿,咱们需要了解一下,就是这段这段话读完咱们就就o差不多就OK了。这个这个发送的这个协议啊。好了,看这儿。他说如果发送端在ARD时间内没有接收到ACK信号。这个你可以理解为是一个就是超时时间,等待ACK的一个超时时间,这个东西也是可配的啊。
OK好了,那完了之后我们往下走,在规定时间内没有收到。ACK是不是就会自动的重新发送上一点数据啊,对吧?
哎,好了,然后需要注意的一点就是当重发次数达到最大时,仍然没有接收到确认信号,那它就会怎么着发送班就会产生一个maxRT中的RT你可以理解为是什么意思?
retry对吧?retry是不是就重试的意思啊,对吧?啊,已经达到了最大的重试次数,重试次数,这个东西也是可以配置了啊。
OK好了,那完了之后呃,说白了就是正常情况下,我这个发送端啊,我会等待ACK对吧?等不到我就重发,等不到我就重发,最多重试多少次呢?最多重试这么多次就会发生一个中断啊,就是这么一回事啊。OK好了,那接下来往下进行。这还有一个呃说明说啥呢?说MASRTT这个中断。因为中断情况下是不是会有中断标志位啊,同学OK这个中断标志位不清除,你是没法发送下一个数据包的。啥意思呢?这个其实也是出于一个安全考虑吧。你这个标志位没清除,那就意味着我的单片机是不是还没有去处理它的这个是不是就是发送失败的这个事儿啊,对吧?所以我就不会给你发下一个。只有你当你把我当前这个包发送失败的这个事件处理完了之后,我才让你发下一个,这是他这个逻辑啊。
好,那我怎么去清除这个标志位呢?通过直接写写寄存器来清除,到时候咱们可以看到那个寄存器啊OK行,那这就是咱们这儿所呃提到的这样的一个机制啊,就是大家需要注意它是有一个最大的重试次数了。行,其他东西咱们就不用看了。哎,好了啊,那下边呢还有一张图,这个图看一看能看明白不?这是一个带ACK的一个完整的通信流程啊,简单了解一下啊。好,我们要想发送数据,首先你发送端得怎么着,是不是得发送得往那个就是非复里边写数据啊,对吧?啊,OK好,我发送配漏的。好,那发完了之后呢,这边他就会怎么着,是不是就会在这儿去等待这个ACK了呀。对吧?OK好了,那接收方是不是会接收这个数据?他在接收到这个数据之后,怎么着会先产生一个,是不是RXDR终断呀,对吧?RSCR是不是就是说明我接收成功呀,对吧?先产生中断,然后呢,再回复ACK好了,那接收方收到ACK之后,是不是会产生一个TXDS,也就是发送成功终断呀?对吧?这是它的一个完整的呃通信流程啊,这个咱们看一看就行啊。好了,那至此呢这个ACK的通信模式就给大家介绍完毕了啊。行,我把这个视频。
06-无人机-飞控项目-通信任务-SI24R1-多通道通信
cpp
复制代码
呃,好了,各位同学这就是他的一个所谓的这这就叫什么?这是不是就是一比六星星网络呀,对吧?哎,你看人家这个怎么配的啊,你看能不能看明白,这是接收端,这是它的六个发送端,重点看地址,理解那个地址,你得理解那地址啊。
好了,首先你看接收端接收端,我前面讲它是不是有六个接收通道啊,对吧?六个通道六个通道的话,那呃,是不是就有p零到p五,对吧?所以六个通道是不是有六个不同的地址,哎,能理解这个事吧。同学好,然后呢,我的发送端在给这个接收端发数据的时候,其实严格意义上来讲这个TS是不是就是你的发送地址啊,对吧?TSCD点OK严格意义上来讲,你这个指定的并不是你的接收端的地址,接收端没有地址,它它的通道是有地址的对吧?哎,你指定的应该是啥呢?是通道的地址,你看它指定的是不是通道零的地址,它指定的是不是通道一的地址啊,对吧?指定的是你要发到哪个通道啊,这一点一定要注意。好,那接下来往下进行。为了能够让发送端接收到接收端给他们返回的ACK能理解吧。同学OK好,你看发送端他是不是也得有自己的接收通道啊,你想啊你ACK你不行,是反过来了吗?现在他现是是发送端了,这个是不是接收端了,接收端,我是不是得得有自己的接收通道的地址啊,对吧?你看人家这个接收通道注意,因为我只需要接收他一个人,所以他是不是只用了通道零啊,对吧?你看这个地址是什么地址,跟他之前的目标发送地址是不是一样的呀?为什么是这样设置呢?因为人家接收端这边他是这么设置的,我给你返ACK我直接取我接收通道的地址,是不是作为我的目标地址啊,对吧?那所以你这个发送端的,你的接收通道零的地址是不是就得跟这个地址是一样的呀,对吧?总之乱七发糟的,最终总结一下,就是你所有的地址都配一样的呀,对吧?因为人够正常工作了,现在大家能理解他这个地址的一个工作逻辑了吧。哎,好搞清楚啊。好了。行,那就是这些啊呃这个就不多说了,我把视频。
07-无人机-飞控项目-通信任务-SI24R1-SPI接口&寄存器说明
cpp
复制代码
哎,好了,各位,那下来我们往下进行来先读一下这段话,这儿提到了这个芯片采用标准的四线SPI接口,对吧?实测的最高的读写速度是大于十兆每秒的。呃,大家知道吧?就是我们在呃三二里边去配。那SPI的时候是需要给它设置一个波特率的吧,嗯,对吧?那三二里边要求这个SPI的波特率不能超过多少来着,不能答于多少来着,还记得吗?不能十八,对吧?不能十十八,对,不超过十八之后,是是不是会提示你那儿那个就是分辨器有问题啊,对吧?要让你去改的啊。OK好了。呃,但是我们其实也不能配到最高的十八啊。
因为人家这边呢他测的是能大于十兆每秒,但是最最大是多少,他也没说对不对?所以我们保险起见的话呢,我们配置在多少以下呃,是比较合适的呢?十兆以下,咱们十兆以下是不是肯定是安全的呀,对吧?
所以一会儿咱们配那个波特率的时候要注意一下同学,哎,这是需要大家注意的。好了,那接下来我们往下进行那外部微控制器,我们可以通过SPI接口。对这个芯片进行配置,包括读写寄存器读写非否读写寄存器状态,清除中断等等等。是不是都通过这个SPI接口去做呀,对吧?哎,就这样的好,接下来呢我们来了解了解它的这个SPI这块具体怎么进行通信啊,来吧。各位同学来看一看,这上面呢是对这个SPI的一个基本介绍,包括这个偏远信号,对吧?这些东西是不是咱们都很了解呀,标准的呃,这个CS这个需要怎么着?由高到低,是不是这个接口才开始工作呀,对吧?哎,这个咱就不多说了啊,然后呢这句话很关键。他说,每一次SPI操作MISO输出的第一个字节均为状态寄存器的值。这个是啥意思呢?首先明确一下,哎,这个芯片它有一个寄存器叫做状态寄存器啊,这里边保存了这个芯片的各种各样的一个状态啊,就是一个状态,标志位能理解这块吧。同学好了,那大家都知道这个SPI通信,我在通讯的时候,我是什么样的更换我,我是我是我是全双工的,对不对啊,它是交换进行的,对不对?也就是说你每次进行SPI进行通信的时候,只要我们这个单片机给这个SPI发送了一个字节。好,那你发送的第一个字节,它那边就会给你交换过来一个什么呢?交换过来一个是不是就是咱那个这个状态寄存器的一个值啊,对吧?啊,一会儿咱们看的那个通信的时序就能看出来啊,这个需要简单了解一下,别的咱就不看了啊。好,接下来往下走,看一看咱们这个基本的通信的格式是什么样的啊?注意通信的格式是这样的,每次和SPI进行通信,我都得给他发送这样的数据。什么数据呢?首先是一个commandword打头,后边会紧跟着什么database,哎,每次通讯都是这样的一个格式啊。首先发一个命令,能理解这个事儿吧。完事紧跟着是你要发送,或者是要读取的数据,是这么一个逻辑啊。好,那可能光这么听,有点抽象啊,我们看一个具体的例子。比如说我们看第一个命令,这个命令叫做什么呢?叫做rregister,明显是什么操作读寄存呃readreadread读寄存器吧,对吧?
就是读这个芯片的寄存器啊。好了,那完了之后,你看它的这个可on的word是什么渴望的word是不是就是一个呃零零零后边跟上几个a对吧?这个a是什么呢?大家能够去想明白,哎,表示是不是寄存器的地址啊,是不是你得告诉人家,你要读哪个寄存器啊,对吧?哎,OK好了,那完了之后,前面这个零零零是啥意思呢?就是相当于是写死的固定的,注意,这是一个字节啊,一个字节八位嘛,对吧?哎OK这是固定的。好,只要我们那个芯片,它识别到了零零零就证明什么?是不是你这个单片机要读它的寄存器了呀,对吧?哎,就是说白了做一个命令的一个标识啊。好了,那后边跟跟上的是啥?你要读的那个寄存器的地址好,然后继续往下进行同学,再紧跟着后边这个信号线上传输的,是不是就是那个你读的什么东西?那个寄存器的具体的是不是直了呀?同学哎,就这么个意思啊OK好了,那这是数据字节嘛,对吧?OK好,那继续往下进行需要注意的一点,就是它是先把这个数据字节的什么?是不是第一字节给你发过来呀,对吧?哎,OK这个注意好,接来往下走。第二一个,咱们再看个例子啊,这个是啥写寄存器嘛,这是不是就是零零一跟零零零是不是有区别啊,对吧?然后后边紧跟的就是啥,哎,你那个寄存器的地址啊。ok好,那完了之后呢,那后边紧跟的是啥,你这不要写吗?对吧?嗯,你写你是不是得告诉你写什么数据啊,对吧?后边紧单的就是你要写的那个具体数据啊,就这个意思。哎,好,那现在大家应该已经对他这个SPI通信的一个基本流程有所了解了,对吧?哎,注意啊,先发一个命令,然后后边跟的是数据,当然是数据,可能是他发给你的,也可能就是你发给他的啊,好得看你是读还是写啊OK好,然后大家看一下这个位置,这个命令大家还熟悉吧,这个质量这个质量是干什么来着,是不是就是往那个发送的缓冲距里写数据啊,往发送的那个非里是不是写数据?说白了,你将来要想发送数据,你是不是得调这个命令后边跟上,你要发送的数据没多少同学,你看这个数据的长度是多少到多少?一到三十二个字节嘛,咱们是不是一个数据包里边的数据长度就是一到三十二个字节。哎,就这意思嘛。好,那同理这个是啥,应该就知道了,这是我我是读数据的命令吧,对吧?读数据的话呢,我是不是应该发这个指令,然后后边就接收他给咱们拿过来的数据就行了呀,对吧?不就这么个思路嘛,非常的简单啊。好了,其他的我就不再一个一个带大家去看了啊。呃,后边呢这个有很多都是封装好的,我们直接用就行。咱们了解它的这个工作机制就行。然后咱们看一下它这个时序啊,这是forsPI的这个时序,这个时序应该很好很好了解,这是写,这是读。咱们先看写啊,前面给大家讲过,写的话,你注意啊,这是MOSI这是不是masteroutputslaveinput呀,对不对?OK所以说这个是向谁是单单儿机向谁向这个芯片,是不是发数据啊,对吧?OK好,注意观察,你看可能能字有点小调,大一点。你看前边是什么?第一个字节是不是c什么呀?c就是啥意思command嘛,是不是不管哪个东西,我都是先得发一个什么命令,再再再跟数据啊,对吧?哎,所以这是command的八个位啊OK好,后边紧跟的就是啥了,是不是就是了呀,对吧?哎,datdatata啊,数据吧OK好,然后注意观察同学,你看在你发第一个字节的时候,这个是不是就是这个芯片,它会给你给你怎么着给你交换过来,一个是不是s啊?对吧,这个s是啥?大家应该能想到吧,是不是status那个所谓的状态寄存器啊,对吧?哎,他会给你交换过来一个这样的东西,你这个可以接收,你需要的话,就接收不需要就不接收了啊。好,这个完了之后,我们往下的同学再看这个读操作读也是一样的。你是不是也是先给他发一个命令,然后就是接收是不是他给你发的数据字节了呀,对不对?那同样的道理同学,你发第一个字节的时候,他会给你交换过来一个什么东西,是不是状态计行器的值啊,对吧?就这个意思。哎,好了,同学这就是他的一个SPI的操作逻辑,整体来看是不是不不复担啊。同学哎,好了,这个就过了啊。同学这个过了之后,我们再看最后一个就是寄存器的列表的这个东西咱不用看啊,就是我们能看懂这个结构就行。将来咱们需要哪个,咱查哪个就可以了啊,同学注意观察啊,呃我稍微缩小点,这个怎么看啊?注意这是一个寄存器,这是一个寄存器啊,它两个寄存器之间是有一个空格的。你看这个是不是空格啊,这是不是有空格两个寄存器之间,它是有一个空格的啊,这个应该能看明白,对吧?哎,好了,这是一个寄存器。然后呢,我们看一这个寄存器啥意思啊?这个寄存器首先呃看这address这个是不是我们当前这个寄存器的地址,零零,这是它的地址啊。好,完了之后呢,这是不是它寄存器里边的零到七,一共是八个位呀,对吧?哎,OK也能看明白啊,然后每一位的介绍啊,然后它的说明都有啊。OK好,那接下来就这样,我们找一找,就是咱那个一直说那个状态寄存器,咱们看能不能找着啊,来往下翻往下翻。哎,你看这儿是不是就有一个所谓的status啊,这是不是那个状态寄存器啊,对吧?好,那这儿提到的说呃,我们状态寄存器,然后呢,你每次使用SPI进行操作的时候,它都会是不是把这个东西作为第一个字节给你反复出来呀,对吧?哎,人家也说了啊,这就是咱这个所谓的状态寄存器里边呢,就是就是一些状态标志位啊啊,一些中断的标志位其实都会在这里面去置位的啊。OK你看哎这个大家看到了吧,这是这什么来着?最大重罚次数吧,是不是这个完了之后会有出现一个中断呀,对吧?这就是那个最大重罚次数的标志位,这个是什么?这是发送完成的标志位吧TSBS对吧?这个是什么?这个是接收完成的标志位吧,对不对?就这个意思啊。好了,那这个大家简单了解一下就行啊,呃我们就不用一个一个去看了,它寄存器还不少还挺多的。哎,好了,那这样一来的话呢,整个这个芯片的使用逻辑就给大家介绍完了,停一下时。
08-无人机-飞控项目-通信任务-SI24R1-驱动移植-上
cpp
复制代码
哎,好了,各位同学,那接下来呢我们就开始去做一下这个所谓的呃移植操作啊。呃首先呢先带着大家去找一下咱这个驱动在哪儿呢?我们找到无人机的这个项目上找到资料资料,呃,这边有一个二点四g对吧?然后这是不是有两个压缩包了,对吧?两个压缩包其实都差不多,我们用下边这个吧。呃,毕竟这个和我们使用的这个型号是完全一样的那然后给大家说一下,就是这个东西是从哪下载下来的啊,呃是这样,我们是在一个叫做追观察同学这儿是不是有一个这个哎,这是我之前搜的啊,叫做安信,可就是这是一个公司啊,呃它是做什么呢?其实可以看到它其实主要就是做物联网的,这个是不是无线通信的呀,对吧?啊,就是他这边呃呃一会儿就能看到它的产品中心里边呢有各种各样的无线通信产品啊,其实咱们就可以点开呃,看一眼。你看这里边有wifi,甚至有雷达,对不对等等啊,lower二点四g啊等等的,非常非常的多。那其实咱这个驱动呢,就是在哪,就就在在这下这儿,是不是有一个二点四,对,对吧?呃,完了之后呢,你往下翻下方呢就有这么多的东西,各种各样的这个模块模组啊OK。那当然下载的话呢,这个我们可以在这儿这儿是不是有一个所谓的开发资料啊,同学对吧?我们点进来稍等一下呃,有点慢啊,这个网络。好,那进来之后呢,我们一样还是找到这个二点四g的,是不是这个通讯模块啊,对吧?这是不是有一个二点四g模组系列,我们点进去啊,大家稍等你看就是这里边呢就有非常非常多的这个类型了。然后这里边是不是就有我们所使用的什么SI二四二幺,对吧?唉,这个是不是也有一个NRF二四l零幺。这个前面咱们提到过SI二四二幺,是不是就是咱们国产的,是不是仿造他做的呀,对吧?唉,好了,然后你往下翻,往下翻,下边就有各种各样的这个开发文档了啊,然后呢咱们就在这里边去找这个SI二四二幺,这是不是有一个二四开发资料了,对吧?这儿有一个SI二四二幺,就是咱们demo驱动程序嘛,对吧?把这个下载下来之后得到的就是把大家资料里发的这个了。然然后你要下这个的话话呢,到的是不不就就是这个个发对,对吧?就这样的就是大家可以把这个网站收藏一下,就是以后呃用得着的话,只要是跟无信通信相关的。其实都能在里边找到相应的这个示例程序啊。其实还挺不错的啊。好,然后大家呃要做的事儿呢,就是把这个东西给它解压一下啊。解完之后呢,我们来到这里,这就是我解压完之后的啊点进来进来之后呢,这实际上就是一个非常简单的一个小项目。这儿有个readmmereadme,就是一些使用说明,对吧?然后大家注意一下,你看他在做这个测试的时候,他用的是谁?不是咱们目前所使用的这个三二,它使用的是STC幺五等等等等,是不是STC还记得STC吧,咱之前学五幺的时候是不是就是STC的呀,对不对?
OK啊好了,那所以一会是大家会发现啊,就是它这个这个程序里边的这个个性各种各样的操作呢,其实跟咱们这个五幺的操作习惯是一样的啊,是这样的啊,它的内核应该也是五幺的内核啊。OK好了,那总之啊就是我们不能拿过来直接用啊,这个东西咱们还是得怎么着呢?还是得改一改的啊,好了,这个注意就行了。
呃,然后呢,可以看到这里边有一个useruser里边是不是就是用户代码啊,对吧?主要其实主要就是它这个慢点c啊啊,完了之后呢,还有一个SI二四二幺,这里边是不是有点h点c啊,这里是他给咱提供好的那个驱动,一会儿我们要做的就是就它这个驱动就行了啊。OK好了。那所以接下来呢我们就对这个驱动进行一个改造啊,呃来吧,我们现这个在哪儿啊?OK进啊,我们我们的这个INT这个目录下边INTinterface,对不对?呃,咱是不是得在这个下边去创建一个目录,然后把那两个文件给它放进来呀,对吧?哎,好了,我们现在新建一个文件夹,哎,跑哪儿去了?哎,怎么跳了了个文文件啊,呃二点四g我们就是二四g是不是就可以了呀,对吧?哎,OK好了,那接下来呢我们呃点进来,连来之后呢,把那俩文件给它往里一放就行啊,这conc,但是这个文件名啊,包括里边的这个函数命名什么的,可能跟我们目前的习惯不太一样,对不对?呃,大家你要是说想改一改也行,不改,其实也不影响咱们使用,能理解这个事吧。同学,我这儿改一下吧,改一下,改一下。这个看着舒服一点啊,来我们把这个给它重命名一下,这个我们其实只要给它加个前缀就行,对吧?我们叫做INT,没错,把SI二四二幺点HOK。好,这个改一下。完了之后,这个我们也是重命名。完了之后呢,我们点过来,然后呢回车好了,这就是我们这儿的两个文件,对不对?呃,然后我们在拿到这俩文件之后,咱别的不说,我们先快速的浏览一下,就是这俩文件里边都干了啥啥儿吧,定义义哪些内容?咱先看头文件啊,先看头文件啊,呃头文件这里边呢这个东西大家能看到了,这个是不是用来防止啥的,大家还记得吗?是不是防止重复引入的一个逻辑啊,对吧?啊?OK好,你看他这定义的这个标识,这个名字叫什么?
是不是?NRF二四l零幺啊,对吧?这时候咱前面说的那个就是相当于是那个原产的那个芯片嘛,对不对?
好了了,还有一些那个痕迹啊。行,咱们不多说啊,接下来我们往下翻,这里边它引入了一个所谓的config点h,咱这有这个东西吗?同学没有肯点,其其实里边它肯定是定义一些这个红啊等等这样的一些通用的东西,对吧?咱没有没有,不要谁删除这个没问题吧,各位同学哎,好了,往下走。接下来你看这儿啊,这是定义了,什么东西很明显,是不是定义了?哎,这是fisPI的,是不是那四个引角对吧?这个是芯片的那个CE眼角,大家还记得吧,整个芯片是不是有一个使能眼角啊?对吧?哎好,然后再往下这个是那个中断,是不是请缩眼角要定义了几个引角啊?OK你看就是这种书写方式,是不是跟咱们大家前面学的那个五标是很像的呀,对吧?哎,其实一会儿你看他这个c文件里你也能看出来啊OK注意观察同学,他这儿c边边就定了一个这样的方法叫做SPIreadright吧。你可以理解为是是不是读写呀,对吧?也就是说白了咱之前是不是写过一个什么交换这样的一个函数啊,对吧?就是那个意思,你看他怎么写的,显然他这儿是不是用的是软件模拟的方式,对不对?OK好,直接引角至一引角至零,引角至一直角至零。这明显是在用软件模拟SPI吧嗯,对不对?OK而且是用五幺那种方式去模拟啊。OK好,那应该是能够看懂的。当然咱这有硬件。SPI我们是不是直接用硬件就行了,对吧?所以这个函数一会儿咱稍微的改造一下就行啊。来,我们再回过头来看,这边这边呢定义了两个呃红啊,这这些引角其实实们一会儿用引角模西咱也用不上它,对吧?咱也用不上啊,我们直接用硬件的话,这个东西没用啊,对吧?所以我们就直接删掉,直接删掉,用到了就删掉啊。好,接着往下走。这个东西呢大家看一看,这其实就是定义了两个宏啊。哎两个宏你看是什么?一个是ADRvice一个是payloadviceweite,你可以理解是宽度也可以理解,是咱们咱们那个长度,对不对?哎,ADR是不是就是addresspayload,是不是就是那个数据负载呀,对吧?哎呃,说白了就是定义的长度,大家还记得吧,那个地址的长度是不是可以选择三个字节,四个字节,五个字节还记得不?哎,所以人家儿是给了一个五啊OK好,当然你你几都行啊啊,下下就就是配漏的pay漏的。我们前面也看过是一到三十二,是不是都以以对吧?三三十四节间,那它的长度呢是三十二。那这个当然我们到时候还得改啊,就是咱到时候到底需要发多长的数据,我们得自己设计对吧?
是多少,你到时候就改成多少就行了。我们这个先不动啊,好,接着往下走,你看这是啥?是哎,哎哎,哪去了。哎,你看这个是什么?是不是SPISI二四r幺里边所有的什么东西?可曼是命令啊,对吧?哎,大家还记得吧,我们在跟SPI进行通讯的时候,咱们的核心思路什么样的来着,是不是得先发一个命令,然后再跟上是不是数据啊,对不对?这就是它所定义出来的所有的命令。你举个例子啊,我们以这个为例,哎,哎哎哎,咱们以这个为例,这是不是readREG啊,对吧?这个是rightREG,也就是一个是读,一个是写寄存器,对不对?好,你看他这个写的是什么啊?呃,先看这个读寄存器,读寄存器写的是零x是不是零零啊,对吧?哎,大家来看一看这个是什么意思,看能不能看懂零x零零,哎,这个好像不太懂这个是什么意思啊?
雷s零零怎么用呢?将来同学你看啊,你要想读一个寄存器,是不是理论上应该是高三位,是这个,然后是不是低低呃,低五位呗,对吧?第五位是不是那个地址啊,对吧?哎,好,那一会儿你这个命令怎么用呢?这个东西这个东西怎么用呢?这大家能不能想明白很简单,就是你直接用他的这个命令后片,其实这个无所谓,你后边直接加上一个什么就行,是不是加上一个寄存器地址就行,一加是不是就组合成它这个所谓的是不是读寄呃读寄存器的命令了呀,对吧?因为它这个高几位就是零说白了,你你你你这个整体来看这个命令,是不是就是寄存器的地址,整体来看是不是就是寄存器地址啊,对吧?地址是多少?我这个命令是不是就是多少,对对吧?以这个可能不太好看着咱们看第二个吧,看这个看这个这个你看这是呃写寄存器的命令,对不对?你看人家定义一个什么是不是零s二零啊,同学,对吧?你想将来这个东西你应该怎么用?零x二零零x二零实际上相当于是你要转成二进制的话,应该是多少?零二四二零是不是应该就是零零一零零零零零,这是不是就是零s二零啊,同学对吧?所以将来他那个宏你怎么用呢?你是不是直接用零s二零加上一个寄存器的地址,就组成了这样的一个命令了?
是是不是这么个逻辑同学,你算啊,比如举例子,我那个寄存的地址啊,假如说是十五吧啊,假如十五十五的话,你这儿应该怎么着?同学是不是直接用这个零s二零,加上你一个十五十五页,就是是不是零s零f对吧,是不是这几位?第第四位是不是全置一,然后就组成了一个完整的写寄存器的命令呀?对吧?哎,也就是这么逻逻辑啊OK好,所一一会儿你就能够发现啊,他给咱们封装了一个就是写存存器的那样的一个命令,读寄存器,写寄存器的命呃,方法方法来,你拿到这边来看同学,你看这是不是有一个写寄存器,没没没问题吧。同学嗯,ok好,那完了之后呢,你看他这儿是呃怎么去做的啊,呃写寄存器,这个可能还不是很直观啊,不是很直观,咱们找找哪儿呢?
找这儿啊。ok你看这儿,其实他这个名字啊写的不是很合适。你看就是他是基本上都是怎么用的呢?这是不是在调用一个写一个寄存器的一个逻辑啊,对吧?你看看这这个值它怎么传进来的,是不是就是用那个rightr一键那个命令前缀加上了,这就是一个寄存器的一个地址,这是下边定义的,然后后边是不是跟的值啊,对吧?你看是不是就是组合起来组成一个命令啊,呃能理解这个事吧。同学大概是这么个逻辑啊,一会儿我们再详细的看啊,就是总之这就是它定义的一些命令。那这些命令呢呃跟地址啥的拼起来能够组成一个完整的这个命令。当然下边这些命令它就是固定的了。你看这个RD呃RXpayload,这个明显是读那个是不是配的呀,对吧?
呃呃,look好,那它应应的是零x六一。其实你在这个手册里边去找的话呢,也能够找到,应该是谁?同学应该是它吧,这是不是零x六一,是不是四加二等于六,这个是一吧,是不是就是他呀,对吧?就是他给你把这些命令呢都给你封装好了啊。但是这些命令呢,尤其就其实特殊的就是他俩,他俩这个命令不是固定的,你是不是得给他批上那个寄存器地址啊,对吧?那其实其他那几个命令是不是都是固定的呀,对吧?人就是给你都在这给你定义好了,哎,就这么个逻辑啊。好,这是所有的命令啊呃用这俩命令的时候,咱们特殊特别注意一下就行,别的就无所谓了。然后再往下,你看这是啥,是不是所有的寄存器的地址,人家都给你定好了呀,对吧?你看第一个config零s零零,你去找一下同学,我们实际上上午就看了第一个了,对吧?config零s零零是不是就是呀,对不不对,有的的存存地址址给你定义了,然后再往下翻各位。哎,这啊这还有几个特殊殊的这又这这不是地址了啊,这是statuusregister,是不是那个这叫什么寄存器状态寄存器吧,状态寄存器里边,它其实是定义了几个标志位的那个掩码啊OK好,那我们去找一下那个状态寄存器啊,同学来往下翻,往下翻这儿是不是有一个status来?哎哎哎,哪去了?这儿大家看到了吧,同学哎,好,那这里边呢有几个比较关键的这个标志位是需要我们注意的啊。呃比如说有谁呢?RSDR这个实际上指的是什么呢?指的是这叫什么?RS是不是接收的意思啊,对吧?这是接收到了一个一个数据包,接收到了一个数据包之后,那这个标志位它会质一。
那所以我们将来要读数据的话,是不是得看这个标志位有没有之一啊,同学对吧?好,那同理,那这个呢是发送完了一个是不是数据帧呃,数据包之后,它是不是会把这个呃发送标志位之一啊?对吧哎,是这样的啊,然后还有一个这这这个还记得这是不是达到最大的重发次数之后,会发生一个中断,然后这个标志位会质疑啊,对吧?
哎,好,实际上它这声明的这几个是啥呢?就是这几个呃相当是掩码吧,大家知道研码是什个意思吧吧。好,举个例例啊,同学咱们以这个MATRmaxRT为例啊,它给的是零s一零,对吧?你看零s一零对应到我们这里边应该是啥,这是不是相当于是注意啊,这是这是八位,对不对?
零x一零是不是也就是这一位是一,其余都是零呀,从上往下上面是高位啊,这四第四位是不是都是零啊,对吧?哎,你看是不是就是说白了,就是可以通过这个标志位呃,通可以通通过这掩掩码去找到咱们对应的这这三个标志位啊,对吧?
就这么个意思啊,那这这能理解这事吧。哎,好,那接下来我们往下进行啊,同学再往下就是它给咱们定义的一些API函数的。哎,这些API函数都有啥呢?我们来看一看。首先第一个就是一个innete初始化函数,其实初始化函数,这也没干啥,你看它这里边做了什么?初始化初始化管理点往上翻,这是不是那个初始化,它是不是就是对这些SPI的引角,是不是做了一个置位啊,对吧?这些东西咱要啊同学不需要SPI我们是不是系统会自动把我们进行初始化的呀,对吧?所以这个直接删,这个,咱也是直接删掉啊,咱就不要了。哎,好了,那接下来往下进行,这是定义了几个什么样的方法呢?
我们一个一个看啊,这个是一个rightREG这个叫做rightbuff,这个叫做readREZ这个叫做readbuff,对不对?实际上啊同学就是它这个a它这个驱动啊,它的函数命名非常的不规范,其实这个很容易让人产生这个就是误导啊,他说这个东西是叫做rayrite,而且看起来就是样写记读器的,对不对?那我下边这个呢,我这个rightbus我是写啥呢,我写的不也是寄存器吗?其实都是在写寄存器,对不对?就是它俩的区别是什么呢?这个是写一个字节,这个是写多个字节。其实你看它这个c文件里边的注释也能看出来。你看啊redREJ是不是叫做写写写单字节呀,这个是不是叫做写多字节呀,对吧?就这个东西让人看起来很很很难受啊。所以一会儿咱们改一下这个名字,我们把这个改成redbite,这个叫做red呃bit这个呢叫做reite,这这个叫做bread。哎,一会儿咱们改改之后就舒服一点啊。接下来我们再看下面这俩是在干啥?这个是brxmode,这是TSmode,这其实是在设置咱那个是不是芯片的工作模式啊,对吧?你想我们遥控这边是不是得设置为发送模式?我们以飞机这边是不是得先设置为接收模式啊,对吧?哎,它有这样的一个函数啊,然后再往下走,这俩就简单了,这是在干啥呀?这是不是一个是收一个包,一个是发一个包,是不是就是收发数据的呀,对吧?好了,这就是它这个驱动所提供的内容啊。好了,大家现在因为已经对它有一个初步的认识了啊OK那接下来咱这样,我们现在就着手开始对这个驱动进行改造啊,我刚才呢已经顺手把一些不需要的东西是不是给删除了呀,对吧?接下来咱们开始改啊,首先咱们先把什么改呢?先把这个类型改是不是我我我们现在没有u八这个类型啊,对吧?u八这个类型,其实它这个u八哪来的还记得吗?我们这刚才不是删了一个config点h吗?对吧?他在那里边定义的啊,好,我们现在就把这个玩意儿直接都给它替换成uint八t是不是行,对吧?全局替换啊,来吧,先来一个UU,然后呢,我们这儿找到这个呃uint八下划线t对不对?那直接全局替换啊,这个替换完了啊,那接下来我们再来到这个c文件,这边是不是也是直接全局替换就完事了呀,对吧?先把类型搞定呃这个搞定之后,那接下来呢我们进入下边一个环节,各位同学这个u进零八,我们现在是不是拿不到了,同学是拿不到,对吧?这个拿不到,是因为咱没引是不是任何相关的文件啊,对吧?所以这边呢我们稍微的调整一下,呃,我们现在h里边啊,现h里边引,那咱们把谁引进来,你要是单纯为了演这个类型,应该是引standint,对不对?但是咱这儿不要忘记同学,我们这需要用的谁一会儿需要用的SPI吧,没问题吧,同学所以一会儿呢,咱们这儿需要引入是不是SPI点h啊,对吧?但我们的SPI咱们配了没有同学是不是还没配呢呀,对吧?哎,所以一会儿咱们再去配就行了啊。OK那也就是这个SPI点h,我们就先给它在这儿,先放着就行了啊。
OK好,那所以演演演不过来,那所以这咱咱再好像往下改,也不太好改了,对不对?因为你SPI没拿过来,所以我这里边很多东西是都都整不了了,对吧?但这样我们我们先去先去配好SPI吧,配好SPI之后回过头来,咱们再去改它。这个驱动是不是要改起来舒服一点呀?对吧?哎行,我所以这个我们就先暂时置置一下,先搁置一下来,我们先停一下视频。
09-无人机-飞控项目-通信任务-SI24R1-驱动移植-中
cpp
复制代码
嗯,好了,各位同学,那接下来呢我们进入下边一个环节啊,我们先去把这个SPI配好,配好之后回来,我们再接着去改这个代码啊。好,那要配SPI的话,是不是得先打开q吧MS啊,对吧?来我们找到flag找到这个flag的IC啊,来打开稍等一下。呃,当然呢咱们配这个SPI的话,是不是得先去看一看,就是呃咱们的这个硬件原理图上边就是这款芯片,它跟我们的SPI几是相连的呀,对吧?啊,所以得去看一下原理图啊,咱们看一眼。哎,哎,好,那先去找一下原理图。原理图应该是在给大家发的资料里啊,找到呃搜无人机资料,二点四g完了之后呢,找a不是零,应该是找那原理图,对吧?然后找先先找飞控啊。好,那现在咱们去找一找,哎,就在这儿了啊,二点四g是不这个收发模块了,对吧?哎,然后呢,我们就重点关注一下,他给咱标出来的这几个引角就可以了。哎,好了,这实际上就是咱们所需要关注的六个眼角。哎,大家一看啊,首先我们先看这几个,这明显是和SPI相关的四个引角,对吧?
哎,然然后呢,往上传同学这儿,还有一个EN这是那个呃它当然这儿叫EN,其实它里那个哪儿,它那个那个手册里边叫CE对吧?哎,就是那个CE啊OK好,这个是呃IRQ他这那个拼写写错了IRQ对吧?interruptrequest,它写的是IRO啊OK这个大家注意就行了。好,那接下来呢咱们就把这些东西一并都给它配。好啊,来吧,我们先去配SPI明显他这儿用的是SPIE对不对?那我们去找一下,找到connectivity找到SPIE好,然后呢,我们这儿直接给他来一个,是不是全双工master就可以了呀,对吧?
哎,好了,那NSS这个咱们就dispi一对,不管,然后往下传同学,其实下边这些东西呢,我们找到parametersetting里边多数,那内容我们都是不需要去配置的。你像这个基础的算试配置啊,这个真的格式啊,呃这个datasize等等,这些咱们都不用管同学,对吧?咱们接下来呢重点看一看谁呢?看一下这个时钟时钟这块是不是需要配一个预分频器啊,对吧?
好,那可以看到默认是二的话,这个波特率是超了十八了,它会提示我们是不是不行啊,对吧?那你配成四实际上呢就就行了,它行了,但是谁不行?但我们这款芯片是不行啊,呃人家说他只测过就是十兆以上是可以,但是十八兆的平行没说,对吧?所以保险起见,我们再让它低一点,咱们给他来个八来个八的话,是不是正好就是九兆每秒了呀,对吧?这个它就肯定没问题了啊。行了,那之后呢,我们这个时钟的这个极性相位,这些东西我们就都用默认值就可以了,不用改它。好,下边这个CRC什么的,我们都不用管,也就是咱这其实只需要改一下,是不是这个呃时钟这个频率就行了呀,对吧?就这个东西啊,好,别的东西咱们都不用动。好了,这样一来,咱这个SPI就算是配好了,非常简单,配好之之后需要注意一下,检查一下这个个GIO对不对?
默认情况下,咱这个SPIE用的是PA五六七这三个眼角,对吧?但是大家看原理图上啊,是不是呃,是不是他用的PA呃,是不是是PA五六七,这个没问题吧。哎OK啊好啊,这个也能用能用,没问题。PA五六七嘛五六七。OK好,这仨眼角是不是就配好了呀,对吧?但是我们还剩下仨眼角啊,一个是谁?一个是NSS注意这个NSS指的是控制骗选谁的是骗选从级的,对不对?也就是对我们那个呃无二点四g无线通讯通图片,通讯芯片进行呃这个骗选的啊,所以咱咱这个眼角得用GPIO去配,对不对?哎,同理呢,下面EN呢还有这个IRQ是不是都是GPIO啊,对吧?
哎,好了,那接下来呢咱们去配一下,我们先把这个配一下吧。
这个是PAS,咱们去找一下啊,PA四呃PA四,应该是它叫NSS。所以我这是是这样,我们统一命名一下。这个叫做CEchip呃,chipselect呃,enable这个是不是按照咱手册来呀,对吧?这个也别叫NSS了,我叫我叫什么呢?我叫CS,是不是就是chip呃呃,chipselect啊,对吧?片角嘛,对不对?咱们就这么去命名吧。哎,好,那现在开始我先找PA四啊,呃这边直接GPIO就行PA然后咱们来找这个四,在这儿呢,对吧?那这个我们应该配成输入,还是输出模式呢?明显是不应该是输出模式啊,对吧?好之后呢,我们找到这个system括号和GPIO找到这个引角啊,刚才看了这个是那个CS引角,对不对?
我先起上名字啊,咱那个叫啥名呢?你就叫SI二四r幺,然后后边跟上一个下划线,咱叫CS,对吧?没问题吧。哎,好,这个就搞定了啊,同学那上边呢咱们去看一看这个CS引脚,我们应该给它什么输出模式以及默认值应该给什么输入模式是推完就可以啊,对吧?
那这个默认值给什么呢?哎,给高对不对?因为呃它的这个有效电瓶是不是低电平啊,对吧?哎,就是你低电瓶,它是呃偏选的啊。好,那这个给高就行了。接下来呢我们再去看一下另外一个这个引角啊,另外一个我们把这个CE先配了,这个是PA八,对吧?a八啊。好,你去找一下,应该是a八在这儿呢呃PA后边跟成一个八啊,在这儿哎,你点一下这个也是output就可以了。点点完之后呢,我们来看一下,就是先起名字啊,这个应该还是SI后边二四r幺后边来一个应该是CE,对不对?好,那这个默认值应该就是低电平了吧,它这个CE是不是给高的话,它是给它给个进入那个发送,或者是接受模式啊,对吧?对,默认咱们给没啊OK这个就完事儿了,也是特远输出啊。行了,那这样一来这几个眼角就配好了,现在咱们是不是还只剩下最后一个没了,最后一个这个IRQ引角的对吧?
那前面给大家讲过这个引角,它实际上是用来是不是通知我们的呀,对吧?比如说我那收到数据了,我那发生中断了,它是会通过这引角通知我们。但是啊这个引角前面讲的工作非常不稳定,有点问题,所以是咱们这个就不用它了,不用的话,你配不配都无所谓了。如果说它能正常处使用啊,同学你这个要配的话,你得配什么?这这只是输入模式吧,对吧,是不是人家是给给咱们单片机发通知的呀,对吧?你得得用输入模式,然后你的电瓶啊就是默认情况下,你是不是得有上上下拉呀,对吧?你的电瓶应该是给高还是给低的同学默认值就输入的话,输入的话是是得配一个上下拉电电电啊,呃呃,下下电电阻啊,对吧?你是给上拉还是给下拉呢?首先说了它是低电平有效,对吧?它会给你是不是下拉呀?所以我们平时就应该保证是什么?是不是上拉的一个状态,对吧?这个大家注意就行了啊,呃我这就不配了,咱们配了也不用啊。行,那也就是说我们配上这个这个加上下面这仨就行了啊啊,irq就不配了。行了,那也就是说咱现在需要做的配置就已经配置完毕了啊。那接下来呢我点一下这个generatecode点,嗯,哎大家稍等一下啊。好,那现在已经这个生成完毕了啊,完了之后,我们接下来回到就是咱这边来啊,回到这边来,回到这边来之后呢,呃,是不是这儿会生成新的这个呃有这个库文件呀,对吧?所以你现在再重新这个进行编译的话,编译我这个中断会处理。但是它新增的那个库文件,这个东西他要找不到,咱是不是还是得给它,是不是给它放上了,对吧?呃,哦这个报的是SI二四r幺的,这是我们刚才那个驱动的文件,对不对?哎呀,这个驱动文件咱其实放的有点早了,我们应该我们先干啥?同学我们最好我其实当时应该是先是不是去配这个SPI啊,对吧?所以这样我为了确保它没问题,我这样我先给它,我先给它移除出来,省得干扰它们,先给它放下来,放拿出来,然后呢我再呃再去编译,咱们先把那个基础的内容给它处理好,然后再去处理它啊。
好了,那呃你看我那个是不是freeRTS相关的驱动,现在它不报错了,是不是自动已经给我处理完了呀,对吧?哎,刚才刚才已经编译过一遍了,已经删掉了啊。好,进来往下走,你会发现这儿是不是有报报这个说法呀,对吧?这明显是SPI相关的文件,是不是咱们这个原文件里边是没有的呀,对吧?哎,好,那然后呢,昨天不是有同学说嘛,就是出现这个问题,咱们只需要在这儿,是不是重新导入一下这个项目就行了,对吧?确实是这样的啊,确实是这样的。呃,但是啊呃呃它导入的话,谁会导入进来呢?这个新的资源文件确实会导流,它不会把原来的这个includepass这些东西覆盖,但是谁会被覆盖呢?你像我们在这块儿做的编译器的这些配置,你像比如举例子啊,你像呃呃它这挡住了,你像这些配置,包括这个配置,这些里边的配置都会丢失。那里边因为这些配置我们是在是不是这个这个k这个在这个EID里边配的呀?对吧它是单独维护的,你把把o那边再导过来来之这些东东全全被覆盖了,就就全白配了,就能理解这个事的东西。所以我这儿呢,我还是我,我还是一呃单独添加吧啊,单独添加啊,这是大家注意一下就行,单独添加,我们先找到application,对吧?嗯,然后application里边呢先找到user,找到call,在这里边,我们右键添加文件,找到car,找到FRC找到咱们刚刚的这个SPI就行了。好PI进来了之后呢,我们再找到driver啊,往下翻,然后这里边也是添加文件,找到driver,找到这个啊,找到SRC然后呢我们往下翻,应该找SPI,对不对?是不是就是它呀,对吧?来添加原文件。好了,那这样一来的话,应该就算是搞定了啊。接下来我们再回到这边来,回到这个INT吧,就是或者随便找一个文件,就是让它把这个编译按钮出来啊,编一下。好,现在是不是已经编译通过了呀?各位同学,哎,那也就是说明咱目前的这个SPI相关的配置就已经都搞定了。哎,搞定了。那下来呢把这个视频停一下啊,呃呃呃,停停前停之前这样样,再把刚下来咱们是不是处理好的那那那几个文件再给它放进来,对吧?二点四GG我完了之后呢,我给它放到咱这个INT这个目录下啊,放进来们这位。好,那接下来咱们要做的就是处理这俩文件了啊,来停下视频。
10-无人机-飞控项目-通信任务-SI2
cpp
复制代码
来吧,各位,那现在呢我们就一起来看一看,就是他这儿给咱们提供好的这个驱动啊。好,首先这块他是不是用到了一个SPI呃RW的方法就是交换一个字节,对不对?哎,这个我们已经给他实现。好了,这个咱就不用管了,对吧?哎,好,接下来我们往下看同学,咱们先把它最基础的这些驱节,看一看最最底层是是不就就是一个字字节写个字节节啊,对吧?一个字节该怎么写的?呃,首先第一个参数,我们刚才提到了这个实际上这个唉,这个他没改过来是吗?这个RAA实际上我刚才说了,这个应该是什么?应该是那个是不是CMD啊,对吧?应该是CMD啊OK好了,那完了之后,后边才是你要真正写入的那个字节啊。OK好,那接下来我们往下进行各位同学,你看看看这啊呃注意,你看他这儿是不是做了一个片选呀?先拉低是不是写完之后再拉高,对吧,这是不是一共就是发发了两个字节,对不对?然后第一个字节注意,他是不是接收到了返回值了呀,对吧?大家还记不记,我们在跟他通信的时候,第一个字节它的返回值是什么?还记得吗?是不是那个状态寄存器啊,对吧?哎,你看他这是不是是用状态寄存器接收了一下,然后把这个返回出来了呀,对吧?哎,是这样的,然后第二一个字节是不是要发给他的数据,你要发给他的数据,他是不是不给你返回或者返回的数据是没有意义的呀,对吧?这个时候呃,你就不用接收了,你看是不是很简单呀,对吧?好,接着往下走,那下边写多个寄存器,那也就跟刚才其实差不多,只不过就是说怎么着呢?我先发一个命令,然后我后边的数据是不是通过for循环的方式给他发呀?嗯,对吧,是不是就这么个逻辑,这个就过了同学这是呃写一个和多个字节。然后接下来呢就是读一个和多个字节啊,那读一个或者是多个字节的时候,比如说我读一个字节,读一个字节,你给他发的,其实只有一个什么东西,只有一个命令,这个他用的REG,但其实应该是命令,对吧?他们应该都知道啊,我我所谓的命令指的是谁?指的是咱们这个列表里边是不是这些东西,能能能能能理解这事吧。同学啊,其实只有你在读写寄存器的时候,那是不是这个命令才跟地址是才跟寄存器的地址是有关系的呀,对吧?你像你下边这些命令,这这都跟寄存器地址没关系,都是命令啊,这一定要注意啊。好了,那接下来我们继续往下看啊,好读的话,那你是不是就是先发一个它,然后再接收返回值就完事儿了呀,对吧?然后把这个结果返回出来。对,这是读一个,那读多个,是不是就是用数组去接一下就行了呀,对吧?这个也很简单,都没啥可说的,这基本驱动,咱应该是知道了,对吧?重点重点咱们看啥呢?咱重点得看一看剩下的那四个函数。那四个函数一个是用来设置接收模式的,一个是用来设置,是不是咱们当前是发送模式,还有一个是发送,是不是这个数据,还有一个是接收数据啊,对吧?哎,咱们得看看这四个函数,我们快速的看一下啊,同学来我们先干啥呢?咱们先设设置这个接收发发模模式吧。我们们看看这这儿是不是是用来设置当前模式?为什么模式的为发送模式,对吧?好,你你看设置当前模式为发送模式,你看在这做的什么操作啊?首先ce是不是先拉低了,大家还记得ce是哪不CE是不是就是咱们当前的这个芯片的一个矢能引讲啊,对吧?大家注意观察看它的工作模式啊,你不管你现在处在什么模式,下边,你将CE置为零之后,他就会怎么着,同学是不进入待机模式啊,对吧?哎,好了,也就是他现在确保目前是没有处在这个接收和这个发射模式的,对不对?ok好,现在这个模式下,在这个模式下去干啥呢?去做一系列的配置,配置好了之后,你看它又干啥了,把这这意儿是不是拉高了呀,对吧?那拉高之后,他就又会怎么着,是不是回到这个接收模式,或者是进到这个什什么射射空闲模式啊,对吧,取决于什么取决,于是不是这个计算,其他到底一还是零啊,对不不对?学。ok好,那接下来咱们就看一看他这这都配置什么东西啊呃来我往这边稍微的拖一拖,后边人都有注释啊。首先你看他配的这个是啥写入发送地址。哎,我大家想想,我现在是不是要给某一个这个呃就是我的接收方发送数据啊,对吧?那你是不是得指定你的接收方,他他的地址是是什么才行啊,对吧?OK好,那这个怎么指定呢?实际上这样呢是通过一个寄存器指令的啊,这是通过一个寄存器指定的。但是大家都知道啊,我回忆一下同学,咱们那个最终最终发的那个包里边是不是会包含咱们这个目标地址还记得吗?对不对?OK但是那个包是我们去打包吗?不用吧,对同学是不是那个芯片自己打包啊,对吧?所以你就得告诉人家,你这个地址是什么,你就直接给他配在寄存器里就行了啊。好了,你看他这儿怎么写的,是不是调用了一个rightbest,问一下大家为什么是rightby好因目标标址址,咱是不是有三四五个字节选选对,对吧?是多个字节,所以你rightrightby好好,那第一个字节应该是什么来着,是不是咱那个命令啊,是那个是咱那个命令啊,同学OK这个命令。你看啊,我们现在是要干啥,是不是要把这个地址写到某一个寄存器里啊,对吧?所以这个命令你要按照我们前面讲的的这个接口逻辑来拼,你要把它拼,你应该用哪个命令同学写寄存器,时时咱咱得用这个命令吧,对不对?
同学这是写寄存器啊。OK好,那所以前面应该是零x零呃,零零零一对吧?
零零一,然后加上是不是那个目标寄存器的地址啊,大家能理解个事儿吧。同学,所以你看他这怎么写的,是不是就是SPIrightREZ我们点进来是不是?就之前咱们看到一个零s二零啊,对吧?后边又拼上了一个TXADDR显然这应该是一个寄存器的地址吧。TXADDR零x幺零。你去找的话,能找到这个寄存器啊,同学我们去看一下,我就带着大家看这么一两个啊,后边我就不再一一看了,就是咱知道是怎么回事就行,来往下翻。咱们找到那个TX呃ADDR呃status在哪儿呢?呃,这是RX这是不都是接收的地址啊,对吧?你看你看这个接收地址能配几个同学,是不是能配六个?为什么?因为是不是有六个通道,是不是可以同时接收数据啊,对吧?你是可以配六个接收地址的,但是你发送地址是不是只能配一个?嗯,是不是这个呀,对吧?能看明白同学它的地址是多少?零x幺零嘛?所以说你看最终拼成的命令,是不是就是零x二零加上那个零s幺零,是不是得到了一个完整的写命令啊,对吧?就这么个意思嘛?哎,好,那完了之后,我们再往后走,后边是不是就是咱那个数组数组是不是我们前面定义的一个这个呀,对吧?这是我定义好的,这个它驱动比定好的一个地址。但是到时候大家这个得改呀,改成自己的。好,完了之后往下走,这样还有一个什么是不是就那个长度了呀?对吧?好,这个长度是不是也定义了一个宏五,哎,这个长度应该跟谁保持一致,是不是跟这个速度的长度得保持一致啊?哎能理解这事儿啊。好了,那现在是不是这一行代码,大家就能够搞清楚了呀,对吧?接下来我们再看第二行,他做了什么事儿啊,来注意观察这儿,他说为了应答接收设备,那什么意思?他呃哎呀,他这个写的也不好啊,不是叫做为了应答接收设备啊,他其实是为了为了什么,为了接收什么,是不是接收方给咱们返回来的ACK啊,对不对?那我需要怎置着,是不是将我注意,这是在设成发送模式啊,我需要将我自己的,是不是那个我那个个个通道零对吧?设置设置置为我这个发送地址跟这是不是设成一样的呀?嗯,大家还记得这个逻辑吧。哎,上午给大家分析过了。所以说你看他这不就是在配置RXADDR零嘛点呃,零SC零。我们刚才看这个寄存器的列表,是不是咱们也看到了呀,是不是就把这个寄存器的值设置成了啥,是不是设置成跟跟我那个目标发送地址是一样的呀,对吧?这样一来就能收到ACK。哎,你看这这些逻辑是不是跟咱们上午讲的是一样的,这都能看懂吗?好了,然后下边基本上都是类似的模式啊,你看看他他这都干了啥使吧?通道流呃,通通道流呃,使能接收通道零,自动验答使能接收通道零对吧?设置是不是自动重发的这这延延长等时间,然后以及这这个发的次数啊,对吧?前面讲了,就是我如果果ACCK我多长时间没收到,是不是超时之后才会发送那个是不是那个呃才会重发呀?对吧?并且我重发的次数是不是有限的呀,对吧,怎么配都通过,是不是这个寄存器去配置,对吧?叫做做重发的trytryRETR是不是reretry的意思,对吧?都是和重试相关的次数啊,呃参数都在这里边配啊。好,那再往下呢,这儿还设置了一个这个很关键,同学这个就很关键了,这是什么东西,是不是选择射频通道啊?前面咱们讲过是不是我们目前的这个一共是有多少个信道,是不是一百二十六个信道啊,对不对?这个是不是就是在选择你现在要用哪个信道?那按照我们自己的写法,咱们的接收方和发送方信道,是不是也是用一样的类型啊,对吧?好,这个信道取值范围是多少呢?一百二十六个,一共是一百二十二十六个,对不对?那你取值范围是多少呢?这个得去看一下手册啊,同学你看它设置的是哪个寄存器,这个是不是设计的是RFCH啊,对吧?是不是就是这个寄存器啊,对吧?呃,RF就是天线的一个这个信道嘛,对吧?OK好,那所以接下来呢咱们去找一下这个寄存器啊。RFCH你就看它地址是多少?地址?零s零五,对不对?那我们就打开这块儿,找零s零五往上返零八零六零五,这是不是零五对吧?这是不就就是那个RCCH对对吧?OK对,那这块儿可以看到这个RFCH寄存器呢,它一共是有几位的同学,一共是八位八位。但是它这个第七位是不是reserve保留了呀,对不对?然后也就是只有零到六位,对第六位是有用的,对不对?
好,那完了之后,你看它的取值是什么?他说设置工作室的信道,然后呢分别对应零到一百二十五个信道,对不对啊?然后呢,信道间隔为一兆赫兹,然后呢,默认零二就是二四零二,那零零是不是就二四零零零一是不是就二四零一啊,对吧?所以咱们这能取的范围应该是从多少到多少,严格意义上来讲,应该是零到是不是一二五啊,能理吧,我们取值是不应该是在这个范围里边取值,对吧?但是有同学跟我说,之前大家自己做这个测试的,是不是有些同学已经给他设到二百多了,也能够工作呀?是吧尤其是这部分同学,咱们当时当时老师给大家分了一下,对吧?呃,也能正常工作,这个是为什么啊?我后来想了想,我觉得就是有可能啊有可能是啥呢?就是他内部的这个他内部的这个算法应该是啥呢?就是你这儿只要这儿给个值,他应该是在二四零零的基础之上,怎么着呢?给你加上加上。虽然他标注的是我的工作范围是二四零零到二五二五,对不对?但实际上呢,你要是超了这个范围,他可能也能挣,也能工作,但是不保证不保证稳定。我觉得他可能是这么一回事啊,所以大设设二百多也行,但是呃稳稳妥起见。咱咱们一会咱们在设置的时候候尽量还是怎么着呢?尽量在这个范围里边去能理解明白吧?
同学哎,零到幺二五里边去啊。好,这个一定要注意行,咱这样同学呃,技术支持啊呃啊,已经联系上技术支持了是吧?让频频一测试试看看咱们这也没有啊。OK啊行,就是咱知道一下这个事就就行。呃,就是我们尽量啊,还是在这个一零到一二五里边,零到一二五里边选啊,呃,然后呃具体怎么着呢?等后边咱们再有时间再看吧。呃,来吧,那接下来咱继续往下进行同学,呃,为了方便一会儿大家进行修改。我们把什么呢?把这个东西咱们给他提出来,提出来,咱们作为一个啥呢?作为一个宏也好,做一个参数也好好的时候是不是比较方便,对吧?我们在这儿们定一个,咱咱就直接接范范,咱咱底范CHNNNLL。这个呢如说说这儿呢就给它设置为四十,然后呢接下来咱们要做的工作,是不是就把这个controlc拿过来,哎,往下走,注意我这个四十是十进制的,四十,对不对?咱OK好了,拿过来,然后他这个注释其实写的有问题,他这儿给的四十,他说选的是不是零s四零,呃,然后跟零s不是一回事,对吧?啊,就是他注释有点问题啊,不用管这个个替换,然后注意注意RSmode需要设置我这个信道,我TSmode说用不用设置也要注意。你看这是TSmode在设置RRC是这个寄存器啊。对吧?所以这个咱们也是给它替换成它。那到时候大家要是改的话呢,是不是统一直接改这个位置就行了呀,对吧?这个大家一定要注意一下啊,一定要注意一下。行了。那这是关于mode啊。对了,再往下这边呢是在设置置功率,是在设置咱们这个就是无线电通信的这个传输输速率以及发置的功率啊,这个东直直接满满,它应应该高高就到传输功率。咱们不用管啊,这个都直接用就行。然后后边呢是在设置这个CRC校样啊,使能CRC校样。
行了。你看这一套下来之后,是不是TSmode,它就设置好了呀,对吧?就这么个逻辑,说白了,就是写各种寄存器啊,行,那我们就改成这个c了呀,对吧?那接下来往下吧,各位同学这个是在干啥呢?呃呃,这是RI呃,这是TSmode,是不是还有一个RSmode呀,对吧?RSmode,我就不带大家一点一点去看了啊,咱们就快速的过一下就行。RSmode。首先第一个这一定是在设置什么?是不是它通道零的这个接收地址啊,对吧?啊,因为我们现在一对一,我只用到了通道零啊,接收的时候,其他五个通道明白啊,所以说这边呢直接就是呃把它设置为是不是那个TSRS咱们两侧这个地址是不是都设置成一样的东西,对吧?哎,所以一会儿你改的话,咱直接改一个地方就行了。好了,那接下来往下走,下边就是什么通道零的接收使能啊什么这个信道啊等等这些我就不再一个一个去看了,就是大家知道咋回事就行了啊。哎,好了,那这样一来呃,发射模式接收模式的设置就算完成了,然后再往下再往下还有俩API一个是这是接收,是不是一个一一个数据包啊,对吧?好,再往下走,这个是什么?这个是不是发送一个数据包?那将来咱们去做测试,我们去发数据,是不是咱最终最终调用的,主要实际上是这俩方法吧。对不对?这方方法咱们下下个再再看,然然后俩方块里边是还有一个地方就中断这块,我们是不是还得处理一下啊,对吧?到时候咱们改一改这块的逻辑。小兰同学呃,咱们先到这儿,下课,先休息会儿,然后下节课咱们再处理这两个事啊。
11-无人机-飞控项目-通信任务-SI24R1-驱动说明-上
cpp
复制代码
这个嗯好了,各位,那接下来咱们就开始处理这俩文件了啊,这俩文件我们处理到什么程度呢?它至少编译不能报错,对吧?呃,得到这个程度才行啊。好,那现在咱就开始始呃,首首先我我们先进到这个头文件,看看头文件里边有没有咱们需要去改的东西啊,头文件实现在在啥啥,对吧?头文件是不是现在本本上已经不报错了呀,对吧吧?唯一需要改的,可能一会我把这个函数的命名改一改呃,让他呃好理解一点啊。行,接进来,我们再进到这个c文件里。c文件。首先这得引改一下,咱这是不是没有这个文件,我我刚才是不是给这个文件加前缀来呀,对吧?首NTSI二四二幺h。当然当然这个呃现在它也其实你编译它引引不着,因为我我还没怎么着,我我我加加一下,它在没在咱们那个INT目录。哎,在我这儿是不是自动已个加进来了呀,对吧?哎,在的话他就能找着了啊。行,那也就是说目前呃头文件差不多了,进来,我们重点改这个c文件啊,c文件这块呢可以看到,首先它上边定义一个什么东西,这是发送的地址吧。哎,那一会儿大家去呃自己去做这个移植的时候,这个地址是咱每个人尽量都要不一样的对吧?哎,尽量不一样啊。好了,然后需要大家注意的是这个关键词,咱这能用不?它有一个code。大家还记得code这个关键字在五幺里边的作用,不是不是就是把这个变量放在咱们那个内存的是不是代码区啊,还记得吗?
忘了之前咱们最开始写那个我到时候讲讲,我我要写那个ORED屏幕还记得吗?当时是不是定了一个非常大的数组啊?我在那个普通的这个数据区里是不是放不下了呀,对吧?是不是加了一个code放到代码去了,还记得吧?哎,这是干那个事儿的,所以咱咱这三二里论没有这个东西吧,没有的话,你就给它去掉就行了啊。OK好,这个完事儿完之后,我们接着往下翻。那这个方法咱是不是必须得改一下啊,对吧?肯定不能用这种方式啊,所以咱这直接现成改就行啊,这个非常简单,它是不是就是做了一个readright呀,对吧?这个是他要写的,这个是不是把它交换回来的数据是返回出来呀,对吧?不就这么个逻辑吗?
接下来咱咱就写呗,好个,我直接删了,直接删了好了。那接来咱们开始开始写怎么写,是不是直接调how后边跟上一个SPI后边再来一个啥,咱应该是有一个transmit加receive吧,是不是就是这个函数transmitresave对不对?好,那现在我们就开始往里传东西了啊,那一共需要传这那么一大堆的参数来一个一个来。首先第一个就是SPII一的这句句柄,对不对?好,那第二一个参数是啥?
是我要发送的数据吧,我要发送的数据是不是应该就是它这个参数对吧?也就是应该咱们那个是BYTE,对不对?BYTE啊OK好,那完之后,当然这个得是一个指针吧啊OK那接下来往下进行下边一个是什么?呃,下边应该是交换回来的,也就是咱们收到的数据,对吧?这个东西咱是不是就得声明一个变量的东西。哎,声明一个啊来这边我们来一个uinint八t对吧?好,那完了之后呢,我们随便取个啥名字就行,这个就不能叫bat了,我们叫做呃result吧。RESUSresult一个结果吧,对吧吧?哎,完了之后呢,我们把这个结果给它扔进去啊。OK好,那完了之后呢,来来一个这个之后,我们再往下进行,下边,咱们要给它方程啊,呃下边是不是要放size啊?我们size是不是就是一同学对吧?OK好,再往下进行。呃,下边咱们再放的话,要放的应该是一个超时的时间。这个写个一千是不是就行啊,对吧?哎,好,完了之后不要忘记,咱得return,谁得return这个result吧,对吧?RESUFT哎好了,那改造完了,你看这就是移植驱动嘛,对吧?呃,然后这是一个静态的方法,也就是只在当前文件可用,咱就留住它就行了啊。行了,接着往下走,这个完事儿,完了之后,接下来下边呃,还是有些东西需要咱们去改是吧?
啊,比如说我们以这个为例,你看就是这个函数它的作用实际上呢就是写什么?就是写一个字节,大家能想明白这个道理吧啊,就是写一个字节啊,写一个字节,然后它这个参数是什么呢?
这个参数其实也不是也不一定是这个寄存器啊,这个这个参数应该是什么呢?应该是一个命令。呃,因为因为咱们前面有个就是他封装这个函函,名命名的很恶心啊。其实他是这样的同学,我我们稍微回顾一下同学,我上午是不是给大家说了,就是咱这个SPI在进行通讯的时候啊,就是第一个芯片是这规规定的吧。就是你所有的通信都应该是怎么着呢?是不是先发命令再发什么再发数据。对对,所以它实际上啊第一个字节应该是什么么?应该该是个么?对,是就是寄存器的地址址,这大家能想明白这个事儿吧OK啊,好了,那所以这个东西就不能叫rightREJ就是名字命名的很恶心。这个参数呢也不是REJ啊,后边这个是真实的数据,这个没毛病,这个应该是啥呢?这应该就是rightbite,就是往里边写一个字节。完了这这个第一个字节应该是啥呢?应该是你发送的那个是不是命令啊?对吧?OK好,第二一个才是你后边跟的数据是不应该是这么个逻辑啊,应该是这么个逻辑啊,就是它这呃整的不太好。所以咱们这样我们统一的去改一下这个东西啊,怎么改呢?很简单,我们来到这边来呃,这是不是叫做rightREG啊,对吧?我们直接摁一下f二,f二是不是可以把所有引用它的地方都给它改了呀,对吧?
来,咱们统一修改f二啊,这边呢哎哎f分拿过来。完了之后呢,这个我叫做INT,后边跟上一个SI二四二幺,咱们就叫做rightBYTE是不是就是rightback呀,对吧?好,回车呃,回车之后,他这边好像是没没同步修改,对不对?我我们编译一下吧,编译一下,他可能还没有建立起来这个联系啊呃OK好,那编译完之后,你会发现他这里边是不是会报很多的错误啊,对吧?呃,那报错误是因为报什么,为什么报错呢?我们就那那我们就先这样,我们先把这个报错修改完,然后再去改这个名字吧,要不然的话,他这是不是联想不到啊,对吧?他没法改啊。好,那注意观察这个报错很简单,哪报的错,是不是什么CSN等于零CSN等于这是在做什么?是不是在做骗选呀,对吧?你那但是我们现在是不是不能用这种方式了,对不对?所以咱这样我们去呃处理一下,就是他的这个骗选的这个这个这个逻辑啊,其实除了这儿之外,你看下边还有基础报错这个CE它是不是也要置零也要质疑啊,对不对?你看五幺零不是都是这种写写法啊,对吧?但是咱这不能这么干啊,所以我们这怎么着,咱们定义几个红吧,咱们定几个红就完事儿了。对不对?来我们写几个红啊,来来到头文件这边儿代码的逻辑,咱们最后再看。因为咱现在他这个还没法看啊,来现在咱们先先先先处理完这个代码的报错啊。好,来,我们这DEFIE。好,那这边咱就是啥,我就叫SI。比如说呃二四r幺后边呢,我们来一个CS,哎,后边我们来一个LLL是不是就是拉低呃,然后h就是拉高啊,对吧?嗯,OK好,那接下来我们往后走啊,呃后边大家应该写啥呢?你看才给大家提示的是不是这样的啊?
呃,howGPLredpin,那找到part找到pin,那拉拉低嘛,这个拉低拉低是不是就啊,对吧?那我们点一下能跳过来,那就说明没问题。哎,生成的这个代码代码是不是正好是正确的呀,对吧?好,接下来我们回车再让它呢给我们生成一下这个这个resigh的h也没问题,对不对?好,接下来呢我们再替换一下啊,这时候我们再来一个SI后边跟成一个二四,应该是r幺。咱还有一个是是不是CE啊,对吧?哎,CE再来一个l啊OK好,后边也是一样的思路。好,这个往下走。哎,h那这样一来是不是就完事了,我们之前是不是经常用这种方式啊,对吧?之前与软件模拟的时候就都都是这么干啊。好了,那这个咱们就拿过来了。拿过来之后,我们先把这里边的所有东西给它处理一下。
所有的CE等于零,我们都肯上f,咱们给它替换一下,替换成什么?是不是替换成我们刚刚的那个呃这个我们去复制一下啊,应该是CE漏吧?是不应该是这个呀,对吧?所有这个都给它替换过来啊,找到c里边来拿过来,这个是不是就替换完毕了?
那所有的CE等于一呢,是不是都给它替换成这个是不是h就可以就了呀?同学对吧?来,我们拿过来这个没问题吧,同学哎,好了啊,现在我们基本上就给它处理完了啊。呃,哎我看一下这个方法,呃,这个方法大家注意观察一下啊,这儿是不是有一个什么t设置TSmode呀,对吧?那它这有CE等于l,但是他那个CE等于h,是不是这个驱动有点问题,他是不是把它给注掉了呀,对吧?但是这这个不能注啊,这个你得给它放过来,这个一会儿大家也注意一下这个事儿啊,就是它这个都是成对的。你看上面那个上面这是不是CELCEHCECEH啊,对吧?它这个应该是驱动写的时候,不小心给它注的啊。呃,这个大家注意一下就行,给它拿过来就行了。行,我看还有没有这个问题啊,呃,这个这儿替换了,应该是该替换的地方应该都差不多了。哎,这个这个没替换,这个是那个CS的对吧?CS我们也替换一下啊。CS是f应该是CS等于一的那个,反正有点麻烦啊,这有点啰嗦,这个东西啊。好,那我们统一都换成是不是CSH啊,对吧?替换呃,然后等于零的,哎,我们这个都给它改成,是不是low啊,对吧?替换呃,哎这个哦,他这个啊他不叫CS,他叫CSN是吧?那就CSN我去那那这这这这这个这个来拿过来。好,这个没问题吧。然后这个等于一的这个就等于h。哎,好啊,但是这个还是替换不干净啊,因为他这儿是不是有有些地方有空格啊,对吧?那那那就手动改一下啊,这就改看还有哪编译一下,看哪还有报错啊,来吧,找还有几个地方呃,应该是在这儿,这儿,是不是也是给它改成CS等于呃CS漏就行了,对吧?
CS漏啊。好,那还有这个位置,这个位置应该是CSH大家千万细心啊。不要改错了啊,呃,这个改完了,这个没改完,这个改成CSL就完事就完事儿了,就再编一下啊,再编一下,还有一个是吧,还有一个应该是在在这儿呢。哎,这儿这个就是啥了呢?这个是不是他用了一下那个IRQ那个引角啊,对吧?但是我前面给大家讲过,就是咱这个IRQ引角是不是有点问题啊?对吧?所以我们就不用这个了。那这儿这个逻辑一会儿咱们整体得改一改。
所以这个我们暂时先不处理啊,这个我们就先给它注了,同学能理解吧,先注了,先保证咱这个编译是能过的啊,来走变异过过敏过内粉。呃,这次基本上是过了,对吧?但是好像还有点问题,哪儿有点问题呢?他说的是这个头文件里边的,是不是这俩红有问题啊?同学来我们找一下这俩红是哪个红哦,这说了一个是readREG,一个是rightREG对吧?呃这个是怎么回事?我给大家解释一下,这个正好是跟咱们号库里边的代码重了。你看啊同学号库里边也有这俩红啊,你你直接全全局搜索一下,你直接readREJ,对吧?你拿过来,你放在这个位置,直接搜,你看是不是咱们这个SM二,这里边也有这样的宏啊,对吧?撞上了。所以这个呢咱们必须得给这俩东西,给给他改个名字,能理解这块事吧。同学千万不要那个啥不要撞上啊,这边你不要全局修改,你不要这么改啊,有的同学学会了,我直接f二一下,我把所有地方都改了,你改这儿的话,号库那边是不是也改了,千万不要这么改,这回你只能手动改了啊,只能手动改了,这边我们加个前缀吧。SPIreadREJ拿PI是不是readREG,是不是就这么就行了,对,对吧?好好,那那样样这这这同吧,那我们来到这个c文件,这边是不是用它的,咱们都得跟着改下,对吧?哎,全局替换了,就啊来先把这个拿过来拿过来,应该是原来叫readREJ,我们替换成SPI是不是readREG啊,对吧?唉,替换好,那是不是?还有一个rightREJ啊,对吧?RITEwriteREJ。那这个呢也是替换成writeREJ就行了啊。好,所以你看移植个驱动其实也不是那么省劲儿啊,来,咱们重新的给它编一一下。好,这回是不是就全通过了呀?同学,哎,这回至少代码不报错了啊,不报错了。接下来呢我们进入下边一个环节,我把这个代码的名字我给它规整规整。呃,你要是你要是能接受不规整也行,我还是希望规整一下啊,要不然这个太不好理解了来吧。那现在我们开始去做这个相应的调整了啊。呃,首先我们把这个先给它命名一下,哎,他说找不到这个含义了,这个刚才是改成功了吗?这边我哦哦,他那个函数名上是不是也带这个?哎呀,我天这个太恶心了,那那咱这个再把这个函数名给它去了吧,就没没事,只有函数名无所谓,只有函数名无所谓呃,对,应该区分一个大家写,对吧?刚才呃但是咱们没没做啊,没做没做呃,撤一下撤一下是不就就了。对,对吧?撤一下完之之后,我们一下这个呃,然后呢,这边是不是可以点一下这个就是呃AB啊,对吧?这个就能够区分大小写了啊,呃,找到它,然后这个是有大小写的吧。呃,那我们应该是找这个CTRL咱咱得得得得替换这个这这回是不是行了,这不行了,同学怎么怎么二十项了啊?这确实二十项,因为这里边有好多地方,是不是都都用到了这个红了呀,对吧?行,应该是这么替换啊。好,这回应该行了。来,那我们再把那个谁这个有点有点点,有点坑人啊,这个东西手动替换一下吧。哎,大家没被我绕晕吧,就是就是就我就是想把这个名字给它调一下啊,我再把这个函数的名字我再回原原来啊,原原来叫么来着,原来是不是叫这个呀,对吧?啊,我再给它改回来啊,好拿过来,然后这回我们再进到这个c里边,我再重新替换,好,再替换回来就行了。行,这这回咱们再编译一下啊,别别晕啊,别晕自己改的时候也是一样。这个东西反正用人家的就是没没那么顺啊。
行了,我我现在是不是已经改回来了,同学呃,他原来的函数是不是要这个呀,对吧?哎,我现在这个呃函数名没动,但是我把它那俩红的名字给它改了啊。行了,那接下来咱们这样同学,我们就可以去对它这个名字进行这个调整了,这回就可以全局修改了,直接摁一下f二f二。
这边呢我们首先给它加个前缀啊,规范一下,然后后边我就不叫rightREJ了。它其实就是说白了写一个字节,咱们就叫做rightbite,是不是就可以了呀,对吧?好,那咱们现在直接回车,那这回注意观察我们来到c里边,是不是所有的这个就是rightREJ它就都改成rightbat了呀,对吧?你看这块是不是都改了呀,对吧?好,这个完事儿,接下来呢我们把它的什么?对对对,我们把它这个参数名也改了,这也不是REG,这应该是那个命令,对吧?所所这这边我们们也只向它它一一f二。那那这所所有的这形参参g它就一一就就给它命名为CMD是不是就是的呀?对对,好,回车好,那他问我都要要改些些这个函数里边的,我们这里边都改,你看是不是就是呃这四个函数啊?对吧?都是命令啊,都直接给它改的,我们点击应用就可以全选上啊,点应用好就都改了。commcMDCMDCMD是不是都改了呀,对吧?哎,好了,接下来往下进行,下面再改。第二个名字咱们都给它调整调整规范了啊,这个来一个INT后边呢我们这个叫right,别叫什么buff了,你就直接right,but这是不是好理解啊,对吧?哎,好了,那接下来呢我们这儿直接这个回车懂你好,替换完毕,下边这俩也是一样的,摁一下f二,这个也是先加一个缀INT下划线SI二二二幺后边边上一个read的个biteBYTE啊。好,直接回车考定,这个也是一样的。f二好,这边呢我们来一个INT下划线SI二四二幺,这个叫做read次bieYTES对吧?回车好了,那这样一来的话呢,我们整个的这个逻辑就算是清楚了啊。呃,首先再明确一下它的作用是像这个SPI是不是写多个写一个字节呀,对吧?哎,然后呢,这个是写多个字节,甭管你写几个字节,你在发送的时候,你的第一个字节都是什么,是不是都是命令啊,对吧?
然后后边写一个字节,还是写多个字节,指的是后边的数据,对吧?你要是写一个字节,是不是就是一个uent八y六就行,写多个字节,是不是得给人家一个数组啊,对吧?就是这么一个思路啊,同学哎,好了,那读的话也是一样的道理啊。行了,那接下来呢我们就回到这边来,呃,这俩也改了吧,这个是不是也给它加个前缀啊,对吧?也加前前缀啊,这个咱们叫做INT看划线啊。好,这个去掉RXmode等你这个也是一样的,加前缀啊。呃,大家你要是觉得啰嗦,这个东西你不加也行啊,都可以都可以啊。这个是它。然后这个再加最后一个前缀就完事了,加IND或者你到时候直接复制我这个也行,反正这个都是都是抄嘛,我这也是抄的,你抄我的也没啥区别,好,拿过来。嗯,行了,那这样一来,我就已经把这些函数是不是都调整好了呀,对吧?ok调整好了之后,接下来咱们先编一下,看看能不能过啊,能过没问题,没问题了之后接下来咱就可以去读一读他写的这个驱动了啊,来吧,那现在咱们就正式开始啊,我先把这个视频停一下啊。
12-无人机-飞控项目-通信任务-SI24R1-驱动说明-下
cpp
复制代码
行,好的,同学。那接下来呢我们一起呃往下进行了啊。呃,接下来呢咱们把这个发送一个包和接收一个包的这个函数,咱们再来看一看,然后看完之后咱们就可以开始去做这个准备去做这个发送和接收的测试了啊。那么我们先看第一个,这就是接收一个包,对吧?好,那前面给大家讲过啊,你正常情况下,你接收一个包应该怎么接收,应该怎么接受来着?同学要想接收一个包的话,是不是按照他正常的工作流程啊,来看一看。同学,你按照正常的功能,那是怎么接受我呃,我们找他的那个结构图就行。看这正常的情况下,你呃这个芯片它收到一个包之后啊,它它正常会怎么着呢?
它是不是会把这个包进行这个所谓的解调,对吧?解调之后呢,放到哪儿?放到是不是这个RX恢复里边啊,对吧?然后需要给大家明确一点,就是这里它只会放什么,是不是只会放那个数据包里边那个配漏的呀,你像什么那个前导码啊,什么那个控制字啊,这些是不是全都没有了呀,对吧?
它只放这个配漏的,也就是我们只从这里边读配漏的就行啊。好,那我们这边怎么知道它有没有收到呢?呃,两种方式,一种是它会通过中断通知我们再一个我们是不是通过轮询的方式啊,就是两种方式啊。那我们这其实最终采用的是一种轮询的方式,一会儿大家就能看到啊。好了。那所以接下来呢我们看一看他这是怎么去写这个接收方法的啊,来注意观察同学。首先看这儿,这是在干啥?同学这是在干啥?是不是在readbite呀?对吧,readbit是不是读一个字节呀,对吧?OK好readbite你正常情况下,你看它读的是谁啊?他直接是不是把这个status寄存器的地址给扔到这里边来了呀,对吧?其实说实话,它这个写法呢就不是很规范啊,规范的写法,这儿应该怎么着呢?应该是SPI后边该是谁?它这实际上是在读这个寄存器的值能力也开以吧?同学他应该是这么写,但是大家都知道SPIreadRED那个值是不是就是零啊,说零,你后边拼上这个地址,那是不是最终结果还是那个地址啊,对吧?这个status那个寄存器的地址啊,OK他读的是状态寄存器,为什么要读状态寄存器呢?各位同学是不是状态寄存器里边是有我这个发完一个包和收到一个包的,是不是那个那叫什么来着,是不是相当于是标志位的呀,对吧?哎,好,那我收到一个标包之后,那哪个标志位会置一,大家还记得不?我们找到status零s零六是吧,那零零七是吧,是不是RSDR,而这个是一个收到一个数据的一个标志为二,对吧?OK好,他其实是在读这一位啊。好了,那先来看一看,就是他首先他读了,读完之后呢,这儿是不是就拿到了这个state的值了呀,对吧?
好,拿到之后,他紧接着后边又往这里边干啥了,又往这堆干啥了,是不是又写了呀,对吧?写的目的是干啥呢?是清除这个RXDS终端标志位就是这个标志位不会手动清,不会那个它自动清除的,必须我们手动清除。哎,好了,那它这是在做清除操作。好,接下来我们往下走,注意啊,这它它它读完之后是不是这个状态寄存器的值,我们已经保存到咱们自己这个呃内存里边了呀,对吧?它清除是清除哪儿的,是清除,是不是那个芯片里边了呀,对吧?所以无关紧要啊。好了,接下来往下走,这边它要做的事就是干啥?唉,说白了,就是判断一下我们当前有没有收到数据吧,对吧,怎么判断,是不是就是让他捋一下那个掩码就行。RSDR的掩码零s四零是不是就可以直接定位到哪一位?是不是这一位是对吧?RSDR你可以算一算零s零零。是不是是正好定位到这一位呀,对吧?哎,好了,那这个完了之后,我们先发一到这边来。那如果这个东西语完之后,它不等于零同学,那就证明什么是不证明DXRSDR那那位是是一了呀,对吧?是一了,说明我收到数据了,收到数据之后,接下来咱们要做的应该是啥?是读是读非eo同同,是不是读读el,就说明我就可以读数据了呀,对吧?就这么个逻辑辑,那对吧?所以说你看这块怎么做的的fael是不是就得去调用readvice这个方法呀,对吧?那读fael大家要注意读fael,是不是得去先发一个指令,然后再接收数据,对吧?好,那读fafo是哪个指令了,也可以看到读做命令或者命令啊,是不是就是RD就是readRSKO的呀,对吧?说白了就是这个零x六幺嘛,零s六幺,你是实对应到手册上面,你也能找到,这是寄存器,咱们得找那个命令啊,找命令呃,找命令往前翻呃,是不是就是这个零s六吗?这是不是就是read那个配漏的呀,对吧?说白了就是readfafo啊。好了,那回过头来看,这这是不是就开始读了呀,对吧?那读完了之后,我接下来要干啥同西,哎,得手动的去清除一下这个RSfafo也得手动的清除再行,它不会自动清除啊,好,手动清除。那它怎么清除的,是不是RXright的一个bit呀,对吧?把谁是不是发了一个指令,后边跟那一个数据啊,对吧?是不是就是flashRX显然它的作用我们就看名字就能看出来,是不是就是清除,是不是那个RS那个fafo啊,对吧?那这个东西你看它的手册已经对应上了,咱们就不看了。好了。那这个完了之后啊,return了一个零,说白了,就是告诉啥告诉呃,是不是那个方法的调用者,如果是零的话,那就说明你收到数据了。如果是一的话呢,是不是就说明没收到数据啊?因为我你想啊,就是我某次调用这个方法的时候,某一次我调用这个方法的时候,我读到的这个状态里边的这个标志位是不是可能没质疑啊,没质疑,是不是就是没数据没数据,它会给你返回一个一有数据会返回零返回零的话,你就去读,你给他传进来。那个是不是八份指针就可以啊,对吧?就这么一个思路啊OK好,所以这个方法其实将来咱们需要循环不断的去调用的吧,这也是轮询的方式,咱没有用中断的方式啊,这个大家注意一下就行了。好,那现在怎么去收一个包,咱就已经掌握了,对吧?哎,好,接下来往下走,再看怎么发一个包啊,好,发一个包,其实跟它的思路差不太多啊,发我们其实不用管那么多,不用管它怎么打包,怎么发送,我们只需要认准一点就行。往那个是不是发送寄存器里呃,不是那个发发送的那个那个那叫缓缓缓冲区里,对吧?那个非负里写是不是就行了,对吧?你写到那里,它自动的就发送了,就这么个逻好,来看一看他这是怎么做的啊。首先你看这儿上来之后,是不是就干这个事儿了,是不是就是rightbiice,然后WRTSpayload,这个明显是什么命令,是不是就是发送那个要附带的一命令令。
对吧?零XA零这个就会把数据怎么着呢?把你这个八份给他写到哪儿,是不是写到那个fafo里边啊?对吧哎,然后这块儿注意观察一下,同学这里边呢是有一个啥的,是有一个这个要写的数据的长度的对吧?因为咱们这个方法这是不是得传一个长度啊,对吧?我这个长度是目前咱们是固定的三十二个字节,到时候需要改的话,咱们再改啊。行了。那这个是不是就完事了呀,对吧?呃,但是这个完事之后,它并没有直接就返回这个这个这个方法没有直接返回啊,他他干啥了呢?他会在这儿等你看它原来的含义是什么啊?他这会怎么着,会会等会等谁会等IRQ这个引角是不是变为变,为什么?第一吧,它等等于零是在等它变成零吧。啥意思?是不是如果等于一,我我就一直外绕循环吗?是不是等于零,我就会退出这个循环呀?是不是就是它是在等这个IRQ眼角拉低前面讲过是不是怎么着呢?是不是我们那边发中断了之后,那个呃这个是第电电平,为它会把这个引角拉低啊,他是在等这个事儿啊。好,那他具体等的是什么?说的是等待发送完成,因为咱们前面讲过,就是我一个包,我现呃看看咱们看哪儿啊,就就不用看了,就回顾就行啊。我们发送的流程是怎么着呢呢?这芯芯片首先会把这个包怎着呢呢?不是通过咱们这个天线发送出去啊,对吧?发送出去之后,这个芯片是不是会会行行个所谓的的等啊,对吧?停下来等待谁ACK的到来?OK好ACK来了之后,是不是这个包,它才算是发送完了呀,对吧?哎,这才叫发送完成啊。OK好了,那完了之后需要给大家说明的一点就是啊呃这个收到ACK之后,就是这个收芯片啊,咱们这个芯片收到ACK之后啊,它实际上会怎么着呢?是不是也会产生一个发送完成的中断。这个大家还记得吧?呃,你要忘了的话,你就看一下这个这个这个东西,看他那个发送的流程啊,应该是在在这儿吧,在这儿,你看这是发送,对不对?哎,这个是他接收方,对不对?你看发送方是不是在收到ACK之后会怎么着会产生一个TXDS中断呀,对吧?哎,是这样的啊。ok好,那实际上他这这个等就是在等啥,是不是在等那个TXDS中断呀,对吧?其实在等那个但实际上大家要知道的是,他这最终一直等等等等等等。来的可能并不是那个中断,他还可能等等来另外一个中断。大家猜他应该是哪个?我发送了一个包,我一直在这儿,等我等来的,可能是另外一个终端,可能是哪个终端,是不是maxRT那个终断,也可能是它它会等到这个终断吧,能理解这个儿吧。同同学这啥意呢?我我这边一一等等ACK但是我一直等不着。按照前面的分析析,一直等不着的话,它这块儿就会是不是自动重试啊,对吧?那自动重试一直重试一中式,但是是不是最终会有一个最大的重试次数啊,对吧?超过最大重试次数之后,是不是就不再重试了,然后会发起一个什么中断来着?maxRT最大的重试嘛,retry嘛,对不对?能想起来吧,同学,所以它这最终等等等等。来的可能是俩中断啊,所以你看一看同学呃,这儿如果说变成零了,也就说白了中断是不是来了呀,对吧?来了之后呢,它这就怎么着了?对,不是读了一下这个状态寄存器啊,对吧?读完之后是不是立即又清除这里边的那个标志位了呀呀,对吧?你看它清除的时候是不是可能会清除,它也可能清除。那这个中断啊,对吧?你就不用管。然后呢,你看下边是不是人做判断了?如果哎maxRT置位了,对吧?超过最大重事事事了了,是超出了个个状重次次器啊,对,直接return一个什么maxRT呃,说明我这个是没有发送成功嘛,对不对?好了,那完了之后,如如果state里边的TSDS这个标志位置位的说明什么?说明我是不是发送成功了呀,对吧?哎,然后如果这俩情况都不满足,那直接它就定义成发送失败了,这是不是它目前的一个核心的逻辑啊,对不对?
OK好了,那这个大家应该能看明白啊,然后咱这儿呢就不能用这种方式了。我们这种方式不行啊,因为它这个引角确实工作的不稳定,所以咱就不去看这个引角,咱也不读这个引角了,咱直接怎么着了,同学咱直接怎么着,我们直接去读它的这个寄存器行不行,我一直循环不断的去除它的一个寄存器,直到这个寄存器里边的这一位之一了,或者是这一位之一了,那是不是也就相当于是等到这个中断了呀,是是这个意思吧?同学,所以只就咱们绕开它这个坏的眼角啊,咱就不用它,咱直接给他去了。好,那所以我这儿应该怎么写这个事儿呢?同学,咱这应该怎么写这个事儿呢?等待发送完成啊,循环的咱们这样做啊,注意观察呃,我这儿直接这么写啊,我就直接来个循环wellwell啥呢?well呃,咱们就直接去,我想想啊这个人怎么着?呃,他这儿是不是声明了一个死代变量,对吧?呃,state,我初始时我给它一个零啊CD零默认都是零啊,假设都是零。好,那完了之后,我这边我这么写啊,你看我直接死state,我让它怎么着呢?
与上一下,就是我等等来的,可能我这标标注其中的任任一个置位,对不对?所以我得语上一下谁呢?一个是maxRT,还有一个是谁呢?我再或一个啊,或上谁或上那个TX是不是DX啊,对吧?ok好,那我与它俩,如果这俩东西我与完之后,我为了确保它没问题,我加个啥加个括号吧,哎,确保优先级没问题啊。好,与完之后,如果等等于零x零零。ok好,那我就怎么着呢?我就让他再去读咱们的这个计时器,大家看能不能看明白啊,读状态寄存器的值。你看我这个逻辑啊,唉,你看是不是这么回事啊,你看初始值是零吗?都对吧?哎,好了,那完了之后,我第一次来这儿的时候,我俩我跟他俩语完之后,最终结果是不是一定是零啊,对吧?是零好,那我现在是不是就会读这个状态寄存器啊,对吧?如完之后,是不是立即又会跟它去进行行啊,对吧?如果读完之后还是全是是全都没有置位,这俩都没置位,都没置位的话,语完之后是不是还是等于零啊,对吧?直到什么时候就不等于零了呢?它俩其中的是不是任意一个置位了,就不等于零,不等于零。我这个循环是不是就推出去了呀,对吧?这是不是也是等到了这俩中断的某一个发程啊,唉,跟它是一样的思路啊,只不过就是咱避开了那个呃就是有问题的引脚啊,行了。
唉,那这样一来的话,咱这个就算是搞定了。哎,搞定了。好,那如后咱借这这个同学,我们稍微的规范一下,就是咱们当前的这个也不是规范嘛,咱们简化一下吧。
就是你看啊,他这个收一个包收一个包啊,它的返回值是不是零表示收到了一表示没收到啊,对吧?所以我这这个返回值呢,我也稍微的简单一点,我就别给它整这么这么麻烦了,咱不分这么多什么之到,除除了次数发送失败还是什么?发送失败发生,咱们就就俩要么成功,要么失败,对吧?一样跟前面一样也是零,咱就是发送成功。
一,我就表示它发送失败能理解零是吧吧?同学咱跟这个保持一致啊,所以咱这改一改呗,呃,应该怎么着?
这个是不是发送成功了?TXDS这是发送成功了,对吧?这个我们就return一个零。那这块呢就直接returtain一个一,这个呢也是不是让它retain一个一就行了呀,对吧?哎,好了,那这样一来的话,咱这个驱动就算是改造完毕了,改造完毕了啊。
来,现在呢我再重新编译一下,看有没有问题,行,没问题,搞定了啊,同学哎,好了,那这个完了之后呢,我们呃就完成了这个所谓的SI二四二幺这个驱动的移植了啊,刚才有同学问啊,就这个东西你要自己写呃,这个行不行呢?也行,就是太说呢,你你你就不能像咱们前面那样粗读这个他的手册了,你就得细读精读它那个手册了,你得知道我这个设这些模式,我到底要配哪个寄存器?我以后是不是每个寄存器你都得看一遍啊,对吧?太麻烦了,这个咱就咱就不手写了啊。OK我停一下视频。
13-无人机-飞控项目-通信任务-SI24R1-初始化函数
cpp
复制代码
呃,好了,各位同学,那接下来呢我们就准备去做一下这个相关的测试。但是在测试之前呢,咱这儿需要这样的东西,我们需要我们需要提供一个初始化的方法,对吧?你想啊同学,我一会儿不管是接收方还是这个发送方,我再去呃接收数据或者发送出之前,我是不是必须得设置当前的工作模式啊,对吧?接收方我得设置为接收模式,我发送方是不是得设成发送发送模式啊,对吧?所以咱这儿呢需要给他们提供一个enet方法啊,来我们在这边呢提供一个word,咱叫做INT后边SI二四r幺后边来一个enet。没错啊,同学这个e的方法将来咱是不是要暴露到其他的方法里边被调用啊,对吧?所以我们最好在头文件里边给它怎么着呢?添加一个这个声明右键,然后创建声明这边是不是就有了呀,对吧?哎,好,那我们再回头来看这边啊。好,那在这边我们看一看,咱应该写什么同学。呃,对于咱们当前我是不是neflat项目我fat我要做的其实就是啥呢?是不是就是设置为什么接收模式吧,没错吧,同学你要设置接收模式直接调什么就行?是不是直接调我们上面的这个INTFA二四r幺i呃,i呃,这叫什么呀?RSmode是不就完事了呀,对吧?就行了。哎,但是各位啊,但是各位这个经过我们的实际测试了,就发现这个芯片它有点坑啊,就是它上电之后啊,你看你看我们稍微等一等同学,就是他这个工作模式,他上电之后,他不是说立即就会就就就就能怎么着了,不是说立即就可以用了啊,他这块是不是需要过一段时间之后,是不是才会才才能够进入到这个所谓的关断模式啊,对吧?那呃然后呢,所以说你如果说按照我们目前的逻辑,我这个上来之后,直接就调这个函数,那就可能会出现就是你设置的这些东西,他根本就没收到。因为你这个往寄存里边寄存器里边写东西嘛,对吧?可能没收到,就可能会出现初始化失败的一个情况。所以咱这最好怎么着呢?我们要不就延个时呃,或者说我们这儿呢做一个什么呢?做一个自检,咱们做一个自自我检查,我检查查通过之后,我再去设这个个查查,通过表明明已已经这个确确确认这个芯片能够正常工作了。然后咱们再进入下一个环节,大家能理解这个道理吧。哎,好,所以这边呢咱们应该怎么着呢?等待等待自检成功。好OK好,所以接下来咱们要做的工作,就是在这个地方呢,咱们去呃做一个所谓的自检操作。那自检怎么自检呢?自检其实很简单,举个例子,它是不是有很多寄存器嘛,对吧?哎,我就随便找个寄存器,我往里边写入一部分数据,我再读出来。如果我写进去呢,跟我读出来的是完全一样的那是不是就证明这个芯片已经能够正常工作了呀,对吧?哎,我就做这么一个测试啊,好,确保它没问题了。完了之后,咱是不是再进入到这个下边的接收模式就行了呀,对吧?
呃,设置个接收模式就是这么一个意思啊。呃,所以接下来我这样我写一个静态方法,咱们就叫static法,呃,就给咱们当前的这个用啊,static后边呢我就叫做呃,那你自检成功了,还是失败了,理论上是不是得有一个返回值啊,同学对吧?所以咱这样呃为了方便,我们后边的很多方法都有类似这样的返回值,就是成功或者失败。我们在这儿呢咱定义一个通用的类型,我们进到comtypes啊,这边注意观察我定一个枚举类型吧,咱们就叫做type看。后边呢我叫一decom,然后后边呢我里边写一下东西,先写名字,我这个呢就叫comSTATUSstatus没问题吧,同学然后里边呢我就给它定义俩值,一个是OK,一个是iver能能理解这个事儿吧。同学哎,咱们就定义一下啊。好,这是一个通用的类型啊OK后边我们经常会用这个类型啊。好了,所以接下来咱这样,我们回到这个呃这边来困乱同学精神精神啊,接错神了。呃,我includede下啊,那需要把这个COM是不是给它引进来?COM后边来一个。TYPE呃点呃,typec吧,是不是点上,对吧?哎,好了,那看能不能过去能过来啊。行了,那接下来回到我们这个这个c文件里,我这个自检方法它的返回值,我是不是就可以用刚才那个comstatus来,对吧?好,那完了之后呢,我写一下我当前的这个函数的名字啊,呃我这个名字我想想我叫啥呢?我就叫做INT后边SI这个二大写的啊,二四r幺后边呢我就叫做SELFCHECK呃,是不是就是staatcheck啊,对吧?哎,好了,那完了之后呢,我们就开始写一下这个逻辑啊。呃,前面逻辑其实很简单,你就随便找一个寄存器往里边写,写完之后读出来读出来之后,你写的跟你读的呃,是一样的那就证明已经能够正常工作了,对吧?好,那现在我们来看看怎么去写这个事儿呢,咱们就随便找个寄存器啊,随便找一个。呃,比如举例子,你像我们再去设置咱的这个发送模式也好,接收模式也好的时候,它是不是会往这个寄存器里边就是那个发送地址寄存器吧,是不是会写这个地址啊?对吧?好,那我接下来呢我就写这个好,这直接拿过来,哎,我就写一下这个大家看看这个有没有问题,没问题吧。呃,这个是不是就是往随便找了一个寄存器嘛,这是咱那个发送地址寄存器往里边是不是写入了我们这个地址了呀,对吧?哎,好,写进去完了之后呢,咱们别的不干再给它读出来,你再给它读出来,读的话,是不是咱们得调那个INT后边跟上一个啥SI是不是二四r幺后边跟上一个,这回得readbite了吧,对不对?readbite,那你要是readbite的话,同学你想想我们这个里边应该怎么写,怎么写,这个readwisreadbest,那是不是首先得发一个地址啊,对吧?这个地址应该是s呃,得发一个命令,对吧?一个命令应该是SPI后边跟是谁?该read是不是那个REG了呀,对吧?哎,再拼上传你上是不是这个寄存器的地址TSADDR是不是应该是这个呀,对吧?那能能理解解同同学好,后边接下来我们要做的,你是不是得去找一个地方去接收一下这个这个值。你看咱们传它,这是传命令这个第二一个是不是那个收收的什么西,是不是那个缓缓冲区啊?对吧吧这是是你读的长度。所以接下来呢我们还得再定义一个什么东西定一个bufer啊。所以这边呢我们就来一个uint后边八t后边我来一个呃应该是RXBUFFER是不是就是接收的一个缓存呀,对吧?好,那这个长度给多少呢?长度咱们写是不是写了这么多,这是那个长度吧啊,因为因为这这就是随便找了个东西,写了个地址嘛,对吧?好,那我我我我我我我接收的话,是不是长度也是这么多呀,对吧?好,拿过来完了之后呢,咱是不是把这个controlc放在这儿就行了。好,那这样一来他是不是就会把读到的内容写到我的这个八份里啊,对吧?
好,那接下来我要做的事儿,是不是就是比较这个八份和谁和是不是上边的这个数组里边的值是否一样啊,对吧?一样的话,那就证明它已经是不是工作成功呃,正正常工作了呀,对吧?哎,好,那现在来写一下啊,所以这边咱怎么比较呢?这是俩数组俩数组,我是不是来来份循环呀,对吧?所以份那后边呢,我们我看他写对不对,还还挺对,这个逻辑挺对吧?哎,II等于零i小,于是不是咱们那个长度啊,对不对?然后i加加比较LS八分,里边的和TSADL里边是不是一样的对吧?一样的,如果不一样不一样,是不是直接就returnerr了,对吧?那如果一样呢,如果我这一轮循环下来之后,没发现不一样的,没发现不一样,是不是都一样都一样的话,那说明什么了,是不是已经哎,工作正常了呀,对吧?大家能理解我这个逻辑吧。哎,OK啊,其实整体来哎,不是很难啊,哎,在这儿是不是不是很难对吧?哎,好了,那这就是咱这儿的一个所谓的自检的一个逻辑啊。好了,那接下来我们回到下边这个初始化这边来,那咱这儿是不是得等它自检成功啊,对不对?所以我这儿应该怎么着同学呃,他又给我提示出来了,你就这么写就行。你看啊我这儿怎么写的?如果我调用这个stellcheckcheck,等于comOK不等于看嘛OK说明什么?是不是说明自检失败了呀,对吧?失败了,说明我这儿这个芯片还不能正常工作。好,所以我这儿怎么着呢?我等会儿我等会儿之后呢,我再去做一次自检,对不对?ok好,如果还不成功,那我再等会儿再做一次。好,直到他这OK了,是不是这个循环就退出来呀?那我是不是就自检成功了?大家能理解这个事儿吧。哎,好了啊OK那这实际上呢就是咱们这所提到的一个呃所谓的一个初始化的逻辑辑啊,现在呢就给他写完了,大家能能理白这个逻辑吧吧。好了啊,来停一下这个视频。
14-无人机-飞控项目-通信任务-SI24R1-接收数据测试程序
cpp
复制代码
对呃,好了,各位,那现在这个驱动我们基本上就准备好了,准备好之后,我们接下来准备开始编写这个测试的逻辑啊,呃这个测试的逻辑咱怎么着呢?呃,咱是不是得给这个通讯也创建一个单独的任务啊,大家还记得吧,来看这张图啊,在这儿你看通讯任务,咱是不是有一个单独的任务,对吧?哎,好了,那然后需要大家注意的一点就是啊这个通讯任务,我们首先要做的应该就是先接收到遥控那边发过来的数据,但是收到数据之后,我是不是需要做一系列的这个处理啊,对吧?那具体做什么处理,我们现在先不用管,咱们先把这个数据收到就可以啊。行,那接下来呢我们先把这个通讯任务给它创建出来,然后呢去写一下这个接收的这个大致的一个逻辑啊,来吧,需要创建一个新的任务了。好,word后边呢我们就声明我先写注释吧,这个应该是什么?应该是通讯任务。哎,好,那接下来往下走,呃,它叫做communicationtask,对吧?也就是一个简简称COM也行,就这样吧啊来往下走,这是名字。这个呢是它的这个stackp,这个我们也给大点同学,这个你其实你能够发现啊,就是呃咱也是double吧。呃,来你注意观察一下,你看在这个是不是所谓的通讯任务里边,咱们要执行的逻辑其实也挺多的,对吧?哎,所以这个占用占空间也要大一点。所以这个我们也给大点啊,给个二五六啊。好,接着往下走。下边呢,是不是就是到了它的这个优先级了呀,同学这个通讯任务的优先级,大家说重重要不重要,也挺重要的。这个我们给到最高优求级,咱们给四啊,好,接着往下走,下边是不是得给他声明一个这个呃handle啊,对吧?好,接下来往下进行下边是不是也得声明一下这个任务的执行周期。因为我们现在是不是采用的是轮询的方式啊,同学对吧?轮询你是不是得一直实时不断的去读它这个数据啊,对吧?
那所以这边呢我们也要有一个周期,这个也给给四百,我们和谁和这个非空任务,咱们这保持一致就行啊。好,说白了,就是我收到一个数据,那基本上我收到指令,我就去设置电机速度,收到指令设置电机速差不多是应该是一个平衡的一个状态,对吧?哎,好,那就这么着啊,行了,下边我们去把这个通讯任务给它创建出来呃,来呃,创建通讯是不是任务啊,对吧?哎,好了,那接下来呢我们让它给直接生成吧,xactst。好,那这个咱就搞定了啊,下边咱们要做两件事啊。首先第一个是不是得实现一下,就是这个通讯任务的逻辑啊,对吧?这是一个第二一个是什么呢?不要忘记初初始的同学,这个你要不处不初始化的话,它是不是执行不了啊,对吧?哎,所以这块一定要注意啊,这块儿应该是初始化。哎,好,接下来那个SI是不是二四r幺啊,对吧?哎,好了,那当然你要调它的方法,我们需要先引入它的头件啊,这个引线啊,来咱们ininclude后边跟上一个INCLU好,后边跟成一个INT哎,后边i呃SI二四r幺h。好,这个搞定啊。好了,那这个完了之后,我们回过头来去写这个初始化的逻辑啊,应该是在这儿吧。调用INT后边SI二四二幺inmeit。哎,这样一来是不是就完事儿了?同学哎,好,接下来我们只是下最后一步了啊,下边咱要做的是不是就是实现它的这个呃所谓的接收数据的这个逻辑了呀,对吧?哎,因为我们采用的是轮询的方式啊,所以里边咱应该还是啥,还是v二一还是v二一啊,v二一完了之后呢,我们把这个拿回来周期性的执行嘛,所以先获取一下执行前的时间。完了之后呢,我是不是采用这种绝对延时的方式,对吧?延迟这么长时间,这个写谁?这个咱那个名字应该叫做COOM是不是POR的呀,对吧?
COMM对吧?POR的应该是这个啊行了,那这个给的值是四,对不对?行了,那这里正常情况下,咱是不是就要去接收数据了呀,对吧?首先接收数据完了之后,后边是不是还得处理数据啊,对吧?处理数据咱们就todo了啊。ok处理数据啊行了,后边再说啊。行,那现在我们看这个接收数据,逻辑应该什么样了?接收数据其实很简单啊,同学接收数据怎么着?怎么接收数据是不是就是调INTE我们前面看到的这是不是有一个SI二四r幺RXpackage啊,对吧?呃,还记得吧?PACK呃的对吧?是不是就是这个方法,这就是用来去接受数据的嘛,对不对?好,但是这个方法它是不是可能能读到数据,也可能读不到数据啊,对吧?哎,所以这块呢我们是需要去做判断的啊。当然你数据读的话,你你给它读出来,你给它放哪了?同学你多来放点儿,是不是人,这需需要你给传传上一个八份一个指针呀,对吧?所以这边咱们声明一个八份啊,这个八份我就声明在外边吧。那这这个不用每轮循环都声明吧,咱们用一个就行啊。所以在这边呢,我们来个啥妖艳塔三十二packagd呃UUint八t啊,八t八TU呃INT对吧?UNT后面我们来一个这个呃几t呃八t对不对啊?
八t完了之后呢,我们这儿呢就叫做RXBUFFER。好,那问一下大家,我这个长度我儿应该给多少,咱这个长度给多少。其实咱们目前的方式啊,你看就是我们不管是收数据还是发数据啊,来吧,那我们来看一看,他这都是怎么着的。咱们先看那个发吧,这是RX排开值,你看发数据发数据的话,他直接是不是往那个非负里边写了多少,是不是就写了这么宽呀,是不是写了三十二个呀,对吧?所以说我们现在是定常发送数据啊,目目前都是最最最长的长度,一个三十二位的。所以这个发法呢,我们这儿就给一个三十二,就给个三十二啊。好了,那完了之后呢,这个三十二拿过来之后呢,咱把它放进来,是不是就完事儿了?同学好了,那完了之后注意这个方法是不是有返回值?呃,还记得吧,它如果是零的话,就是说明有数据一的话,就是没数据啊。所以我们这儿呢就需要去做一个这个判断啊,咱那不干别的就打印一下就行。收到之后打印一下就行啊。所以这儿来一个溢出判断啊,如果这个东西它等等于几零,那就证明我收到数据了。
那这个时候我就干啥,我不干别的,我就把咱们这个值给它打印出来PRNTF对吧?好,然后呢,我们这来一个啥,我就来一个receive。RECEIVEreceivereceive什么呢?呃,咱们来一个百分号s反斜杠,呃,是不是把上面的东西给它拿出来就行了,对吧?呃,然后呢把谁放进来?RX是不是buffer?哎,大家能看明白我这个逻辑吧。哎,就是我循环不断的去收数据。好,收到之后,我就给它打印出来,就是这个意思。哎,好了,那也就是说我们现在收的逻辑至此是不是就算是完成了同学哎,搞定啊搞定。那现在呢我把这个视频给它停一下啊。
15-无人机-遥控项目-通信任务&电源任务-移植和测试
cpp
复制代码
呃,好了,各位啊,那接下来呢我们进入下边一个环节,我现在呢是不是已经完成了这个flag这端了呀,对吧?接下来咱是不是就得进到遥控端,咱们在遥控那边是不是也得去写上这个就是呃FLS二幺的这个驱动完了之后呢,两边是不是才能通信呀,对吧?好,接下来咱们进入到remote这段大家坚持一下,我们把这个remote这边咱们两边测完之后,今天的内容就结束了啊,来吧?来我们找一找这个remote这个remote,我之前是不是就已经创建好了一个项目了?对不对?那之前这儿应该是完成了啥完成了呃,RTOS集成了吧,对不对的集成啊?好,那现在我们把这个项目给它打开,大家稍等一下啊。呃这个没有咱们全关了啊,全部关闭。呃,行,那回忆一下啊,当时咱们这个应该是呃都配的什么东西了?当时应该就是福瑞flarQS已经有了,然后还有谁有了?呃,那个那个串口是不是配了一下,但是串口当时咱们是不是配的是串口二啊,对吧?
但是remote遥控这端呢,它实际上一会儿咱们看原理都能看着配的是串口一,所以这个咱们还得改啊。OK然后呢,我们再来看一看这里边呃我们主程序那边我们看看写到什么程度了,大家也得看一下主程序里边这个右览码我们改一下,应该是JBK啊呃主程序这边是不是还是咱之前那个测试程序的呀,对不对?这个我们是不是还没写那个什么task那个那个文件的呀,对吧?所以这些东西大家记得一会儿你要是移植的话,都得移植过来都得改啊。好,那现在咱们就从头开始改起啊。好,我们先梳理一下啊,这个这个系统,我们目前需要做什么操作?就是关于咱们这个遥控这块啊。呃,首先你要是移植那个SI二四二幺驱动的话,是不是得配SPI得配那个CE还有CS眼角对不对?
这是咱们需要配的。然后串口我刚才说了,这个遥控这个板子上用的是谁,是不是用的,是那个串口一样,串口一样,对吧?就这个咱得改,还有谁得改一下呢?电源对电源这个电源任务跟咱们那块那个电源源是一样的逻辑,它也是会自动进入低功耗模式啊,所以我们这儿是不是也得搞一个电源任务实时的去怎么着的,给他唤醒,能理解这个事吧。
同学也就是说我们现在要做的工作应该是哪些呢?咱们看这张图。同学看这张,我把这个先关了啊,它这个好像是只能打开一个还是怎么着的。好,各位观察同学,咱现在要做的工作应该是哪部分呢?通讯任务是不是一会儿咱们得完成,对吧?哎,完了之后,当然这个通讯任务呢,我们这个分两两部分,一个是打包数据,一个是发送数据,我们现在数据打包打不了,因为是不是遥杆按键,我们都没没做呢呀,对吧?所以我们现在先随便发送一下测试数据就行啊。好,能够发出去就行。除了这个之外呢,还有谁是不是我们这还有一个电源任务需要去做呀,是不是就是这些同学?哎,好了,就这些,那像这个显示任务,包括这个遥杆按键扫描任务,明天再做了。哎,咱们今天先不做了。哎,好,那接下来呢我们往下进行下边,咱们去做,先做这个通讯任务啊,通讯和电源吧,咱们一起做吧,这个直接这个是不就行了,对吧?来吧,那现在咱们开始去做相关的配置啊。呃,当然配置的话呢,我需要先打开咱这个项目的,先打开这个项目的啥呀?
同学呃,先打开这个项目的这个这个这个elo的文件,对吧?咱们给他打开大家稍等一下啊,稍等一下,稍等一下稍等一。哎,好了,那打开它的同时,因为我们要做各种配置,所以咱是不是得对照着谁去看呃,得对照那个原理图吧,来我们找到原理图啊,原理图找到这回得找那个是不是手柄的呀,对吧?一就是遥控啊,点开它呃,点开它之后呢,首先我们先去改一下那个串口啊,你看像这个串口,它这回用的谁啊?我们还是找那个就是STlink的插头,注意观察这回是不是用的UU三二零一啊,对吧?UU二t一对吧?
所以这个咱们先改个它啊,来我们找到这个已经打开了啊,找到connectivity找到这儿,是不是这个二,咱们就可以直接给它disable了呀,对吧?然后一给它放开这个呢,我们找到呃异步就行啊,其他不用配这些东西,咱们都是默认值就可以了。行,这个就搞定了,串口搞定了,串口搞定之后,我们再来看看,还有谁需要去处理一下啊。同学呃,首先是不是就是电源呀,电源电源那块,咱们需要配置的东西,是不是只有一个GPI眼角这个没问题吧。唉,来我们看一下啊,它这个电源芯片用的是哪个个角角,注意意是是个个源源,对吧?电源这块呢它用的是不是也是IP五三零五t。然后我们注意观察一下它那个引角啊,那个引角应该找那个按键呃,注意按键,也就在这呢powerkpowerk来往这边看powerk是不是PB十五啊,对吧?
所以这边呢咱们就直接用这个PB十五给它配一下就行。找到PB十五的GPIO来搜一下PB然后后边呢十五啊,应该是这个这个咱还是给它配置成GPIOoutput啊。好了,然后呢找到systemcoreGPIO找到这个咱跟之前最好保持一样的命名同学POWER这样有啥好处呢?好处是不是就是我一会代码直接拿过去就能用啊,对吧?这个尽量保持一致。好了,那这个完事儿完了之后,我们来看一下,就是咱这个输出模式应该怎么怎么着,还记得不同学得模拟那个按键的状态吧。哎,首先我应该让它使用一个开漏模式,并且默认值应该是高,也就是默认它是断开的状态,然后我拉低是不是置为一零之后,它就相当于按压呀,对吧?看一样的逻辑啊。好,这个注意好,电源任务的相关参数,咱们就配好了。好,还得配谁?是不是咱们一并把那个就是通讯任务的给它配好了,对吧?通讯任务咱们找SI二四二幺二点四g通讯啊,来我先缩小一下,应该就是这个吧。这个这会儿咱们要配的内容是不是应该是这些对吧?可以看到他这儿使用的是这些,我一下吧,咱们照着看就行了啊。好,先配SPISPI它用的是不是也是SPI一啊,对吧?来我们找一下connectivt找到SPI一,这个还是直接全程工就行啊?master好,然后首先需要咱们改的就是谁parameeter里边的是不是这个预分频器啊,对吧?这个我们还是给它改成八就行啊,然后呢速度是九啊,九兆每秒啊。好了,行,这个就搞搞定了啊,搞定之后一定要注意,也要检查一下GPIO的眼角来,这回,你看它是不是就不一样了,对吧?
默认用的是五六七这三个眼角。但实际上咱们这儿用的是谁?是PB三四五吧,这个是PA五六七,这不一样,所以得改一下啊,怎么改东西很简单,这仨不用不用一个改,咱们只要改一个,它一组就一块儿改了啊,你就找PB三四五里边随便,这是PB三,对不对?点点完之后,你看这是不是有一个SPIE的选项啊,对吧?来点点完是这一组,是不是就都切回来了?对对,直接就过来了。行了,那这个就过了啊,同学那完了之后,我们是不是还得再配两个眼角,一个是呃CE,一个是CS了,对吧?好,我们一个配啊,先配CE的,应该是PB七PB七是不是?正好在这儿呢,对吧?点这个应该是output对吧?CE的我们找一下TPIO来这个还是改成跟之前一样的名字啊,叫做SI二四r幺,后边我们来一个啥,呃,这是CE嘛,所以我们就叫CE,最好跟之前一样啊,省得改啊,这个就搞定了。
完了之后,我们看一下它的输出模式开漏呃,这个这个这个推板输出没问题。然后呢,默认值默认值。因为是CECE默认我们给d吧,用的时候再给它拉高啊,就是这样的行,这个搞定。接下来我们看下一个同学下,应该就是ILQ我们还是不配啊,我们配这个下一个c呃CSCSPH五注意这块有的同学可能可能会直接就配了啊,正正好PPC跟那个班是不是三四五六就连着了呀,对吧?注意这个六栏没用六没用啊,六是不是那个LQ啊,对吧?咱们是PA十五,一定要注意PA十五,别配错了啊。PA十五啊,应该是在这儿呢,好点过来。这个呢我们应该给它配置成一个GPIO是不output啊,好吧,那这个名字还是跟之前一样SI二四r幺。好,这个呢我就叫CSCput啊。好了,那它的这个初始电瓶应该是高电平的就得啊。好了,那这样一来我们这个该改的是不是就都改完了呀?各位同学哎,好,那接下来呢我们genanuatecode大家稍等一下啊。嗯,好,已经完事儿了啊,完事之后,接接下来我们再回到这个remote项目里边来,哎,回到这里边来。那进来之后呢,当然这里边有很多东西是需要我们去重新调整的对吧?啊,来吧,那我们现在就开始进行变异,来哪需要改,咱们就改哪儿啊?首先这里边是不是有这么一大堆这个错误啊,对吧?这个错误来自于哪儿?是不是来自于IT点c这很明显是咱们之前是不是那个中断的问题啊?没错啊,同学这个中断我就还是采用咱们之前,我就是上午我给大家说那个方法啊,所以我现在直接怎么着就行,我现在其实是可以直接是不把这个删除了,对吧?
咱们直接删掉啊,好一会儿我再把那个脚本给它放进来,先删除就行。这个删了呃,断pensv直接删除。好,当然你现在删除之后,要想让他正常工作啊,大家一定一定要记得把谁给放开,这俩是不是得放开呀?你得把谁把人家福瑞二加s给你提供的时间是不是给它重命名,为咱们这俩这俩函数啊,对吧?一定要放开,要不然不生效啊,一定要入夜,切记,切记啊。好,我们再编译。哎,编译完之后,你会发现现儿又有一个错误,这是哪儿?是不是来自于USART这边是不是咱之前用的是二啊,对吧?现在我们改成一了,这个是不是改成一就行,所以又解决了一个错误啊。好,那现在我们再重新编译好,还有哪有问题?这回再有问题,应该就是是不是就是那个SPI相关的这个代码了呀,对吧?
哎,我们给它加入一下就行了啊,加入到这个资源包里就行了。来我们找到项目资源,找到application,找到user,找到,然后右键添加文件好一样的啊ccallSRC找到这个SPI好这个完事儿。然后呢库这边也得添加一下啊,走底下右键,然后添加文件,找到driver,找到这个,然后找到SRC找到刚才的SPI,对不对?应该是这个吧。哎,考添加进来了之后,我们再重新编译各位啊,大家稍等行,现在是不是就已经编译通过了呀,对吧?好了,那初始化的这个内容,咱们就做完了。接下来我们进入下一个环节,下边咱是不是就得该往这个里边去做各种各样的这个移所谓的移植操作了呀?对吧?就是复制了啊。好,那现在咱们先分析一下,我这都需要复制哪些内容?呃,咱们需要从flightpart这个里边从往那复制哪些内容?首先com里边是不是咱们有一个那个基础类型啊,对吧?这个咱得拿过去啊,还有这些程序INT里边得拿俩,一个是二点四g,一个是那个谁那个power吧,那个是不是这俩东西拿过去,二点四g还有这个power也拿。你像这个电机,还有这个LED是不是都不需要,对吧?好,还有是不是就是这个task了,就这些东西,我们把这些东西给它拿过去就行了。咱们一一个个来啊,先拿最简单的。比如说我先把这个com拿过来,直接拿整个com吧,右键咱们直接复制。那复制完了之后呢,回过头下来到remote,我就直接在根目录下边controlv就行了。现在是不是添加进来了呀,对吧?但是记得啊加进来之后,我们这儿得怎么着得手动的,是不是加一下这个资源啊,对吧?点击添加文件,然后呢普通文件夹,这个咱们这样先不添加了一会儿几个文件夹,我们一并添加,是不是也行啊,对吧?哎,好,那接来往下走,下一个,下边一个咱们要放的应该是谁?应该是INT里边的,是不是这两个呀,对吧?这样我先把整个四个都复制过去,然后咱们再删啊,好,拿过来放在这儿remote走。你好,然后呢,是不是LED,我们是不需要的对吧?直接delete掉,然后还有谁motor不需要直接delete掉,搞定好,还有谁是咱们需要的呀,是不是就是那个task了呀,对吧?
来,我们把这个task拿过来,哎,ccontrLC哎,拿过来,拿了之后呢,我们就直接也是放到这个remote下。好,拿过来吧。行了,那现在我们是不是该拿的都拿了呀,对吧?接下来咱这样啊,我们就统一的把这几个目录都给它添加进来。普通文件夹完了之后,你这可以同时选中多个按着control点。首先com得点,然后呢还有谁INT得点,然后呢,task是为点啊,对吧?就是这几个完了之后呢,我们添加上项目好了,那这几个是不是就都添加上了呀,对吧?都添加添加上都添加上之后,接下来有些东西咱是不是也要处理了呀,对吧?首先首先要处理的就是谁最核心的,千万别忘了同学,你先去改一下呗,先去砍一下这个是不是这个这个这个这慢点c啊,咱之前这个慢点c是不是根本就没去调用谁,根本是不是就没去调用咱们的那个那个freeRQSstart的那个方法呀,对吧?
刚拿过来的嘛,所以这个一定要重新拿着一定要调一下啊,所以这个咱们先把这改了。呃,首先我需要先引引入一个这个文件啊,来咱们引一下,我就直接include了啊,include谁应该是辅瑞rtos是不是后边跟着一个task点也上,对吧?这个一定要先记得啊,要不然你这个不行,你后边所有的测试都通过不了啊,这一定要注意,你像我们之前做测试的,你这个URtask是不是不需要了删除,那这个呃往下走,往下走,往下走往下走。那这个初始化测试是不是也就不要了呀,对吧?来直接给它去掉。那完了之后,在这调谁调福RRTStask,是不是start呀,对吧?一定要记得啊,一定要记得先在这儿啊。好,这儿改完了之后,我们接来继续往下进行,看看咱们还需要去改哪儿。呃,首先首先啊首先我们先从这个最开始的com开始吧,com里边大家是不是定义了很多跟这个非非控相关的呀。你像LED遥控状态,飞行状态电机结构体,这些是不是都不需要删除,只留一个这个commonstatus就行了啊。那当然这个GPL引入,咱也就不需要删除啊,就这个搞定这个搞定之后,接下来我们看哪看这个接口层啊,INT接口口层边边,我们看看需要改,哪power应该不用改吧。
同学power不用改,但是谁得改?二点四g这个得改一下。二点四g这个谁得改一下呢?
同学往下翻往下翻,只有一逆的方法需要改一下吧,对不对?刚才咱们那边是设置为什么方式了,接收这个咱点设置为发送模式,所以这个改成TSmode就行,没没没问题吧。同学,这我我改一下啊,应是设置为发发送模式行了,那这个是不是也就改完了,对不对?行,那完了之后,就只剩下这个task这边了,对吧?task这边咱们开始改啊,但是这边改的话东西也不少,好多东西都得改啊。呃,首先这几个全局变量还用吗?不用了,这个清楚多了LED也不需要电机,是不是咱也不需要,对吧?删除电源任务,咱是不是得留着灯控任务不要了,删除。哎,好,非控任务是不是也不需要了删除通信任务,是不是得留着?
对不对?好,接着往下走,那再往下看这个star的方法啊。那首先第一个初始化电机是不是不需要了删除?
那初始化FL二四二幺,这个得留着吧,哎,这个得留着啊,电源任务留着灯控任务删除,哎,删多了呃,上了一个多了一个空格啊。好,非控任务是不是也得删除,那通讯任务是不是得留着启动,要去留着好了,这个就完事了。接下来我们开始改下边啊,这个powertask是不是也是定期的去进行唤醒就行。这个不用动LEDtask直接删除delay,哎,fllighttask是不是直接删除,对吧?哎,搞定。哎,好,现在只剩下最后这个COOMtask,是不是那个通讯任务啊,对吧?这个得改啊,刚才那边是收,那咱这边就得怎么着了,就得发了啊,就得发了发。所以这边呢我们就也是循环的发送数据吧,咱们就循环发那边循环收。嗯,然后呢我们看看能不能通信上就行了啊,好,发送接收啊。好,然后这边呢我去处理一下这个事儿,看看怎着着啊。
那我这边呢咱就这样,呃,你要发送的话,调谁就行。同学是不是调用呃,INTSI二四二幺给咱们提供的那个API就行了,对吧?应该是INT后边跟上一个SI二三幺。应该叫做呃TX,是不是拍k的呀,对吧?这里边它需要我们给它放上一个啥,是不是放上一个八份啊,对吧?
哎,好了,那这个八份份一个r边对吧,是不是之前有一个RS啊,对吧?好,这再重新声明,一个TX八份,但是我这个TI八份里边,我给啥呢?来,我这就先随便给点数,是不是就可以啊,对吧?呃,我这儿就给个字符串吧,来我这直接来一个TX比如说八份后边我来一个啥呢?来一个零零,我等于啥呢?注意,哎,我这么写写个哎,写个h这个这这个没问题吧,同学学然我解析那边我就当成IC格码解析嘛,对吧?哎,好了,那我们就不用把这三十码解写啊,咱们就随便填几个就行吧,再来一个呀,来个hello,对吧?哎,对,没问题,好,接着往下走,接着写,哎,我不写了。呃,HE走,然后再来再来一个o哎,这是不是就hello就完事儿了呀,对吧?那它后边是不是还有这个二十多个这个空位啊,空位我不写了,不写它就当零了,能理解这个事吧。
同学哎,好了,那接下来我们往下进行下边,咱直接把它扔进来,放在这儿,是不是就OK了?各位同学,哎,这样一来,那咱们这个就算是处理完了。哎,接下来咱们编译一下,看能不能过啊,同学稍等啊,过不了,过不了的话,应该是有点问题啊,这个是不是因为我们这个task点h里边引的一些这个头文件啊,对吧?
不用的删除啊,这个没了,这个不要了。那你像这个mountain是不是也没了呀,对吧?删除这个team是不是也没有删除?哎,好了,那这样一来应该就干净了啊,我们再重新编一下,稍等稍等,哎,编译完成了。好了,同学。那至此呢,咱现在的这个呃发送方和接收方是不是就都完事了呀,对吧?然后接下来咱们就开始测试了啊。然后在测试之前,大家一定要注意一下啊。呃,大家那我我测的时候大家尽量先别测啊,为啥呢?因为是不是咱们这个可互互之间会有干扰扰,对吧?呃,然后我这儿看一下,我这儿目前的地址,还有我的这个信道啊。呃,这个得去哪看来着是不是咱们得进到INT二点四g进到这里边来啊,对吧?来注意观察,哎,这是我的地址。我刚才直接复制了俩地址是不肯定是一样的,对不对?完了之后呢,我这个信到我这儿用的是四十了,是吧?哎,好了,那所以接来呢我就开始了,大家尽量别跟我一样啊,要不然会影响咱这个测试啊。行,那现在我先把这个程序稍录一下。呃,我现在呢先把这个遥控的程序给它稍录进去,大家稍等一下啊呃遥控的这个程序呢,这边我们需要去先呃,我这儿我这已经编译了,对吧?那编译之后,我们我给他捎一下啊,走,哎,这个没没连上是吗?呃,对,就是咱这个遥控啊,在烧程序的时候,有时候它会出现就是识别。嗯啊ok出现这个问题,大家怎怎么处理一下这个事儿呢?呃,大家可以这样,就是你先给它开机,先开能力AR这个事吧。同学开了之后呢,完了之后呢,你你你再怎么着呢?你再给它插上,你再给它插上。ok好,这种情况下,我发正我测的话啊,就是这个基本上就能够识别到。如果还是不行的话,那就拔下来,然后呢然后给它关掉。呃,然后呢再开这个时候再给它插上这个大概率它就好了。这个确实有点问题啊,这个板子啊来我们我们我们再重新试一下再烧,哎,还是没行,是吗?
呃,那就有点儿那个有点打脸哈,来,我再重新烧一下。哎,我是不是没插了呀?我看啊线断了,这儿没插上,这个头没插上。我说这个怎么一直识别不到啊,呃再重新插一下啊。同学就是就是呃不过我这个现象确实这样。但是有的同学不知道你们测的时候有没有有没有遇到啊?就是他有可能会识别不到啊,识别不到的话,你就按照我刚才说那个操作就是拔了拔了之后呢,给它重启一下,然后再插电再开,在在通电的情况下,再插入这个这个烧录器,它它它它就行了啊,来吧,我再烧一下。然后你看还是这样,对吧?那我拔下来完之后呢,关了,然后再开,然后呢我再给它插上,然后呢我们再烧一下啊啊,就就就就可以了,对吧?哎,行,就是大家如果遇到这个问题也是这样啊,呃烧不进去,你就先拔下来,然后呢给它先关了,再打开呃开着电呃通电,然后再给它插插上,大概率就能够就能够烧进去了。行,我这个是不是只要一捎录进去,它现在应该就会就会开始实时的去发放数据了呀,对吧?你看我这个逻辑是不是我们这个任务只要一起来。呃,咱们看哪儿呢?看这个freetask点c看这是不是就一直循环不断的去发数据啊,对吧?哎OK好了,然后呢,是每四毫秒发一次,对吧?哎,行,那接下来呢我们再去烧一下那个无人机这端的这个程序啊,烧无人机这端呃来拿过来。呃,拿过来之后呢,接下来呢我们进入到另一个项目,这边这个没问题吧。各位同学来好,那接下来呢我们也是给它先编译一下。好,编译大家稍等。好,编译完成,编译完成之后,这儿有点问题啊,我们把这个问题先处理一下,这是咋的了?
这是啊没演那个STDIO点h,对吧?那引一下啊,当然其实这个不演好像也也能执行,对吧?但是最好咱们演一下。STDIO点h啊。好,重新编译,重新给它插录,呃,大家稍等一下啊,哎这个是不是已经完事儿了呀,对吧?哎,好了,这个完了之后呢,我们接下来往下进行走拟。好,那现在呢理论上,如果我这个遥控再给它发送出去,他是不应应该是能够收到的呀,对吧?好,那接下来我们打开串口看它打印的什么东西啊,打开呃,没有反应,对吧?
没反应,说明什么呢?是不是说明呃,也不是说不一定是没发,就反正是我没收到,对吧?你看我这写的这个逻辑啊,同学呃,看一下这儿啊,我这儿写的这个逻辑是什么呢?是如果收到了,我是不是才打印呀,没收到我是不是啥也不干呀?对吧哎,反正现在可是没收到,为啥没收到呢?哎,我这个哎,我这个遥控好像有点问题,你看我这个灭了,对不对?这说明什么?说不是没电了,说明说明休眠了,对吧?说明我刚才是不是咱那个电源任务没没起作用啊,对吧?应该是这个意思吧?同学哎,你你看现在是不是收到了,现现在我我receivehello吗?能看到吗?同学你看啊,我我我这个我再给他关了,关了,是不是就没了,对吧?我再打开打开,是不是就收到了呀?说明现在这个通讯是不是已经成了同学?呃,但是为什么我那个电源任务它不好使呢?通信现在是没问题的啊,我那个电源任务看看咋回事,咱们去咱们去瞅一眼,我们找一下那个remoteremote,这是remote吧。我这个电源任务为啥会有问题呢?createpowertask,然后往下走,这边儿是我的眼角射错了吗?PB这应该是呃GPLB对吧?然后十五我们去看一下,是不是?那为什么这个会PB十五,我们找一下啊,十五应该是呃,这边哎,这是谁?
这是一个二点四g通信,对吧?我们稍微调小一点,往往往下应该是这吧。powerk这个是PB十五没问题吧,各位同学没问题啊,那我这个为什么会断呢?我们来分析分下同学,大家一起来分析分析是咋回事儿?我这个任务起没起同学起了吧,创建电源任务是不是都写的挺好的呀,对吧?然后看上边哎呀,我怕一百二十八,然后这个三然后呢,这个是十秒一次,哎,这个不应该有问题吧。有没有大家说有没有可能是我这个任务一直没轮到执行呢,应该不应该不应该不应该呀。我们来分析分析啊呃我先把视频停一下吧,就是通信,现在咱是不是已经通了同学通信通了,我先把视频停一下啊。
16-无人机-遥控项目-电源任务-问题说明
cpp
复制代码
呃,来吧,那现在呢我们先引一个呃STDIOincludeSTIO点h,对不对?可以拿过来啊,拿过来之后呢,我们往下进,请各位呃呃,因为就是我这个方法正常情况下,哎,这是不是会呃十秒钟调用一次啊,对吧?哎,好,那我就让他每次调用的时候呢,我都怎么着?哎,我都让他去,是不是给咱们打印一句话呀,对吧?哎,这边呢比如说就是powertask。嗯,好,那完了之后,为了让这个效果明显一点,咱们就不等它十秒了,我现在先给它调小一点,我先给它调成一个一秒钟,是不是一秒打一次啊,对吧?呃,看他打不打啊,同学来走。你当然这个烧的话,我得烧到这个呃遥控这边了啊,同学然后无人机这个应该就没啥问题了啊,就剩这个遥控的电源了,咱们看它到底执没执行,没执行,咱们再找没执行的问题,执行的话,再找执行的问题啊,这个得一点来来,你稍录一下,没烧进去,没上去,又得重新启动一下啊,好启动,然后呢再给它插上,然后呢再再稍录一下,好,烧滤进去了,对吧?哎,好,那接下来咱们观察一下,就是它它这个partask可执行哎,执行没执行执行了,但是好像是只执行了一次,是不是啊?
按照我目前的逻辑,他是不应该是一秒钟执行一次啊,对吧?这个有可能是怎么回事儿呢?
但是有没有可能是因为这个热,因为它的优先级是比较高的,对不对?
同学,我们现在给他邮件是不是四啊,对吧?他是不是三呀?有没有可能就是说而且咱们这个执行的周期其实很长呃,很很呃周周期很短,频率很高,对不对?你说有没有可能是他把这个上面的任务的时间给抢占完了呢?有没有这种可能性呃,也不能完全排除,要不咱们试一下啊。
比如说我现在呢把这个通讯任务,它的这个period的我稍微的给它怎么着,我稍微的给它调是不是调高一点啊,对吧?啊,比如说举个例子,咱们极限一点,我直接给它乘个十。哎,那这样一来的话,是不是它释放的这个CPU的时间就多一点,它就应该有机会执行了呀,对吧?来如果可以的话,那就是这么回事了。那我们来试一下啊,来看一下。那你看是不是这回这个powerpass就能够正确的打印了,那就是这么回事了。也就是说咱这儿这个是不是通讯任务让他执行的这个这个这个什么呀?这个周期是不是有点太太短了呀,能能理解一下呗,也就是他发送数据的时间,可能需要的比较长啊,也就是说他有可能甚至出现了一个什么样的情况呢?就是说我这一波数据我还没发完呢,你这个延迟是不是就已经到了呀,是不是有可能有这种情况出现,对吧?出现了之后,是不是它这儿压儿就不会进入阻塞状态,它就压根儿就不会释放CPU。所以我上面这个任务就压根儿就没机会得到这个CPU执行啊,对吧?应该就是这么个逻辑啊,所这这边呢咱得得稍微的调一一下这策略略啊,呃咱这这怎么做可以呢?两种思路啊,同学一种就是你把这个频率呢你给它稍微的调高点。呃,比如说调成嗯确实太高也不太好。因为咱们这个数遥控的数据,你要是呃太慢的话,是不是我这相当于是我这个遥控我都我都推了。但是我那边是不是还没到数据呢呀,对吧?是不有这种可能性,所以这个也不太好。还有一种情况是怎么着呢?咱这样同学,我直接把这个玩意儿流算级,我给它调高了,我这个还是四。但我这个优先机给它整高点,你这个整高点的话,同学你想一想他是不是无论如何都会怎么着,都会进行时间片的轮选,大家想是不是这么回事儿,哎,应该是这个意思啊?
好了,那所以接下来咱们这儿试一下啊,呃我这样看看它行不行,看能不能打印啊。走,你大家稍等来看一下,这个效果依然是能够是不是打印的呀,对吧?哎,是啊,所以说说就是大家还是得就意意识到,就是他这个优先级之间的这样的一些关系啊,所以咱这样吧,我这个四我暂时就还留着这个四,然后这个任务的优先级,我给它调高点,大家能想明白这个事儿吧。哎,好,那这个呢我给个十啊。好,这这这个十秒这个还是回到原来的这个设置嘛,这个还是原来的设置。只不过这次就是咱们把电源任务的优先级是不给调高高一点啊,对吧?确保他你能有时间执行啊,确保他有时间执行,要不然的话,这个就这个就就就出大问题了,他们老老关机的可不行啊?对吧?来我们再重新的给它捎录一下啊,走你烧进去。好了,这个就过了啊。同学大家自己在测的时候呢,就是遇到类似奇怪的问题,也往这个方面想想,也想想,就是他是不是可能没没有得到执行的机会,对吧?哎,怎么测试呢?你就打印一句话,你看他打印不打印,这个一下就看出来了,对吧?很简单行,那接下来咱这样,我再去最后测一下咱们这个通讯,通讯应该是没问题,刚才已经测通了,对吧?
呃,来这边呢,我们看一看,我现在又连到哪儿了,我现在又连到了,咱们这个呃又连到了咱那边了啊,这边咱们重新重新重新测试一下啊,我现在又连到了咱那个无人机了,来看看这边,他这个能不能正常的接受数据啊,来这边进到flat这边,呃,我们再重新编译,重新捎录一下,让它自己重新重新。
那啥啊?重新开始执行。因为咱这个没有复位按键啊,所以只能是每次你要想重新的话,你要重新稍录一下。好,我现在呢把这个呃遥控开启开启之后,是不是就收到数据了呀?对,但这个收到数据好像有点乱了,我们先我们先关一下啊,关一下之后再重新开啊,这这回正常了,这回正常了。好,那可以看到啊,就是我这边现在是不是这个遥控是开着的呀,对吧?哎,好,我只要一关,哎,看这是不是接收数据就停了呀,对吧?哎,再开,哎,他就收到了。哎,再关再开,这个反应还是很灵敏的,对不对?哎,行,那说明我这个呃收发就已经是打通了啊,然后大家自己在测试的时候呢,也要实现这样的一个效果,实现这个效果就行了啊,来我停一下视频。
day03
01-无人机-遥控项目-遥控数据处理-思路分析
cpp
复制代码
呃,来各位,那接下来呢我们往下进行,就是咱现在已经能够实现,就是遥控和这个无人机,它们两者之间的无线通信了,对不对?
那接下来咱们要做的工作应该是什么呢?呃,大家觉得我们现在做哪部分比较合适啊,来一步一波来呗,对吧?是先去做这个非控端呢,还是做遥控端呀,是不是应该是先做遥控端呀,对吧?因为因为你非控端那边它是不是需要遥控给他去发送特定的数据油门。比如说我的期望的俯仰角,希望的这个横空角等等,是不是给它发数据?那咱们这个遥控端呃,非控端是不是才能对这个电机进行控制啊,对吧?哎,所以咱们应该是先去做遥控端,哎,让遥控端去干啥呢?去采集咱们这个相应的数据采集完之后呢,把数据再给它发过去。发过去之后,呃,无人机那边能成功的收到油门能够成功的收到这个什么俯仰角这些东西之后,咱们再去控制那个电机啊,应该是这么一个思路啊,所以咱接下来要做的工作应该就是啥了。
同学是不是就是这俩任务了呀,对吧?一个是摇杆的扫描任务,还有一个是按键的扫描任务啊,对吧?哎,好,那给大家呃梳理一下,就是我们这个遥控端的一个整体的数据处理的思想啊,这会儿咱们应该怎么着呢?呃,首先别的不说,我们应该先拿到原始数据,拿到这个按键的数据,你得知道哪个按键被按下了,对吧?哎,完事儿之后呢,我得知道这个摇杆,呃,它目前具体的值是多少,对吧?我推到最上边是多少?推到最下边是少少,最左是多少,最右边多少,咱们得搞清楚这个事,对吧?能拿到这个原始的数据。当然这个原始的数据一会儿我们采完之后,你就会发现它其实是需要进行进一步的处理的啊,所以说我们需要对这个数据做一个简单的处理。那处理好之后啊,最终最终我们会得到哪些数据呢?这实际上呢是根据我们目前的这个无人机的功能来定义的啊?呃,我们现在是不是只需要实现无人机的核心的三个功能啊,对吧?呃,第一个是可以保持它的稳定飞行。第二一个呢是可以是不是前后左右移动嘛,对吧?然后再有一个就是可以实现定高没错吧。同学好,那为了实现这样的一些功能,大家想想,你说我们这个遥控应该给无人机发送哪些数据呢?首先油门是不是肯定得有啊,对吧?对吧?你要想飞起来,你你肯定得控制它的油门大小嘛,对不对?这是一个必须得有的啊。好了,然后再有就是这三个角度的期望值了。其实前面就给大家分析过啊,就是实际上呢我们要想让这个无人机进行前后左右的移动,实际上就是控制它的什么?是不是控制了它那个所谓的欧拉角啊,对吧?你要想让它向前移动,那它期望的俯仰角是不是咱们得给一个特定的值,哎,它就往前倒了。往左的话呢,是不是给一个期期望的什么啊?左右移动应该是调整横滚角,对不对?这个概念大家现在清晰不清晰,哎,俯仰横滚,这个一定搞清楚啊。好了,那我要想让它旋转,其其实们们能能旋转转的话话,控制它它什么是不是所谓的偏航角啊,对吧?哎,好,那这样一来就能够控制咱们这个无人机的移动的啊,前后左右移动甚至旋旋转啊。好,那所以说呢我还得给它稍等啊勾住了。呃,所以说呢所以说呢我们还得给他发一个什么东西,还得给发发一下这样的三个期望的角度啊,俯仰角横滚角偏航角,这是我们的期望值。然后那无人机那边收到这个期望值之后呢,再去进行相应的调整。哎,那就能够实现咱们想要的效果了啊。好,那再除此之外,我们还需要给他发什么呢?是不是大家还要实现一个定高的功能啊,对吧?呃,所以说我需要给他发一个定高的信号啊。好,那比如说我飞到一个高度,我就摁一下这个按键,对吧?
一摁。好,那这就发一个定高的信号,那边收到之后呢,就开始去做这个所谓的定高了啊。好,然后再有一个就是还还有一个数据什么呢?就是关机,但是是不是要做一个远程关机啊,对吧?哎,所以说这实际上呢是我们目前需要给这个飞机端发送的所有的遥控的数据啊,一共就是这么几项啊,就是这一点大家知道一下就行了。哎,好,那所以说呢呃正常情况下,我们采集完了这个遥杆的数据采集完这个按键的数据之后,那我们是不是就需要把这些数据做一个简单的封装啊,对吧?好,那我问一下大家啊,这个遥控数据当中,哪些是来自于遥杆的,哪哪些是来自于案件的这个事儿,应该很容易搞清楚吧。
油门俯仰角横空角飘扬角这四个是不是来自于摇杆,对不对?完事之后,你的定高你的关机是不是都来自于咱这个按键呀,对吧?这是这么一个思路啊?好了,那我把这个数据封装好之后,是不是就可以让谁让是不是这个所谓的通讯任务,也就是咱们前面所提到的那个呃芯片,对吧?SI二四二幺是不是通过它呃去给咱们那个飞机发送了呀,对吧?大概大概整体是这么一个思路啊。OK好了,那我现在问一下大家啊,按照我们目前的这个分析啊,你说这个遥控数据它是不是也相当于是一个共享数据啊,同学对吧?你看是不是摇我?我其实这么画就意味着这是一个全局的变量啊,呃是一个全局的。哎,是一个共享的数据啊。那看摇摇杆扫描任务是不是需要把这个材料的值,是不是设置到里边啊,对吧?ok好,那这个扫描呃,按键的任务是不是也要把按键的这个值是不是也要设设置到这个数据里边啊,对吧?好,那之后呢,通讯任务还得从里边去给怎么着去给它往外发送?那显然这是不是也是一个共享的数据?
哎,那这个会不会有数据的安全问题呢?这个其实也没有,为什么呢?呃,道理非常简单,因为我我还是什么,我还是没有说同时出现就是呃两个任务对同一个值进行读写的操呃,进行写写的操作没出现,是不就理论上就不会出现这个问题啊,对吧?你看啊同学呃,摇号杆扫描任务,它其实是负责,是不是写这几个值啊,对吧?我刚才说了这四个值吧,对不对?那这个呢是负责是不是写这两个值,而这个呢是不是负责读这些所有的值啊,对吧?所以说实际上呃呃不太会出现,就是我们前面所说的那个就是呃现程安全问题。所以这个呢咱们也不用去考虑说什么,一定要对这个读写操作,全部都给它加这个临界区,这倒没必要啊OK好,那到底什么时候哪些地方需要加连进去,咱们遇到问题,咱们到时候再分析啊。行,那我们现在这个整体的思路先给它搞清楚啊。好,那现在呢咱们先来完成最简单的一步,也就是扫描这个原始数据原始数据扫描到之后呢呃后边怎么处理,咱们再一点点分析啊。行了,那这个完了之后,我把视频停一下啊。
02-无人机-遥控项目-遥控数据处理-按键扫描
cpp
复制代码
好了,各位同学。那接下来呢我们打开这个遥控的项目,我们先来完成一下,这个就是按键的扫描。按键的扫描啊,也是最基础的驱动。咱们先来看一下啊OK那当然我们这块正常情况下,是不是得新建一个驱动的目录啊,对吧?这边我就就做做了了啊。好,然后里边的两个文件,我就一个叫做INT,后边跟上一个k点h,然后呢再来一个k点c啊,新建这边点c就行了。哎,好,这个h这边呢我们还是需要加上一个防止重复呃这个定义的这样的一个呃就是宏,对吧?哎,好,那接下来咱们往下进行,在我们开始写这个代码之前啊,咱需要干啥同学,是不是得先去看看原理图,然后配一下这个按键的GPI引脚啊,对吧?因为按键的输入是通过GPI引脚来的嘛,对吧?来,咱们去找一下这个原理图啊,找到资料,找到原理图,这回咱得看这个手柄的对吧?哎,找一下咱这个按键啊,呃来大家看一下,这是我们整个的这个图,对吧?
然后呢,大家看第一二应该是在第呃,我看一下第几页,最后一页,最后一页,最后一页里边注意观察。
哎,这书就是咱们这个按键的电路吧,对吧?然后其实大家应该能够想象得到,这应该是啥?这个这俩其实就是咱那个两个摇杆左右是不是各一个呀,对吧?
哎,好,这个摇杆前面其实给大家简单的说过啊,这个东西就可以理解为是一个滑动变阻器,它内部就是滑动变阻器。你当你转动这个摇杆的时候,你甭管是前后还是左右,对吧?它实际上呢都是在移动谁呢?
滑动变阻器的结构是不是应该是这样的呀,对吧?哎,这边比如说这个接正这边接负,对吧?那完了之后呃,中间是不是会有一个这个滑动的一个指阻呀?你可以理解为是对吧?好,那实际上呢就相当于是它是不是在滑动啊,对吧?那是不是只需要测这一点,它的电压能能能列个是吧?同学是不是就能得到一个就是根据这个跟随它变化的一个指针呀,对吧?哎,就是这么个原理啊,一会儿咱们再说这个事,我们先不管,我们先把这个按键直接的搞明白啊。好,注意观察同学,这个按键,它的布局正好跟咱遥控上的布局是一样的。大家能看明白吧?就是这个对应的是上下左右,对不对?对应的是我们这个遥控上的左下角这儿是不是有四个上下左右的按键呀,对吧?那对应的就是它啊好了,然后呃上边是不是还有两个哎,就对应的是我们这个遥控的上边的这两个按键能看明白吧?
同学哎,好,那所以接下来咱这样,我们先把这六个按键他们的GPIO眼角都给它配好。
配好之后呢,咱们去写相应的驱动啊,然后需要大家给大家注呃呃说明的一点就是什么呢?
一会咱们在写这个驱动的时候呢,要结合着什么?咱之前定义的这个遥控器的功能去分析,大家还记不记得。我最开始就给大家介绍了一下咱这个遥控器当中的这些按键的功能还记得吧?哎,好,呃,现在先不用关注具体功能,但是咱们得搞清楚一个事儿啊,咱这是不是要识别这个按按键的长按和短按呀,对不对?因为我我定义了这样的两个功能嘛,对吧?短按是干啥,长,按是干啥,这个事儿是不是得搞清楚?哎,所以一会儿咱们在写的时候,你想想这个长按的逻辑怎么实现?大家之前有没有写过这个长按写过吗?没有这个什么叫长按,比如举例子,咱们定义一下嘛,超过一秒,我认为它是或者超过五百毫秒,我认为是长按哎,短于五百毫秒,我就认为它是短按能理解这个事儿吧。同学哎,ok好,那所以接下来呢咱们先去配音角,配完音角之后,咱们再想这个长按短按的逻辑应该分别如何实现啊,行吧?来配音角呃,配音角的话,我们得打开那个QBMS啊,稍等一下来点过来,然后呢找到remote好,让他开着啊,开着完之后我们先看一看这个眼角都是哪个啊?这个咱在哪儿能看到,是不是在这儿能看到啊,就对不对。但是这块儿他是不是没给咱们标那个具体的引角啊,对吧?来来来往往往往往这边走,大家能看明白,就是他这块儿的一个呃基本的逻辑吧。那那那能不能看明白OK啊。好了。呃,你注意观察同学,就是这个是不是接的,是咱那个呃这个呃那个那个那个GPL的引角啊,对吧?那完了之后呢,注意观察同学这边只要我们是不是一按上,只要一按上,那它这是不是就会接力啊,对吧?
那所以说我们这个按键还是给咱们的GPI引角输入什么东西,还是输入高电频还是低电频啊,是不是还是输入低电平啊,对吧?所以输入低电平的话,那我们一会儿配那个引角的时候,我们应该配成输入模式,然后得配上是不是上拉电阻对对吧?应该是这么个逻辑啊。好,这是咱那几个引角来,我们现在把它截一下,然后照着配一下啊。f三,我钉在这个位置好,打开了之后呢,我们开始快速的配置一下。呃,首先我们找一下这边来,咱们就直接搜吧。啊。好,那应该是先配一个PB二,这个是什么left?x就是左上角那个对不对?那我们就来PB二来呃,应该是在这呢啊这个应该是音谱的吧,同学音谱的啊。好,那配完之后,我们快速来到这边,我们去改一下那个别名啊input注意应该是上拉,按照我们的分析,对吧?好,然后起个别名,咱就叫做k咱们就跟它保持一致吧,咱就k下划线啊,left后边来一个啥呢?来一个x表明它是左上角那个啊行,这个就搞定了。接下来呢我们再配一下第二一个,第二一个应该是PB十,对吧?
我就写一个b十啊,应该是这个这个也是inputmode啊。好,完了之后呢,这个咱们应该叫做什么?
叫做k下划线啊。RIGHTrightx对吧?好,注意这个模式input没没问题,但是这个电阻得上拉啊,这个一定要注意啊。行,接下来下一个呃应该是kup,呃,不是下划,应该是那个b十一对吧?PB十一应该在这儿呢,好,也是input三个了,还有这个一半啊,呃这个应该是k下划线啊,呃,然后呢上拉呃,没问题吧,k下一个啊呃该这个PB十四了,b十四啊,在这呢input好,这个我们应该给它配成k是不是当啊,对吧?呃,DOWN啊。好,那完了之后呢,这个咱也是给它来一个呃上拉就行了啊,最后两个一个是b十三,还有一个是b十二啊input呃,然后呢上拉呃,然后这个呢给一个名字叫做kleft。好,最后一个应该是b十二,对吧?哎,在这儿呢我们来一个音put呃点过来,最后一个应该是kright啊KRIJHT。那这样一来的话呢,我们这个就配好了上了。行,是不是几个按键咱就都配完了呀,对吧?
哎,好了,那现在我们看一看这个有没有问题啊呃k开头的所有的一呃一二呃三四五六是不是全是这个上拉模式啊,对吧?一定要接上拉电阻啊,这个一定要注意啊。行了,那也就是我们现在是不是就已经完成了咱当前的这六个按键的输入眼角的配置了呀,对吧?之后我们的generrecode生成代码,大家稍等一下啊。好了,那已经生成完毕了。接下来我们回到这边来啊,咱还是老规矩,我们重新生成完代码之后,先去编译一下,看它能不能过,能过的话,那咱们再继续往下进行,是不是能够通过呀,对吧?呃,我这个脚本已经是呃已经生效了,对吧?已经删除了那个呃函数了啊,好,完了之后,我们就开始写咱这个逻辑了啊。呃,来吧,开始你说这个按键这一块,咱们要定义函数的话,咱应该定义什么样的函数?那非常简单,是不是就是扫描按键呀,对吧?跟咱之前一样了,对吧?所以我们这儿来一个word,但是word不合适吧,你这个扫描按键的时候,你是不是得告诉我,你按下了哪个按键呀,对吧?所以说这儿是不是是得返回一个按键的,呃,咱们可以定一个枚举吧。跟之前大家学frarFS一样,对吧?我们定一个按键的枚举啊,然后呢以这个枚举作为返回值啊。好,那接下来咱们就把这个枚举给它定义出来吧呃,定义枚举我们是不是还是在这个统一的comtypes点h里边去定义比较好啊,对吧?哎,那这边我们写一下啊,这应该是按键的类型,对吧?呃,类型啊好了,那接下来呢我们就定一下啊,d呃t他p范对吧?后边deeNUM呃来,我们先给它起个名字啊,咱们就叫做k,是不是type就可以啊,对吧?ktype啊好了,那接下来呢我们往里边定义,大家想想你说咱这个案件的类型应该有哪些呀?好的,是不是就是上下左右,然后左上右上是不是首先得有这几个呀,对吧?但是大家要注意啊,我们是不是还得区分一个长按和短按呀,大家能理解这个事儿吧。哎,所以说呢我们这个按键类型是不是得多一些呀,对吧?我们先把这几个基础的类型给它定义出来吧。哎,首先就得有一个k是不是left呀,对吧?哎,好,然后呢还得来一个krightkupkdown呃,上下左右是不是已经有了,对吧?
像这这几个是它是瞎写的,咱就不管了啊,完了之后呢,我们是不还得有左上角的,跟右上角的对吧?
先把这俩定义出来啊,左上角x是不是呢?KRRITright,是不是x啊,对吧?哎,好了,那这个是不是我们这六个按键的一个基础的类型啊,对吧?好,然后呢,咱们再额外的给它加上这个长按呃长按其实不是所有的按键,我这是不是都都不是所有的按键都需要长按吧,是不是只有它需要长按啊,对吧?那当然我们把这个它俩对称吧,它俩都给它定义一个长按的功能了。哎,好,那也就是我们再加两个就行了啊,一个是kleftx呃,怎么就长按了呢?咱们就随便给它标一下呗,是不是跟那个区分一下就行,我后边给它加上一个long,这样的后缀是不是就行了呀,对吧?哎,归纳道理那个也是一样的啊。好,这个咱也是CTRLC拿过来这边我们给它加上一个long,这样的后缀没问题。各位位好了,那这样一来我们这个至少这个嗯返回式类型,我就定义好了啊,好,定义好了之后,我们再回到这个头文件里边来啊,你要想用这个类型,是不是首先得演入comemppe点h上呀?哎,TYPTYPES点h就又不给提示了,能不能跳呃,能跳,是不是就可以了?哥哎,这个跳咋这么慢呢?我编一下啊,看看能不能找好,没问题啊。行了,那接下来呢我们往下进行,各位下边咱们开始定义咱这个扫描按键的方法啊,咱这个方法是不是就可以以刚刚定义的这个ktype作为返回值了呀,对吧?然后呢,我后边写一个名字叫做INT,应该叫做啥叫做KSCAN吧。sky啊OK好,那这就是我们目前这个方法的定义啊非常简单。接下来呢咱就给它实现一下啊,来吧,咱们开始实现这个按键扫描的方法了,还还能想起来不同学,咱这个东西是不是得得得得做消消导啊,对吧?哎,这个我们就还是用最基础,最简单那个消导的方式就可以啊,就还是延时消抖。但是大家这回消导的时候要注意延时消导,是不是正常要延时啊,对不对?哎,注意,你说这回延时,咱们是用耗几类,还是用福瑞RQS里边那个vtouch的地位,这回咱们用谁呀?大家去记住一个这样的原则,只要你这个函数将来是在freertos里边的一个task里边运行的。你就记住,只要是在task里边运行的,能用task为task里类,是不是用task理类?嗯,那这个事吧吧k好了,那并不样,什么好好呢?就就虽然你听起来,哎,我现在还是延时消抖,但是它并不像之前那样会去阻塞CPU了。大家能理解这个道理吧。
哎,所以说这种消等方式其实是没有什么没有什么坏处了,没有什么负面影响,就就你就正常写就行啊,所以咱们就开始了啊,咱们一共要访描六个按键,对不对?哎,我们先不管那个就是呃长按怎么做啊,咱们就先做最简单的,就是咱们之前实现的,其实就一直就是短按嘛,对吧?咱们就还是按这个短按的来啊。好,那应该怎么写?首先我是不是得先判断一下哪个引角,它的电瓶是不是变成低电瓶了呀,对吧?咱们就一个个来啊。好,那既然要判断引角是不是变成低电瓶了,我是不是得读这个引角啊,对吧?所以这边为了方便,我还是跟之前一样,咱也去定义几个,是不是红就可以了呀,对吧?好,那现在呢我们底看啊,DEFINE。好,那首先我们来一个READread谁?呃,read比如说kleft啊,或者说我们kup都都是谁,谁谁先都无谓啊。呃OKKleft什么呃,咱们叫做,这就叫readclaass吧。然后呢,后边是不是就是直接给它kill成咱们那个号的号put的那个readpin呀,对吧,是不是就可以了,对吧?好,那这边我们写一下啊。好,因为一会儿它替换的时候,肯定需要用到我们那个GPL的一些定义。所以这边我们来一个GPL点h啊,好,里边咱们开始写了啊,how我后边应该写,是不是readpin呀,对吧?GPLreadpin对不对?然后里边咱写谁,是不是就写KG呃,kleftGPLhotkleftpin啊,对吧?这是不是我们那别名名,对吧?看能不能跳过去,能跳过去,就说没没有问题啊。行了,那这样一来的话呢,是不是这个GP角的宏就定义好了,对吧?那接下来我们往下走,下边几个个不不是让它自动生成就行,来right的,没问题。然后upt有没有问题,updown也都没问题,对吧?好,接下来我们再看一下那个左上角和右上角的左上角的没问题,右上角的这个是不是也没问题啊?各位哎,好了,那这样一来的话呢,我们这个就完事儿就完事儿了啊。行,那接下来我们再回过头来写,咱这个,对不对?六个案件咱都要判断,那我这儿就一个一个来呗,对吧?咱一个个来每轮循环,就是将来这个方法是不是要被循环调用?同学既然它要被循环调用,那也就是说我这里边只需要写一轮就行,就是扫描就是扫描这六个按键一遍就行啊,然后再循环不断被调用就可以了啊啊,来吧,那咱们就开始我这应该答写衣服上了。呃,我们先判断一个案件吧,先来一个比如说左上角的啊,ifread谁,比如说我kleft好,那他是不是怎么着同学,应该等于等于啥等等于零。哎,其实写等于零合不合适同学啊,你你正常情况下,这这他将来是不是会替换成这个方法同学,那这个方法的返回值是什么?是是零和一吗?其其其实严格来讲,人家是不是自己定义了一个拼state这样的一个类型啊,对吧?好,但实际上这个类型你可以看到是一个美语美语里边是不是reset,就是零set,那是不是零加一就是一呀,对吧?哎,所以说你就判断它是不是零,或者是不是一也也可以也没啥问题啊。行,那我们接着着呗,好,等等于零。如果这个要是等于零的话,那说明啥也是不是说明这个案件被按下了,对不对?但是按下之后啊,我们是不是得去做这个消导啊,对吧?跟咱们五幺里边那个消导是完全一样的逻辑啊。好,那这回我消导的话,我应该先怎么着,是不是先延个十毫秒或者十五毫秒把那个抖动那个阶段是不是先跳过去啊,对吧?哎,好了,那所以这边我应该来一个v是不是taskdedelay同学OK好,那既然要taskdelay了,那我这块要是不得引入freeRTask里边相关的内容啊,对吧?来引一个RTS点h还得引一个啥,是不是那个那叫什么来着?那个task点h吧,对吧?这个大家应该已经很熟悉了啊。好,拿过来,这边我们就直接vtaskdelay了啊,TASK后边来一个delay啊,delay里边呢我们写多少呃,就延个十毫秒,应该就行。这个抖动基本上就是十到十五毫秒,十二十毫秒就完够秒,不用延太长啊。行,这个就完事儿了。延完之后,接下来的同学按照我们前面的分析是不是还得再判断一下?你延完之后它目前是不是处在低电平啊,对吧?
哎,ok好,因为啥呢?因为是不是就是我这个出现低电平也有可能是出现我这个按键松手的时候啊,对吧?咱之前分析过这个事儿啊,所以为了确保现在是在处在按下的这个阶段,所以我还要再判断一下他目前是不是处在低电平,所以还得要来一个ifreadkleft等等于零没问题吧。同学好,这个时候如果等于零,那就说明他现在确实是按下了按下之后,那我们现在要做的事儿,就是干啥,是不是就是等他松手了,对吧?哎,ok等他松手的话,这回是不是就得来一个where了呀,对吧?where啥where啥where是不是它等等于零啊,对吧?啥意思?也就是说呃,一直等于零,那我是不是就一直在这儿,是不是等着它呀,对吧?就这么个逻辑啊。ok好,那所以说呢呃这边不用执行其他嗯代码啊,就是一直等着它就行啊。那所以说那等他抬起来之后,呃,也就是说等这个眼角读完之后变成高电平了,那是不是就抬起来了,对吧?啊,这个时候我在干啥东西,我在干啥?我是不是在returnkleft就完事儿了呀,对吧?哎,好,那这样一来我们呃扫描一个案键的逻辑,就算始写完了,这个大家还有印象吧。呃,这跟咱家之前五幺写代码完全一样,我就不再啰嗦了啊。好,那这个完了之后,接下来往下进行下边咱要做的是不是用同样的方式,你得把另外的五个按键也都扫描一遍呀,对吧?好走你,然后呢我们就快速的它生成就就行了。呃,呃,左右上下来走,然后呢,就是另外的两个了啊,先rereturn你先还得再给我来俩意思。呃,应该是kleftx这个没问题吧,同学哎,然后再往下走,应该是right的啊。好,这个是不是也没问题啊?各位哎,好了,然后需要大家注意的一点。就是啊如果说我某次扫描的这个按键,哪个都没按下,哪个按键都没摁。那咱现在这个方法是不是就没返回值了呀,对吧?所以这个不不合适吧,是不是一定要有一个返回值啊,对吧?所以最后最后如果都不满足,我还得retain一个谁,是不是k没有被按下的一个标识啊,对吧?这个你就随便来一下,比如说我一会儿再给他定一个啥呢?k那对不对?这个k那你应该把它作为一个什么是不是作为我们这个ktype枚举里边的一个成员呀,对吧?哎,所以这边呢我们再来一个啥呢?再来一个k那KEY下划线NONE这这个是不是就完事了?同学能能能能看明白吧?哎,好了,那这样一来我们这个案键的这个呃这个这个所谓的一个扫描的逻辑就开始写完了啊。好,那写完之后,咱们这样,我们呃为为了确保没问题,我们先测一下,测一下之后没问题,然后咱们再进行,就是下一个环节,下边咱们要做的是不是就是实现这个长按的逻辑了呀,对吧?哎,好,那现在我们回到这个freeartOStask里边,在这里边,咱们去呃测试一下啊,当然要测试的话,咱是不是得在他自己的任务里边测呀,对吧?按照我们前面的分析,按键扫描是不是得有一个他自己的任务啊,对吧?哎,好,所以接下来呢我们把这个任务给它创建出来啊,来吧,咱就开始这边呢我们叫做案件任务。好,那让让他给咱们定义啊,我这边来一个worid后边呢叫做什么呢?应该是ktask没问题吧,哎,好,往下走。
呃,ktask这个也没问题,一二八好,关键问题来了,同学优先级,咱这儿给多少,这个按键的优先级,咱们给多少?其实这个按键说实话还挺重要的,就是它是不是说白了是采集你的输入啊,对吧?我肯定是希望我的输入按了之后,我应该快速的被响应,所以它的优先级不宜过低啊。好,那这边呢我们就给最高优先级吧。因为因为我们昨天发现了,就是如果我不给最高先级,是不是这个通讯任务,它的耗时是比较长的呀。同学能能理解这个事吧。同学他是不是会一直占用CPU?所以为了保证它能够进行时间面向轮学,我们优先级,这个也给最高,也给最高啊。好,这个要注意一下来,那接着往下走,下边咱们怎么着呢?是不是得给它定一个这个呃的takandle,对吧?最后就是这个这个这个执行的时周期了。大家说我这个按键我多少钱扫描一次按键,其实咱们差不多十毫秒扫描一次就行啊,这个就是已经挺及时的了。因为你这个按键你不像不像那个不像我们这个摇杆摇杆,它是不是必须得实时的采集啊,对吧?因为你可能你推动它的时候啊,对吧?你要是说比如举例子,我推的时候,我推的时候是不是越肯定是我采的越呃周期越短。那我这个收集到的数据是不是就越越越完整越严谨啊,对吧?啊,你比如说你举个例子,你这个摇杆,假如说你要让它一百毫秒一次。
那可能我这个推了一段了,中间的过程的数据是不是采集不到啊,对吧?哎,这个一定要注意,所以摇杆那块你可以让它呃周期短一点,但是按键你不用一直按嘛,对吧?所以这个我们差不多十毫秒一次就行啊。OK这是按键的这个任务。接下来呢我们给它先把方法实现出来,然后呢需要注意,我们得把这个按键任务是不是得创建出来,对吧?
来嗯呃创建一个按键任务啊,创建呃,按键任务,哎,这就直接全部提示了,它有没有问题啊,ktask这个应该没啥问题啊。好了,那接下来呢我们去实现一下这个就是按键的这个测试的逻辑。所以咱们仅仅是测试啊。好,那当然测试这个是不是也是要周期性执行的同学来,我们拿过来。拿过来之后呢,这儿是不是也要有一个well一啊,对吧?跟之前都是一样的写法啊,走你这个拿过来。呃,那当然这个周期得改一下,这个我们需要改成,是不是咱那个ktaskperiod的对吧?TASKperiod行,这个没问题吧。各位好,现在咱就开始了,我们先不用管这个将来的处理逻辑是啥?咱们先把这个案件的这个驱动先测测通了啊,先测一下这个怎么测呀?同学呃就很简单啊,是不是上来之后,咱们应该调用啥,是不是就调用INT里边的那个ksky方法就行了,对吧?
当然这块呢你需要引入一个这个头文件啊,来咱引一下,应该是inincludede后边跟成一个啥呃,INT后边跟着一个k点h。好,那接下来往下翻,各位走走走走在这个位置,咱们去测一下啊,应该直接调用INTKskcan对吧?好,那它是不是会返回一个k呀,对吧?那所以我们这样,我们在上边吧,在上边咱们声明一个ktype这个叫做k呃,我们最好放上边吧。哎,好,那这个k完了之后,是不是就可以去接收咱们这个扫描之后的结果呀,对吧?
好,那接下来咱们干啥?接下来我们就先简单的打印一下,咱们就做一个简单的打印就行了。好,那接下来呢我们就直接是不是switch就行,对吧?后边来一个k啊。好了,那完了之后,里边是不是就是对每种枚举类型做这个判断呀,对吧?来,我们先来一个k什么呀?keyleft吧呃keyleft如果是keyleft,那我们这边呢就让它打印一个,是不是keyleft就行,对吧?你就随便打印下就行啊,我们来一个普洱台呃,来kleft,这个没问题吧。各位好了,那接下来按照同样的逻辑,是不是往下去写就行了呀,对吧?让它提示,哎,这这这这个这这一点是比较好的。呃,咱们按照顺序来吧,right好往下走printright,对吧?该break了,对不对?BREAK好,这个今天不太听话啊,来我们来一个case嗯,up,这个没问题吧。哎,来一个case。CASE呃,这回可以到这个也没问题啊。再来一个casecase,后边是不是这回得跟上left和rightx俩,对吧?哎,好,这样一来就完事儿了。注意啊,我们现在是不是还没有去测那个长按和短按的逻辑,同学啊,没没有去写长按和短按的逻辑,对吧?那所以那两个我们就先暂时不管了,现在先先把这六个案件的短,按咱们先测通啊,来现在是不是就完事儿了呀,对吧?哎,好了,那接下来呢我们就给它编译,然后呢稍录一下啊,大家稍等好,现在正在编译,然后呢我把这个插上咱们测一下啊。好,然后呢,我给它抄进去,呃,这个又识别不到了啊,我这个还是得我再重启一下。然后呢给它放上,然后稍录一下啊,好,已经装进去了。装进去之后呢,我把这个摄像头打开,然后咱们还有这个通口工具也打开,大们测一下啊,把这个呃先先把这个窗口给打开,呃,注意观察我我这儿是不是打印了一个powertask呀,对吧?这个东西它其实会影响我们这个观察,所以我这个就不要了啊。呃,powertask是之前我们测谁测这个是不是电源任务这块打印的的对,对吧?这咱咱就给它上用着了,测通的,咱这个轮子轮的f就不要了,再走,你再重新刷一下行,现在应该是没啥问题了啊。好了,同学接下来呢咱们就开始去做这个相应的测试,这个开着。然后这个摄像头呢我放在这个位置。好,那现在呢我就开始按这个按键了啊呃下这个没问题,对吧?然后呢,摁上这个也没问题,左哎,右然后呢,左上啊右上这个没问题吧。哎,然后大家可以看到,就是这个也挺灵敏的,也没有出现什么这个这个抖动上这个没啥问题。行了。哎,好了,那这样一来我这个基础的这个按键的功能就开始完成了。这个挺简单的,没啥可说的,对吧?同学哎,好,接下来重点来了。同学啊,大起精神。咱们来看一看这个按键的长按再应该怎么实现,怎么去判断我这个按键,它是在长按咱们前面讲过,如就是你自己定一个阈值就行啊。
你可以认为比如说我超过一秒,就是长按啊,也可以认为我按下超过五百毫秒,就是长按这个你是不是自己说了算呀,对吧?哎,好,你要想让它灵敏一点,你就短一点啊,来吧。那同学分析分析,咱这个长按怎么实现,咱就给他俩做长按就行,其他的是不是用不到长按呀,对吧?
哎,这个左上跟右上的大家有没有思路有,但有没有思路,有没有思路,同学按键按下超过多长时间之后,我就认为它是长按了,否则我就认为它是短按大家能理解我这个意思,对吧?哎,好,那大家想想这会儿怎么去做这个场外,我把视频停一下,大家好好思考一下啊,我恢复视频啊。好了,各位,那刚才刚才让大家想了想啊,接下来呢我们一起来写一下,就是这个所谓的长按的逻辑其实并不难啊,刚才也提到了,说长按长按就是做计时嘛,对吧?所以咱们应该在什么时候开始计时呢?应该是按下的那一刻开始计时,我松手之后是不是停止计时啊,对吧?然后再看我这段时间一共过了多久,对吧?如果过的时间超出了我的那个阈值。比如说五百毫秒,我就认为它是长按了,否则它就是短,不就是这么个思路嘛,对吧?好,那接下来咱就开始了啊,好,哪一刻是按下了呢?比如以它为例,只要进到这个e不循环了,是不是就可以认为就是按下了呀,对吧?好,这个时候咱就可以怎么着呢?就可以开始计时了。我先记下系统当前的时间,对不对?怎么记是不是直接调用xtaskget一个什么就行,t个count嘛,对不对?这是不是就拿到了我们当前的时间了呀,对吧?但是这块呢我们需要声明一个变量啊,我们来一个u,it注意,注意大家就一住,一定要注意以后,只要你接收这个值了,你一定要用无符号三十位,因为它的返回值是无符号三十位吧,你要用过UG的十六,它是不是可能会出现溢出这个问题啊,对吧?一定要注意咱们好几个同学前面那个呃闪灯那块儿,我们那个灯控任务里边是不是也用到它了呀?有同学就用的UU十六啊,那就出问题了啊,所以这块一定要注意。那这边呢我们随便起个变量名,我们叫做teicercount下划线。哎,等于它哎,那这样一来是不是就已经记下了,我这个按键按下的那一刻的时间了呀,对不对?那什么时候松手,是不是他结束之后是松手了,对吧?好,那他松手了之后,咱们干啥一下就行,我再获取一下当前时间我用当前时间减去,你按下的那一刻的时间,我是不是就知道这一段一共过了多久了呀?对吧?没错吧,所以在这儿呢,我就再来一个义务判断。if啥呢?xtaskget是不是currentt呃,gett个TT对吧?好,那这样一来我是不就拿到了当前的时间了。对,这个当前时间是什么时候的时间是我松手的时间,对吧?好,这个时候我再减去刚刚才按下的那一刻的那个时间是不是就知道一共过了多久了呀?对吧嗯所谓的过了多,是不是就我按下了多久了?对不对?好,那这个时候如果它大于咱们就自己给个预值。比如说我想让它灵敏一点啊,就是要不然的话,你要是太久的话,你那个按键是不是得按半天它才它才是长按呀,对吧?
好,比如说我就按五百算啊。好,如果它大于五百,那就证明我按下的时间是不是已经超出了五百了呀,是对吧?超出五百,我这回应该是不是就把它当长长按了我rereturn一个是不是这个浪的就行了呀,对吧?那否则的话,否则就说明它没到五百,没到五百就松手了。那我是不是就retain一个这个就行。哎,好了,那这样一来这个长按的逻辑是不是就加上了呀?哎,就这个思路其实并不难理解吧。同学哎,好了,所以接下来我们按照同样的思路啊,把下边这个这叫这叫这个右右上角的按键是不是也给它处理一下啊,对吧?好,按下的时候,我记一下它当前的时间啊。好,完了之后呢,哎等它松手之后,我再去呃进行这个相应的判断,是不是跟这儿就一样了呀,对吧?我直接复制吧,复制完之后咱们再改行不行?哎,好,拿过来拿来把所有的是不是left咱们给它改成red就可以,对吧?
这个改了,这个也是改成redRIGHT哎,考拉多同学。那你看现在这个逻辑是不就改完了,那不难吧,哎不难啊,这个挺简单的啊。行,接下来呢我们再回到哪儿,回到咱那个测试任务里边啊,往下翻,找到tch点c好,然后在这里边呢,我们需要去再加上是不是两个这个case判断呀,对吧?case,如果是那个long的,那咱们就k后边来一个啥,应该是leftxlog。哎,好了,那接下来呢我们就让它打印啊,好,打印这个没问题啊。好,再来一个case,这个应该是right啊啊,right这个也没问题,都是对的啊,prinkf这个也没问题。break。好,那这样一来的话呢,我们就已经完成了。呃,咱们这个长按的逻辑,接下来咱们开始测试啊,来构建大家稍等啊,这个没啥难度啊。行,搞定搞定之后呢,接下来我们开始做测试的同学,呃,我还是两个一起开着吧。这个我先清理一下啊。好,这个摄像头咱们打开我放在这个位置。好,呃,接下来咱们重点测一下这个就是呃长按的逻辑啊,我我我我我现在是右键,对吧?呃,我现在右键,然后呢,我现在先短按一下,这个是krightx这个没有问题吧。同学啊,注意哥,你看我现在我现在我在要长按了啊,我我现在长按了,哎,松手,哎,是不是就已经变成krightxlong了呀,对吧?哎,我再长按哎,再长按哎,但但这这个你必须得你你得等是不是五百毫秒才行啊,对吧?你要是等的不够,可能你看我这个就没等够,对吧?那它就只有这个x了,对吧?哎,哎,一定要够它那个时间才行啊,好,没问题吧。各位哎,好了,那这样一来的话呢,我们这个长按的逻辑呢就完事了,这个左边这个肯定也没问题,我我也我也测一下啊。嘿好,你得告诉他那个时间才行,按正常按那就是这个。那我确实端一会儿,他他他就响了,对吧?ok好了,同学那这样一来的话呢,我们就完成了咱当前的这个按键的扫描的基础驱动了。呃,整体来讲不是很难啊,来来停下。
03-无人机-遥控项目-遥控数据处理-摇杆扫描-ADC配置
cpp
复制代码
呃,好了,同学啊,那咱这个案件呢就先告一段落啊,呃大家那块呃着重的理解一下那个长按的这个处理逻辑就行了啊,呃,整体就是个计时啊,就是个计时啊,计时加判断吧,对吧?行,那这个就不提了啊,接下来我们回到这个呃项目的结构图,上,项目结构图。哎,好,我这儿也给大家标出来了啊,咱们这块呢扫描两个摇杆,是需要用到我们这个是不是单片机里边的ADC这个外设的呀,对吧?啊,需要用它去扫描,哎,然后呢去采集咱们这个摇杆的数据数据啊。好了,那接下来呢咱们就一起来看一看咱这个摇杆到底怎么去进行这个所谓的ADC扫描ADC采集啊,其实我们先呃要想知道怎么用啊,咱们得先简单了解一下,就是这个摇杆的基本的一个工作原理啊,我先给大家明确一下,这个其实画了是不是这样的两个圆圈啊,对吧?好,这其实对应的正好就是咱们的两个摇杆,这个注意这是不是标了一个w一啊,对吧?这个是不是标了一个w二啊,对吧?w一是咱们这个左边的那个左边那个摇杆啊。好,w二是右边那个摇杆,大家能理解这个事儿吧,哎,就是这么一回事啊。好了,那接下来呢咱们就简单来看一看这个摇杆的一个基本的结构。啊。实际上大家大家这么看啊,大家看这儿嗯,这是它的一个侧面,对不对?
你看在我们去转动这个摇杆的时候,它侧面里边是不是有个东西在跟着转呀,对吧?实际上这就是一个所谓的滑动变阻器,就是咱之前在那个三二那个板子上,三二的板子上,是不是也装过滑动变阻器啊,是不是上面也有滑动变阻器啊,对吧?那个是不是也是类似的,你用那个螺丝刀拧一下就行了,对吧?其实是一回事啊,其实是回事,能能看明白的同学它跟着转。
这其实里边就是谁在谁会谁会动呢?实际上是相当于是我们滑动变阻器中间的那个是不是指针它会动啊,对吧?啊,就是这么一回事啊。行了,那接下来咱们看一看这个原理图啊,原理图好理解一点,我们以它为例,呃,以WE为例啊,你会发现这儿是不是有一个呃,一二三这儿是不是有一个四五六啊,对吧?你就可以认为这就是两个滑动变阻器。哎,OK啊好了,然后当我们这个摇杆上下推动的时候,实际上是哪个滑动变阻器在工作呢?是不是就是他在工作呀,对吧?啊,OK好,那左右的时候,就是他在工作这个事儿搞清楚啊。好了,完了之后呢,我们看一下这个先看它吧,你看它这个是怎么去接的,他是不是一共提供了三个眼角啊,对不对?OK其中一个眼角直接接谁了,是不是接地了呀,对吧?另外一个引角接谁了,是不是接三点三伏了,没错吧?然后中间这个引角,也就是它是不是能能动的那个引角啊,对吧?能在滑动变阻器上移动的那个眼OK好,那它接到了谁同学,是不是接到了我们ADC的采集通道啊,对吧?
哎,好了,那这样一来的话呢,相当于ADC采集的,是不是就是这一点的这个电压呀?你想啊,那是不是随着我推动这个摇杆上下推动那这个这个中间的这个位置,它上下移动是不是这一点的电压就会发生变化呀?没错吧,那它变化的范围是不是就是从零到三点三类,相当于大家能理解这个事吧。哎,好,这实际上呢就是咱们这个摇杆采集数据的一个基本原理啊。ok好,那实际上我们这儿一共有几个滑动变阻器呢?同学相当于四个吗?一个两个是不是三个四个呀,对吧?哎,这一点要搞清楚。好,那我现在再给大家明确一下啊,这个滑动变阻器,按照我们之前的功能定压啊,我把这个图拿过来同学,咱们结合这个图,咱们去分析啊,我拷贝一下x三钉在这儿,哎,他不给钉是吧?那我就直接截个图吧,按照咱们之前的功能定义,各位同学呃,那这个这个滑动变阻器啊啊。ok好,那它采集的应该是咱的什么数据啊,是不是油门数据,对吧?是不是我这个上下推动这个呃摇杆的时候,注意这个w一是指的是左侧这个啊OK好,上下推动的时候,是不是它处在工作状态呀,对不对?那我是不是上下这边我规定的这个是油门啊,没错了。OK好,那这个呢这个采集的是不是咱那个让这个谁让我们这个无人机是不是旋转的那个逻辑啊,对吧?实际上我们是怎样让这个无人机旋转的,是不是就是去调整咱们那个期望的这叫什么角来着,横滚角吧,对不对?所以说这个你可以理解为是采采集的。什么是采集的,是横滚角的一个期望值啊。ok好了,那接下来往下进行,再看下边这个下边这个对应的是不是右边啊,对吧?右边这个是控制前后左右的啊,其实咱们前面也讲过,怎么控制前后左右是不是就是调整俯仰角和横滚角的期望值啊,扔圾列个上边同学。那所以说呢,他相当于采集的是什么?同学用来控制前后的,是不是那个这叫什么角来着俯仰角吧。哎,它采集的是俯仰角的值啊。ok好,那这个采集的是什么呢?是不是就是横滚角的值啊,对吧?哎,ok好,那我们这样去定义这样的几个值啊,ok这一点大家注意就行了。哎,好,那所以接下来废话不多说,同学我们现在要做的工作,就是是不是得去配置一下ADC的采集通道,完事儿之后再干啥?呃,是不是在去做这个相应的测试啊,对吧?哎,来现在咱们就开始了啊。那首先我们先打开q和MS呃,或者说我们先把这个文件创建出来也行,咱们先建文件吧,建完文件之后,咱们再去做做这个相应的配置啊。
好,这回我们是不是得也得在INT里边再重新建一个目录啊,对吧?哎,我们建一个目录,这个我叫啥呢?注意啊,我叫做joystick,摇摇杆,就是joystick啊。JOYSTICK哎,这是它的英文名称啊。好,接下来我们先把这俩文件给它放译出来,一个叫做INT。我后边呢叫做JOY呃STICK点HCcontrolcontrorc我们再来一个点c啊呃点c这个没问题吧。各位啊行了,那h里边呢我就先来一个HEADR。好,那这个就先这么搁着啊,然后接下来呢我们就开始去做这个相应的配置了。来,我们现在先打开这个QMS已经打开了,对吧?好,接下来咱们要做的工作,是不是就是去配置这个相应的ADC了呀,对吧?来,我们看一看这个ABC在哪儿?是不是在这这块啊?analog模拟,对不对?来,我们找到谁?
找到ADC一还是二注意它是不是一共提供了两个ADC的外设呀,对吧?哎,那我们用谁呢?用谁是不是得取决于咱们这个连到了哪哪个ADC的通道上啊?对吧哎,可以看到咱这儿是不是用的都是ADC一呀,对吧?那它后边那个数字是什么?大家知道吧?通道没错吧,一个ADC是不是支持同时采集多个通道啊,对吧?哎,好,那我们用到的应该是一六,然后呢,二三是不是一共是这四个通道啊,对不对?好,那接下来咱们就去找一找啊,来我们找到ADC一。然后呢这就是它给咱们提供的这个通道。当然我们用的这款芯片,它的ADC支持的通道数是不是没咱之前学三二的时候,那款多呀,对不对?OK啊好,这个确实是一个阉割版的啊。OK好,但是也够咱们用的那我们这边用的是谁来着?刚才看了一二三六,那我这个是不是都得选上啊,对不对?那大家还记不记得就是ADC的它那个结构图,每个通道其实所谓的每个通道其实对应的是什么呀?我们是不是外部有一个引角跟它是连连接大家的对吧?哎,是这么一回事啊?好,这一点大家搞清楚行,接下来我们往下进行看一看。选完通道之后,我们接下来还要做哪些配置?呃,大家还能不能想起来,还要做哪些配置?关于adc来,我把这个收起来啊,关于ADC咱们需要做哪些配置来着,还记得吗?呃,无非就是这几个这几个这几个东西呗,对吧?那我们一个来啊,先看第一个,第一个是不是commonsetting,这个是问我们选择独立模式还是非独立模式?对吧那我们是不是你肯定是独立模式啊,对吧?哎,所以这个咱们就不用管了OK接下来往下走,下边呢,咱们要配置的是什么?是这个ADC的基础配置了,对不对?OK那接下来咱们看看这块要配啥啊。首先第一个数据对齐,这个大家还能不想能不能想起来,是为啥?
呃,为什么要配对齐,然后咱们一般是怎么往哪对齐,还记得吗?这个还记得是为为什么要配这个数据?对齐还记得吗?对,其实是位数的问题,对吧?就是我们三二里边给提供的这个ADADC采集它的这个精度是多少啊?是十二位,也就是它采集到的那个就是模拟信号转成数字信号之后,它那个值是不是十二位的呀,对吧?但是这个数据采集完之后,大家还记得吧,它是不是会把它放到一个ADC的一个数据寄存器里边啊,还还有印象吗?来,我们稍微的回顾一下吧,我们找一下那个找一下三二的手册啊,三二官方资料,咱们打开他的这个中文手册啊。呃,哎我这正好打开的是不是就是ABC的那个功能描述图啊,对吧?咱们就看那个个图就就行。你看啊这边是不是AC用于采集数据的那几个通道的外部引角啊,对吧?哎,好,那这个数据采完之后啊,它当然呢我们这个采采的时候呢,它是分为什么呀?是不是分分两个个就是通通组啊,对对吧?有什么呢?有注入通道组,还有一个它叫做规则。
其实这个正常,你翻译一个叫做什么呢?是不是叫做常规通道比较合适啊?它因为它英文是那个regular,对吧?
哎,常规它它它它叫规则其实不太合适啊,常规啊,那有两个通道组。但是甭管是哪个它的一个数据采集的时候,是不是要放到它一个对应的数据寄存器啊,对吧?当然这个注入通道组呢,它一共四个通道都好,每个通道都有一个自己的数据寄存器。但是咱这个呃普通的这个就是常规通的这个通道呢,它是不是只有一个数据寄存器啊,对吧?这个寄存器是几位的十六位的对吧?那刚才我们提到了,就是我ADC采集的时候,我们是十二位的,对不对?那所以说你十二位的往十六位里边放,是不是一定会涉及到一个你数据到底是放在高位还是低位啊,对吧?所以就会涉及到一个对齐的一个事儿嘛,对吧?那当然一般情况下,我们采用的应该是啥?右对齐。那这样一来的话,你将来直接读这个十六位的寄存器的值,是不是一定会原始的那个值啊,对吧?
哎,OK这一点要注意啊,所以我们采用右对齐,这个事一定要知道啊。好,那默认就是右右齐齐啊,接下来就是往下走,下边是不是就是扫描模式和这个连续模式了呀,对吧?扫描模式指的是什么?来着?优处还记得吗?扫描模式,哎,很简单,扫用老师就是举个例子,你像我们现在就是我们一会儿,你甭管是用注入通道还是规则通道,你是不是要把那四个通道放在一个组里啊,同学对不对?OK比如说哎我这儿一二三四,好,什么叫做扫描模式呢?就是说呃我采完一个通道,或者是转换完一个通道,我就转下一个转换,这个是不是转下一个,这是不是就是在做所谓的扫描啊,对吧?OK好,那连续是什么意思呢?就是我扫了一轮,我我再怎么着,我再继续再来一轮,这是不是就是连续啊,对吧?
那我们这是不是应该是扫描加连续啊,对不对?ok好,那因为我需要一直实时不断的去采集这四个呃相对于滑动变阻器嘛,对吧?好,那所以这个我们需要给它一人一半,但你会发现我这演一个不了吧,这个是为什么?因为我是还没有去配下边那个就是通道的组啊,对吧?那我们这用哪一个呢?咱们就用常常见情况况,常一般情况下,咱们就用这个就是regular的,也就是那个呃就是常规的这个呃通道组就够了啊。
那咱们就用这个,那咱们先配它配完之后,因为你现在默认值它只有几个呀,里边只有一个通道,所以说就谈不上是不是这个所谓的扫描啊,对吧?所以你一人一个不了,所以这边我们应该给它改一下,改成几,咱们改成四,对不对?好,改成四啊,这样改成四之后,你会发现上边这个地方是不是这个扫描模式自动就演引able了呀,对不对?OK好演一波之后,接下来就是连续模式连续模式,我们是不是也得EAable这个非间断,我们就不用了啊。好了,那上面ADCsetting也就完事儿。接下来咱们要做的是不是就是配置咱们这个常规通道组里边的这个内容了呀,对吧?哎,好,接下来咱就开始呗。哎,这块儿是不是有一个rank一二三四啊,对吧?这个实际上对应的就是啥,就是它采集的次序吧,它是不是先采集这个再采集这个再采集这个再采集这个呀,对吧?所以我们是不是得指定一下咱们这个采集的顺序。当然这个事儿呢其实无所谓啊,先采集谁都行。但是你要保证你将来去解析它采集的这个数据的时候,咱们要怎么着呢?呃,我我们是不是得一一这个顺序得对应上啊,对吧?你得知道你先踩的是谁是油门啊,还是那个呃那个方向角,还是这个横脚?你你得知道他踩的是谁啊,同学这一点咱们要注意。好,那接下来我们往下进行各位呃,怎么着?这会儿咱怎么着?咱们先采集,谁呀?先采集,谁都无所谓啊,哎还是那句话,先采集谁都无所谓啊。好,那比如说我就按照这个顺序来了,同学啊,注意观察我按什么顺序呢?我按照咱们这哎哎哪去了?哎,我那个图呢在这儿,哎,我遥控的图呢,他给挡住了,是吗?啊,这行在这儿,我就按照这个顺序来吧,我先采集油门这个再采集这个先然后呢再采集这个再采集这个大家能能理解我这个意思吧啊,就是咱们按照顺序来就行啊,为什么要强调这个顺序呢?一会儿来就知道了,我先按照这个来啊来往下走。呃,来我们找到这块。那既然要是先采集那个油门的话,所以我这个排行第一的那我应该采哪个通道同学,那是不是就得对照着原理图去看了呀,对吧?来我们看原理图啊,好,我是不是要这个,是不是左边那个呀,对吧,我先采集这个,那是不就是一呀,对不对?那OK然后再采集这个,对吧?这个就是几六,对不对,然后呢,再采集这个就是二,那然后呢,再采集这个是不是就是呀,对吧?所以我应该是采六二三,是不应该是这个顺序啊,对吧?所以我按照这个顺序得先指定一下啊,来这个冲通道,一这个没有问题,对吧?好,接下来我们看第二一个,这个应该是六了,对不对?哎,OK好,那往下看呃,往下看这个就应该是二。那这个呢就应该是三一六二三,我就按照这个顺序来。对,行了,一六二三就完事儿了,对不对?好,那接下来往下进行各位对这这个采样时间,咱这是不是也得设置一下呀,对吧?呃,需要给大家注意说明的一点,就是这个采样时间你给的越短,那它肯定是采集转换的呃,转换的越越怎么着,是不是越快呀,对吧?OK好,那但是呢它精度就没那么高了啊。ok好了,那这个采样时间,如果你给的越长,那肯定它是不是采样的就慢了呀,对吧?但是它精度怎么着呢?要高一些啊,是这样的,它是这么一个逻辑啊。ok好,那所以接下来咱们这样同学学们这儿选一个谁呢?我们就选一个七点五就行啊,呃这个是一个比较平衡的,咱们之前在做前面做做基础课的时候,是不是也基本上选的就是七点五了。对吧?那咱这也选这个啊,来我们选七点五来往下翻往下翻,注意这是七点五个什么东西,是不是七点五个这个时钟周期啊,对吧?哎,这个要注意一下啊,好了,那这个就完事儿了。同学呃,也就是我们目前这几个采集通道就都配好了。哎,好都配好了。那接下来我们还要不要配其他的内容呢?呃,对要你看这儿是不是就首先有一个时钟的问题啊,对吧?大家之前是不是呃,应该还记得吧?就是我们ADC人家要求就是你给它输入的这个时钟信的号,它的频率不能超过多少,还记得吗?应该是不能超过十十四兆赫兹吧。呃,没错啊,你还记得吧,这个他手册上我记得应该也是有明确的。这个说明的啊。咱们要是忘了话,可以看一眼。呃,我看有没有呃,有你看这是基础介绍里边是不就说了ADC的输入输出不得超过十四兆赫兹没多少同学。所以我们目前是不是肯定是有问题的呀?里边儿人,这已经提示了有小叉的对吧?
这个咱们一会儿再调,我们先考虑一下别的问题啊。同学,你说将来咱这个数据他会怎么着?同学啊?对,就是咱咱们得考虑将来怎么去读这个事儿,对吧?来来我们还是看着看着它这个结构图啊,我们现在是不是采了一共几个通道,四个通道,四个通道,它是不是一个一个去采呀,对吧?
每采完一个是不是就会把结果放在哪,放在他的自己的这个呃所谓的,也就是常规通道数据寄存器里边,对吧?那我们将来是不是得想办法从这个寄存器里边去读咱们想要的数据啊,对吧?那咱们怎么读是最合适?最省CPU资源,最最咱咱就是最最方便的呢,肯定是DMA对吧?
咱之前在学这个基础的时候,是不是就是基基本上就是AEC会呃,配合这个DMA去使用啊,对吧?所以咱这也是一样的啊,所以咱这也是采用DMA的方式去进行这个数据的这个读取啊,所以将来呃咱们这儿怎么去具体怎么做呢?
很简单,我们是不是一轮是采四个数啊,对吧?所以将来呢我们去开启这个DMA的时候,我们在内存里边咱们开辟一个什么?是不是长度为四的这样的一个数组就行了,对吧?当是数组元素应该是多少位的呀?十六位的吧,对不对?
OK四乘十六,我们开辟一块这样的内存空间。完事儿之后呢,是不是让咱们这个ADC采用循环的方式往咱们这里边去写一个一个的数字数据就可以了呀,对吧?是不是应该是这么一个思路?哎,好,所以这边呢我们就开启DMA啊。好,那所以接下来咱们去开一下,我们找到这边进到是不是DMAsetting啊,对吧?这边我们添加一个DMA那首先就是DMA请求,这边应该是选择ADC一对不对?那通道呢呃可以看到它目前是不是只能用DMA的这个通道一啊,对吧?哎,这个就不用管了,那我们的方向是不是就是外设到内存啊,对吧?
好,优先级其实无所谓。因为我们现在是不是只开了一个DMA请求啊,对吧?哎,好,接着往下走,下边就是这个DMA请求的一些相关配置了啊。首先我们是们们的内容,当然说我这个是不是得连续连续去采集这个ADC的值啊,对吧?呃,这个这个两个摇杆的值啊,对吧?那所以我应该怎么着,是不是循环的去进行这个DM请求,对不对?所以我们应该选择是不是循环模式,对吧?然后往后看同学,那这个地址怎么处理呢?外设的地是增加不增加不增加。因为目前我们这儿使用的这个就是规则通道,对吧?它是不是只有一个数据寄存器啊,对吧?这个是这个东西是不需要增加的啊,但是内存那边呢内存我们刚才分析了,我是不是正常是一轮踩四个数啊,对吧?那所以我那轮是不是声明一个长度为四的数组,我这个是不是应该是增加的呀,对不对?所以这个应该是得增加啊。好,接下来就是数据的宽度了。大家想咱们这个宽宽度选多少,比合适适,他用三个选项,but是一个字节。helfworld是两个字节,word是四个字节,对不对?那我们选这样是不是应该是两个字节呀,对吧?因为我那个是不是数据运存器,我是几位的呀,我十六位嘛,对吧?所以说应该是哈佛二的那同理这边是不是也应该是哈佛二的呀,对吧?哎,好,那这样一来,咱这个DMA就算是配置完毕了。哎,好了啊,这个配完了呃,配完之后,接下来咱这样,我们这儿呢需要怎么着呢?
把这个DMA的中断给它关一下。同学你会发现这个DMA中断默认是不是就是开启的呀?对不对?OK因为这个DMA它的这个中断非太频繁了,它是不是有这个什么传到一半啊,传完之后是不是都会给你发这个中断呀,对吧?呃,请求中断啊,这个太频繁了,而且我们也没有用到它一个中断,所以那是不是会无端的浪费?咱们这个CPU对吧?所以这个中断咱开不开,咱就不开了,但是你在这关,你关得了吗?同学这儿关不了,这儿,关不了的话,能去哪儿关呀?北宋系统里边都有一个NVIC它这应应该是一一强强,是不是开启DMA通道的这个呃终端呀,对吧?我们把这个给它呃勾选掉就行了。勾选掉之后,接下来在这块是不是就能取消这个DMA通道一的这个呃终端了呀。对吧你这儿可以去掉,或者说你再回到我们刚才的这个ADC这边来也是一样的,都能去啊。好了,那这呢中断咱们就关了。好DMA的处理是不是也就结束了呀,对吧?
好,那现在只剩下谁了时钟了,只剩下它了啊。好,点进来之后,你会发现他问你怎么着呢?
是否去自动的解决,是不是咱们这个时钟的问题啊,对吧?哎,你要是点是的话呢,它就会自己根据问题去给你调整前面的这个分频系数,各种各样的配置,它容易给你配乱了啊,咱这儿不用它了,我们就自己配就行。我们这得选选什么就行?选no啊OK好,那完了之后呢,其实可以看到是不是我们的这个ADC是挂载到了,是不是这个时钟数上了,对吧?那所以接下来咱们怎么着呢?哎,ADC是不是有一个自己专门的这个预分频器啊,所以说我们只要调它,就就就就就行了啊。目前除以二十等于三十六,那我们要想给它调到十四以下,那我们应该怎么着呢?除以几除以六是不是正好等于就等于十二了呀,对吧?好,那这样一来的话,咱就保证它在十四以下了。好ADC的配置就算是完成了,给大家稍微的总结一下各位同学。那我们一共是做了哪些配置呢?好,这里边我们一一共了这样的几个配置。
首先我们需要去选择咱们使用了哪几个通道,我们使用的是一二三六,对不对?这个根据原来图能看出来啊,好,然后再往下进行,我们还做了哪些配置?首先就是ADC的基础配置。对吧?好,我们这个setting咱需要保证数据的右对齐完了之后呢,需要开启咱的扫描加循环模式,对不对?这个得配,然后呢,是不是就是配合我们这个regulargroup了呀,对吧?哎,好,这里边呢呃这回大家不知道能不能理解,就是我这块一再强调就是咱们这个顺序的一个事儿了啊,因为这儿的顺序就决定了,是不是咱们这个数据的采集顺序啊,对吧?好,决定了它的采集顺序,同时也就决定了什么?将来我们因为是通过DMA去读取数据嘛,对吧?OK好,是不是就决定了?我们将来我们刚才分析了,是不是得定义一个长度为四的数组啊,就定义了。你这个数组里边的是不是每个元素到底代表什么含义啊,对不对?这儿采的顺序就跟这个数据写到你数组里边的顺序是不是一样的呀,对吧?哎,这个一定要保持一致,当然这个顺序也不一定非得这样。
你你你只要保证这儿跟你将来这个数组里边,你读的时候能对上是不是就行了,对吧?哎,这一点大家体会一下就可以了啊。行了,同学。那这样一来呃,咱们这个就算完事儿了,然后再有呢我们还把这个DMA也给它开启了,对不对?之后呢,把这个中断是不是给它关掉了呀,对吧?再有一个就是咱那个ADC的时钟需要注意一下,就没有其他事了。哎,就是这些啊。好了,这个完成之后,我们直接点击jereratecode就可以了。大家稍等一下啊。好,那这个完成之后,我们点击可close完事之后,回到项目当中,老规矩还是先去编译这个代码稍等。呃,当然这块应该可能会出一个问题,就是咱们没有是不是ADC相关的这个呃资源呀,对吧?所以我们这会儿还是得手动的添加一下啊,来我们进到哪儿?呃,咱们进到EIDE,然后呢找到项目资源,这边呢我们还是添加俩地方啊,一个是application,我们找到user,找到car,对吧?这里需要添加ADC相关的内容,你要是不知道添加哪个东学,你这边就直接全选就行了。我们找到car找到SRC是不是就这几个呀,对吧?全选全选之后,它缺哪个?它是不是自动就补上了呀,对吧?其实我们看到都补了两个,对吧?一个ADC说一个是DMA呀,对吧?哎,好了,这个搞定啊,接在往下走,找到driver这二找这个,然后右键,然后点击添加文件,这个还是一样的。你要是不知道是哪个,你就全选driver找这个找SRC,然后全选。其实咱也咱应该也知道,你就找ADC跟DMA以外,对吧?添加原件好了,这个就添加上了之后,我们再重新编译一下啊,看这次能不能过好,现在是不是就过了呀?同学哎,好了啊,这个过了之后,接下来我们进入下边一个环节。同学现在是不是就开始写这个代码了呀,对吧?哎,我先把视频停一下啊。