查看: 1530|回复: 0

树莓派多旋翼无人机制作:航模电池与电机驱动

[复制链接]

355

主题

391

帖子

1102

积分

金牌飞友

Rank: 6Rank: 6

积分
1102
飞币
709
注册时间
2017-7-23
发表于 2022-11-21 16:22:59 | 显示全部楼层 |阅读模式
一、电源与降压模块

        细心的你可能会发现树莓派、光耦隔离器、电调、电机都有了,可还是没有电源。没电当然不行了,我们的四轴动力靠的就是电池。对于锂电池的选择也是多种多样的,但是我们将在稍后说明。现在我们要说的是树莓派的供电。我们还要使用一个DCDC降压模块来对锂电池的电源稳压:

树莓派多旋翼无人机制作:航模电池与电机驱动w2.jpg

        由航模电池的电源引出5条线,其中4条为4个电调供电,另外一条接DCDC降压模块的IN端,其OUT端为树莓派供电。接入时暂时不要接树莓派,先用万用表测量OUT端电压, 用螺丝刀旋转金属旋钮逆时针为减小,顺时针为增大(刚开始旋转时电压可能不变,要逆时针旋转七到八圈,电压才会发生变化)并调整到5V,接入时要注意正负极不能接反,最后再接入树莓派的5v和GND。

        接下来,看看我们的四轴飞机器供电电池,通常我们使用3节锂电池或4节锂电池为四轴供电,也有使用更多节的比如6节、8节或更多。电源中有几节锂电池,我们就称这样的电源为几S。例如3S表示有3节锂电池,4S有4节锂电池等等。每一节锂电池的电压为3.7v,3S的电压就是11.1v;4S的电压就是14.8;6S的电压就是22.2v。这样的锂电池电源,我们也通常称作“航模电池”。
        另外,对于航模电池还有两个重要的参数:电量和放电倍率。电量就是我们所常用的3000mah、4000mah、5300mah或10000mah等等。它表示了电源能够存储的电能的多少。而放电倍率通常是有15C、20C、25C或30C等等。它的意思是说放电的速率。例如:我们手机有一块10000mah 20C的电池。
        1、按每小时10000毫安的放电速度持续放电1个小时;
        2、以5倍速度放电,即以每小时50000毫安的放电速度持续放电12分钟(60 / 5);
        3、以10倍速度放电,即以每小时100000毫安的放电速度持续放电6分钟(60 / 10);
        4、以20倍速度放电,即以每小时200000毫安的放电速度持续放电3分钟(60 / 20)。
        至于在实际飞行过程中它按多少的倍率放电,主要取决于电调和电机的功率。关于这些功率计算和放电时间的计算不是我们的讨论范畴(如果你有兴趣可以自己查阅相关资料)。我们推荐使用2200mah 3S航模电池:

树莓派多旋翼无人机制作:航模电池与电机驱动w3.jpg

        值得一提的是,不是电池容量越大就越适合四轴,电池的容量大,重量也就大,四轴飞行时的承重也就大,需要的负载也就大。如果你的电池非常重,那四轴能不能飞起来都是个问题,所以还是选择一款适合你的航模电池。

        二、无刷电机驱动

        接下来我们就来一起编写无刷电机的驱动程序,在前面章节中我们已经学习了如何通过树莓派产生PWM信号,而在本节中我们就来实际操作一下,将电机接入电调,将电调的信号线接入树莓派的GPIO引脚上,通过航模电池为电调和树莓派(加入DCDC降压模块输出5V给树莓派)供电,在这里我们使用wiringPi的1号引脚,接线图如下:

树莓派多旋翼无人机制作:航模电池与电机驱动w4.jpg

        在接线过程中有一处需要注意,电调中的信号线有3根,颜色为红、黑、白。红色为信号电源,黒色为地,白色为PWM信号线,我们只需要接电调的信号线(白色)至树莓派的WiringPi 1号引脚,并将地线(黑色)接入到树莓派的GND引脚即可,电源(红色)不需要接入树莓派。如果你采用了光耦隔离器的话同样只需要接WiringPi 1和GND即可。

        关于无刷电调控制电机时,有两个地方需要关注:

1.电调最大行程校准。电调在出厂后如果没有做最大行程校准,我们就需要对其做校准。这样可以保证我们的四轴中4个电机速基本一致,从最低速度到最大速度的基本相同。做电调的最大行程校准的步骤如下:

    按上图接线,注意不要为电调上电(暂时不为电调接入电源)。

    使用树莓派生成最大PWM占空比值,即产生100%占空比信号,此时高电平持续2ms,低电平0ms,注意要有高低电平变化,如果电平一直是高则此PWM信号无效。

    为电调上电,此时电机会发出两声短促的“嘀”声,在3秒之内将PWM信号由100%变为0%,随后电机会发出一声长鸣“嘀”。此时电调最大行程校准完成。

       2.电调信号初始化。电调信号初始化相对来说比较简单。为了保证使用安全,电调在上电后是处于保护状态的,此时如果直接为电调发送100%的信号电机是不会转动的。在使用电调之前,首先要对其发送超过3秒的0%的PWM信号,电调才会认为使用者初始化了电调,随后才可以根据PWM信号值来调整电机的转速。电调初始化的过程如下:

    按上图接线,并为电调上电,此时电调先会产生一次“do ra mi”,随后每两秒会发出一声短促的“嘀”声,表示未收到任何PWM信号。

    使用树莓派生成最小的PWM占空比值,即产生0%占空比信号,持续3秒以上,此时电调会产生3短1长的“嘀”声(3短表示是3S锂电池),此时电调初始化完成。

        最后我们来编写一个可以对GPIO引脚产生PWM信号的程序:

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

#include <wiringPi.h>

#include <wiringSerial.h>

int port = 1;

int run = 1;

int speed = 0;

void motor_run()

{

        while (run)

        {

                digitalWrite(port, HIGH);

                usleep(1000 + speed);

                digitalWrite(port, LOW);

                usleep(1000 - speed);

        }

}

void set_speed()

{

        while (run)

        {

                printf("SPEED = %4d, Enter new speed:\n", speed);

                int tmp = 0;

                scanf("%d", &tmp);

                if (tmp >= 0 && tmp <= 1000)

                {

                        speed = tmp;

                        continue;

                }

                speed = 0;

                usleep(10 * 1000);

                run = 0;

        }

}

int main(int argc, char *argv[])

{

        wiringPiSetup();

        pinMode(port, OUTPUT);

        pthread_t p_run;

        pthread_t p_set;

        pthread_create(&p_run, (const pthread_attr_t*) NULL, (void* (*)(void*)) &motor_run, NULL);

        pthread_create(&p_set, (const pthread_attr_t*) NULL, (void* (*)(void*)) &set_speed, NULL);

        pthread_join(p_set, NULL);

        pthread_join(p_run, NULL);

        return 0;

}

        注意,这里我们产生的PMW信号是一个0~1000的数值,其实就是千分比0‰~1000‰。这样我们就可以用最简单的0~1000来表示一个比较精确的PWM信号,如果使用百分比来表示的话我们就需要使用浮点数来表示0%、0.10%、12.8%、93.5%这样的数值,而使用千分比则只需要用整型数值0、10、128、935即可表示。

        程序中我们创建了两个线程,第一个线程motor_run用于产生PWM信号,第二个线程set_speed用于接收用户输入的值从而修改PWM的值。

SPEED = 0, Enter new speed: 100

SPEED = 100, Enter new speed: 200

SPEED = 200, Enter new speed: 400

SPEED = 400, Enter new speed: 1000

SPEED = 1000, Enter new speed: 0

SPEED = 0, Enter new speed:

        到这里,我们的电机驱动部分就完成了,程序非常简单,在我们使用四轴飞控程序时只需要产生4个线程分别对4个GPIO引脚分别产生4路PWM。

树莓派多旋翼无人机制作:航模电池与电机驱动w5.jpg

树莓派多旋翼无人机制作:航模电池与电机驱动w6.jpg

   
树莓派多旋翼无人机制作:航模电池与电机驱动w7.jpg

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表