无人机day01

 day01

01-无人机-组成结构-上

哎,好,各位,那现在呢我们一起来看一下,就是咱们接下来要做的这个小项目啊。呃,当然这个名字有很多啊,就是这种飞行器有管,它叫四旋翼飞行器的,也有叫四轴飞行器的啊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-无人机-组成结构-中

嗯,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-无人机-组成结构-下

好了,各位同学,那接下来呢我们再来看一看,就是咱这儿的这个飞控系统呃,呃,不是飞控系统。说完了对吧?说说完了啊呃飞控系统主要是介绍了一个主芯芯片,有我们用的两个传感器啊,那最后一个就是这个遥控器了,遥控器就简单了,对不对?首先呢先给大家明确一下,就是咱这个遥控器它的功能定义啊,我这画了一张图,当然这个功能怎么定义,这个是不是完全是咱自己说了算呀,对吧?你自己写代码意,你想怎么定义,怎么定义,对不对?但是我我这给它划分的这个功能是什么样的,咱们一起来看一看,这就是咱们的遥控器的一个图。
对吧?呃,首先我们先来看一下,就是整个遥控器上面最显眼的两个东西,这俩摇杆对不对啊?
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-无人机-实现思路

点啊呃来吧,各位。那现在我们简单的分析一下,就是这三个需求的实现思路。哎,怎么能保持飞行姿态的稳定,怎么能够控制前后移动,怎么能够保持固定的飞行高度,还需要把这些问题给它理解了啊,想明白来先说怎么保持这个飞行姿态的稳定吧。
大家现在应该已经有一个整体的是不是思路了呀,对吧?我们这儿其实整个呃去呃保持这个飞行姿态稳定的这个思路啊,其实整个是一个啥呢?是一个相当于是一个这叫什么呀?闭环控制系统,闭环控制系统,哎,或者叫做反馈控制系统啊,说白了具体就是怎么做呢?哎,咱家这么做啊,咱们都知道在稳定状态下啊,就是我保持水平,这就是一个稳定状态,对不对?好,那咱这个用来保护用来测量这个或者用来描述用来量化这个飞行姿态的指标,是不是那三个角度啊,对吧?好在稳定状态下呢,这三个角度俯仰角翻滚角,我飘横角,他们的期望值应该是多少,都应该是零才对,都应该是零才对啊,所以说要保持这个飞行姿态稳定。那咱们怎么做就行了呢?我们只需要用前面给大家提到的那个传感器,还记得吧?那个MPO六零五零,对不对?它是用来干啥的,是不是它是可以实时的去测量这个飞行姿态的呀,对吧?它能实时测得我这个欧拉角,对吧?
也就是咱这三个角啊。ok好了,那如果我们测得的这个角度是我们期望的角度不同,我们期望角度是不应该是零了,对吧?如果期望角度不同,那我我就怎么着呢?我就及时的去根据这个偏差来调整这四个电机的转速。唉,这样一来的话呢,是不是它就会达到咱们期望的角度啊,对吧?那达到期望角度之后呢,是不是我这个电机呃,就不再去调整了呀,对吧?那一会儿偏了再调偏了再调是不是应该是这样的一个一直在进行动态调整的一个过程。唉,这个原理其实很简单啊,就举个例子,比如啊同学呃,这边是我的机头啊。ok好,那我正常应该是这样的。那如果说我检测到,唉,我现在有一个俯仰角,这叫俯仰角,对吧?我寄头是面向大家的啊。好,这就是俯仰角嘛,对吧?好,有俯仰角了之后,你说咱这个系统应该怎样去调整这四个电机的转速的那是不是应该是让前两个加快后两个减慢呀,对吧?
哎,这样不就回来了吗?哎,它是不是应该是这么一个逻辑,对吧?这就是我们保持飞行姿态稳定的核心思路啊,这里边我们肯定会用到啥呀?会用到PID哎,肯定会用到PID啊。大家还记得PID有哪几个组成部分吗?三个部分对吧?一个是比例部分,一个是还有什么部分积分部分?还有一个是微分部分,对不对啊?OK好,积分微分,这个年代久远了,我们可能不知道啥意思了啊,你就就以最简单的比例部分,所以的比例部分是跟谁成比例的跟误差成正比,对吧?那这个事儿好理解啊,我偏的角度越大,那我调整这几个电机的力度是不是应该越大呀,对吧?我偏的越大,说明马上就要就就就就就掉下来了,我是不是得赶紧把它回回归啊,对吧?这时候你调整这个电机的力度就大。那如果我只偏一点点,那我是不是应该是怎么着呢?我是不是应该是轻微的调整这个电机的速速它就行呀,对对吧?应应是这么个逻辑辑啊,这就是PID的一个思想啊,到时候呢咱们再详细的说这个事啊。
好,核心思路就是PID哎,通过这个逻辑去保证它的飞行姿态的稳定啊。好,接下来往下走。第二一个就是怎样去控制它的前后左右移动啊,这个事儿就简单了,前后移动,那咱们应该怎么着呢?怎么做,前后移动怎么做?嗯,是不是只要让这个飞机,它有俯仰角,有俯仰角,也就是说白了俯仰角不为零,那是不是它就会进行前后移动。嗯,对不对?所以说我们到时候呢要想让它前后移动,只需要让这个呃PI让这个俯仰角维持在一个一个角度就行。比如说我们给它设置设置我的这个俯仰角的期望值。比如说是哎这么一个角度。哎,好了,那他就往前走了。哎,我设置它的俯仰角是这么一个角度,哎,那他是不是就往后走了呀,对不对?是不是就这么个逻辑?哎,同理同学啊,那要是左右移动呢,是不是调整横滚角的期望值啊?
我让它稳定在一个这样的横滚角,哎,它就往这边走了,稳定在一个这样的横滚角,哎,它就往这边走了,这是不是前后左右这个事儿咱们就妥了呀,对吧?
其实虽然说是前后移动,前后左右移动,但其实本质是不是一样的呀,对吧?就是你让它维持在一个倾斜角,它就走了。哎,就是这么个逻辑,它的控制非常简单的啊。行了,这就是咱前后左右的一个实现思路啊。当然然呢,你设设置这个个呃就是俯仰角或者横滚角的期望值的时候,你这个保持的稳定是不是依依然得稳定啊,对吧?就是你得让它稳定在这个角度,你不能这么震,对吧?哎,所以说这是同时工作的啊,就是上下的呃两个操作,这一点要注意这个稳定得一直稳定啊,稳定我我所谓的稳定啊,同学不是说让它这几个角度都是零啊,不是这才叫稳定。我所以在一个倾斜角度,这是不是也是稳定啊,对吧?哎,移动的时候,我说的稳定是不能来回抖,不能上下抖啊,这个一质是不是这个事儿?好,这一点呃,搞清楚,那当然静止静动动动状态,那咱们就是让它都是零了,基本上都是零了。
好,那接着往下走,呃,下一个就是稳定它的一个什么呀?飞行是不是高度啊,对吧?那飞行高度这个事儿怎么做呢?其实也很简单,也是一个闭环控制的一个思想,对吧?那我应该怎么着呢?通过我们前面讲的这个芯片,它是不是可以用来实时的测量飞行高度啊,对吧?OK好,那呃如果我们测得的高度与我期望的高度不同。比如我现在期望它定到一米。OK好,那这时候怎么着呢?它就实时测量这个高度嘛,如果超过一米了,呃,它就会降低这个电极的转速。如果低于一米,它就会提高这个电极的转速,是不是让它一直稳定在这个一米的一个高度啊,对吧?哎,就是这么一个思路啊,同学这就是咱们实现这三个需求的思路。其实你看啊整个思路核心核心其实就是PID吧,同学就是PID啊。
好了,那这个PID到时候怎么写,咱再说吧啊,这个就不多说了啊,这是实现思路,就给大家分析完了,来填一下。

05-无人机-项目结构

人哎,好了,那为了大家好理解啊,我这块呢就是画了两张图啊,然后呢这两张图呢就把咱整个项目的结构给体现出来了。因为我们要写两个项目,对吧?一个是往飞控,上面烧的,一个是往遥控上面烧的对吧?我们先看飞控这个啊遥控这也点开吧。来,我们现在先把第一个放大,咱们一起来看一看双击。好这张图对,大家就看到了啊。呃,首先给大家看一眼,我们的主控芯片呢是不是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-无人机-飞控项目-创建

哎,好了,各位,那接下来呢我们就正式开始去实现咱这个无人机的项目了啊呃我们从这个飞控项目开始啊,飞控项目开始。
呃,首先我们需要先创建一个项目,对吧?啊,创建完这个项目之后,咱们还需要做什么操作呀?
啊,对,我们得先集成是不是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

哎,好了,各位同学。那接下来呢我们一起去呃实现一下,就是咱们这个项目的初始化操作。呃,第一个就是配置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

对啊,这个完了之后,我们接下来呢要做的就是集成福瑞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-无人机-飞控项目-初始化配置-测试

刚开始好,接下来我们去快速的做一下这个测试。看我们刚才这个初始化工作有没有问题啊,有问题,咱们及时解决呃,这个测试呢,咱就直接在慢点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-无人机-飞控项目-电源管理任务-概述

呃,好,给大家说一下,就是咱这个电源任务,它存在一个存在一个问题,存在一个什么样的问题呢?就是它是不是会有一个低功耗的一个检测呀,对吧?哎,好,然后呢给大家看一下这个现象是什么样的啊?
呃,这个遥控咱先录了,我现在是不是把当前咱这个程序烧录到了哪儿的同学,是不是已经烧录到了?咱的这个烧到我这个无人机上面了,对吧?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-无人机-遥控项目-创建

好,那我们现在呢把上午创建的这个飞控项目给它复制一份CTRLCcontrolLA啊,直接复制完了之后咱们改个名字就行啊。呃,然后需要给大家说明的一点,就是大家复制完之后,我们到时候真做这个遥控项目的时候得注意一下啊,就是咱这个原理图上其实能看出来非控项目,我们用的那个串口用的是呃USART二对吧?呃,但是这个remote这个呢它遥控那个呢它用的是USRTT这个到时时候们还得稍微的调整一下,改一改就行啊。
这个倒呃好说啊,到时候咱们再改啊,这个拿过来。呃,哎我老师就在这儿玩这个啊remote啊,进来之后呢,我们把这俩名字给它改一下就行。哎,这个咱也改一下,哎,行了。哎,两个项目啊。好OK那现在rebote我们就先不管了,我们还是进到这个呃哪儿进到这个flag。哎,来吧,我把视频再停一下。

12-无人机-飞控项目-电源任务-IP5305T概述

好,各位同学。那接下来呢我们就一起来呃开始开发这个非控项目了啊呃按照我们上午的规划啊,这个非控项目呢呃一共是有四个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配置&框架搭建

好了,各位,那接下来呢咱们就开始去实验一下我们当前这个电源任务啊,那在最开始我们首先要干啥,是不是得先去配一下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-无人机-飞控项目-电源任务-编码

那边呃来各位同学,接下来我们开始实现这个具体的功能。嗯,怎么写呢?呃,因为毕竟咱这是一个项目,对吧?所以说我们还是呃按照咱之前讲的,就是那个项目的结构去去去编码啊。呃,你像我们现在是不是要去操作这个电源芯片呀,对吧?电源芯片对于我们来来讲,是不是也应该算做一个外部的一个呃这个相当于外部的一个配呃这个呃设备啊,对吧?那所以在这儿呢我们呃写个什么呢?我们写个接口层,然后我们在接口层里边去封装一下,就是作为这个芯片的一些操作逻辑啊。好,所以接下来呢我们这还得再新建一个目录啊,来在根目录下边,我们定一个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配置

哎,好了,各位,那接下来呢我们再一起来看一看这个灯控任务,咱应该怎么做。呃,首先啊先给大家梳理一下我这儿的一个整体的思路啊,呃灯控任务呢,实际上呢是把咱这个就把我这个就是呃相当于是我的么呀,我我这个呃这个这个板子上边的四个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-无人机-飞控项目-灯控任务-编码-上

呃,来我们去搞一下这个接口层,接口层,我们应该进到哪儿?我们进到呃应该进到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-无人机-飞控项目-灯控任务-编码-下

嗯,好了,各位,我们接下来开始实现这个灯控的这几个任务,你要开和关这个都没啥可说的,非常的简单啊,呃这个我就直接放在这儿了。呃,放这之后呢,我要做的事,是不是就是说白了就是写这个端口啊,对吧?哎,好了,那你看这次咱们封装到里边之后,我们直接这么写的不就行。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-无人机-飞控项目-飞控任务-定时器配置

好了,各位同学,那接下来呢我们再来呃实现一下咱们的第三一个任务。当然第三一个任务,咱们不可能一下把它做完啊。呃接下来要给大家演示的谁呢?是这个非控任务,这个飞控任务前面也给大家讲过啊,它实际上是一个非常非常重要的任务。对于我们这个飞行器来讲啊,它做的最核心的事儿是什么的?同学是不是就是设置咱们这四个电机的转速啊,就是它做的个核心心的事,设置电机的转速,但是它是根据什么去设置的呢?它需要综合是不是多方面的因素,对不对?它首先需要考虑我们当前飞机的状态是什么?如果你飞机状态是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-无人机-飞控项目-飞控任务-电机转速控制

视频好了,同学那接下来呢我们快速的去实践一下控制电机转速的这样的一个逻辑啊。那首先我们还是从接口层开始,同学接口层开始啊,我们在接口层里边呢,我们新建一个文件夹,这个咱叫啥呢?叫做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-无人机-飞控项目-电源任务-纠错

呃,来各位呃,刚才呢我们完成了这个所谓的电源任务,咱已经创建了一个任务,然后让它定期的去干啥,是不是让它定期的去帮咱们唤醒这个电源芯片呀,对吧?哎,但是这里边有一个很致命的问题,什么致命的问题呢?我刚才我烧录完之后,我把这个线拔了,它确实是一直能够正常工作,对不对?但是我刚才给它关机了,关机是不是咱们双击这个按钮,它就关机了呀,对吧?哎,然后注意观察,我再开,你看我能不能开开,我把这个调大点呃,有点儿太小了啊,大点儿。好,那注意观察同学来,我现在摁一下这个开机,哎,你会发现注意唉,开不开了,对不对?这这很致命的错误,对吧?这是咋回事儿?大家能不能想明白啊,别的是对对,其实相当于是咋回事儿呢?能不能想明白这个事儿,我摁了一下,对不对?然后相当于你刚上电之后,是不是咱们这个任务就开始执行了呀?执行之后,上来之后就干啥了,这是不是就按了一下,他把这当成连续两次案了,大家能理解这个道理,不两次按是不是就关机了呀?对吧?所以他就关他他他是这么一回事啊,就是这这个他有一个这样的问题。所以所以咱这个在写的时候一定要注意,你知道怎么改一下就行了。同学,你别上来就按你干啥呢?你先延时先延时十秒钟,我这是十秒钟,对不对?你十秒钟之后,你再是不是一次一次的去给我唤醒就行了呀,你别上来就先唤醒一次,能能理解这事不同学,哎,这么写,它就没问题了。来咱们测一下啊。OK这个其实是想演示的,我给忘了呃,来拿过来,就是你先延时,它也可以。哎,拿过来。行来。现在呢我们再呃重新的看一下,我这儿已经刷进去了,对不对?刷完之后呢,这回还是得把这个拔了啊。好,拔掉拔掉之后呢,你看我给它关了,哎,双呃,双击关了,对不对?然后呢,再开,哎,这回是不是就正常了呀,对吧?哎,就是这么一回事儿啊OK其实你自己也可以模拟一下嘛,对吧?你看就是我连着按两次,就是在它关机的情况下啊,我连着按两次,你看它它是不是也是关呀,他也是不开呀,大家能理解这个道理吧。同学啊ok啊好了啊,ok哎,应该是能看到的啊,嗯就是有同学可能理解不了这个事儿啊,你要你要注意同学,就是咱们这个电源芯片呢,它其实是一直都在工作的,他一直都在工作的,我关了,它其实并不是真的关了,它只是进入什么模式了,同学低功耗模式了,低功耗模式,它会关闭什么?它是会关闭这个呃这个升压输出呃,关闭什么关闭它的LED电源指示灯,对不对?那个电量指示灯哎,关闭那个照明LED它是不是把这些关掉了,对吧?但是它内部的比如说检测按键的逻辑,这个逻辑它并没有关吧,同学对吧?所以说你不管它是在开的状态还是关的状态下,你但长呃按两次按一次,它其实都是能识别到的,能理解这个事儿吧。同学,哎,所以在它关的情况下,你按两次它本身它也不会点亮的那按照我们刚才逻辑也是一样的嘛,对吧?哎,我按了一下,这算一次一上电,正好在一秒之内,相当于按了两次,那相当于相当于是两次按按了嘛,对吧?它就要关了,就是这么个逻辑啊,这个大家注意一下就行了。呃,能能理能理解吧。同学那按按下那个个位啊,一定定让让它怎么着,按按延然,然后呢再去唤醒啊OK避免启动的时候直接就是double了,对吧?哎,这个注意啊,听一下视频。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值