预备篇:一.元器件选型及飞控电路设计

本文介绍了多旋翼飞控的元器件选型,重点讨论了主控芯片STM32的选择,以及陀螺仪/加速度计、地磁传感器和气压传感器的考量因素。STM32F405RGT6因性能和价格适中成为首选,而六轴传感器倾向于MPU6500,地磁传感器和气压传感器则根据GPS模块和精度需求选择。

[深入浅出多旋翼飞控开发]预备篇][一][元器件选型及飞控电路设计]

Github

要让飞控程序跑起来,首先我们得要有一个硬件实体,也就是我们的飞控板。说实话,飞控电路可以很简单,单纯由几个简单的元器件组成,即使是刚学会画PCB的大学生,也能像模像样地设计一款飞控出来。接下来的这个飞控板,暂且命名为天穹V3,也将会由我这个连半桶水都算不上的硬件工程师来设计。

而要设计一款飞控,第一个工作便是元器件选型,即主控芯片和主要传感器的选型。

1.主控选型

十年前,飞控届的前辈们只能在资源少得可怜,运行慢如蜗牛的8位AVR单片机上苦苦挣扎,而如今32位的Cortex-M单片机被用得飞起,速度远超当初,极大方便了我们的开发工作。当然,类似于STM32之类的32位ARM单片机,也仅仅是相对而言快了不少,若碰上了更上层的运算密集型应用也要歇菜。不过主控的选型,要进行多方面衡量,而不仅仅是性能,如价格、购买的便利性、开发参考资料等,而且DIY飞控板时芯片需要自己动手焊接,那类似于BGA之类封装的芯片便可以直接排除了。

先评估性能,从目前现状来看,应用最多的主控芯片应该是STM32F4之类的高性能Cortex-M4单片机,如PX4之类的主流开源飞控使用了180MHz主频的STM32F427。从经验来看,若是一些简单的飞控程序,任务量不大,使用互补滤波之类的低运算量算法,那STM32F1已经足够,可以保证主任务在500Hz以上的高频率运行。但程序规模稍大,或者使用了更复杂的算法如多维卡尔曼之类的,那STM32F4可能正好可以满足要求。

电子产品使用较多的人可能会对跑分软件比较熟悉,而单片机上也有类似的应用:CoreMark,用在嵌入式系统中测量CPU性能的基准程序。
通过搜索引擎查询和官方发布等数据,我们可以看到STM32系列单片机的跑分(估计值,

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "timer.h" #include "FreeRTOS.h" #include "task.h" #include "debug_cmdshell.h" #include "stabilizer.h" //任务优先级 #define START_TASK_PRIO 1 //任务堆栈大小 #define START_STK_SIZE 128 //任务句柄 TaskHandle_t StartTask_Handler; //任务函数 void start_task(void *pvParameters); //任务优先级 #define TASK2_TASK_PRIO 3 //任务堆栈大小 #define TASK2_STK_SIZE 512 //任务句柄 TaskHandle_t Task2Task_Handler; //任务函数 void task2_task(void *pvParameters); int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4 delay_init(); //延时函数初始化 uart_init(115200); //初始化串口 LED_Init(); //初始化LED stabilizerInit(); //创建开始任务 xTaskCreate((TaskFunction_t )start_task, //任务函数 (const char* )"start_task", //任务名称 (uint16_t )START_STK_SIZE, //任务堆栈大小 (void* )NULL, //传递给任务函数的参数 (UBaseType_t )START_TASK_PRIO, //任务优先级 (TaskHandle_t* )&StartTask_Handler); //任务句柄 vTaskStartScheduler(); //开启任务调度 } //开始任务任务函数 void start_task(void *pvParameters) { taskENTER_CRITICAL(); //进入临界区 xTaskCreate((TaskFunction_t )task2_task, (const char* )"task2_task", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_TASK_PRIO, (TaskHandle_t* )&Task2Task_Handler); xTaskCreate(stabilizerTask, "STABILIZER", 450, NULL, 5, NULL); /*创建姿态任务*/ vTaskDelete(StartTask_Handler); //删除开始任务 taskEXIT_CRITICAL(); //退出临界区 } //task2任务函数 void task2_task(void *pvParameters) { //u8 task2_num=0; u16 len; while(1) { //task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!! //printf("任务2已经执行:%d次\r\n",task2_num); if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff; debugcmd_process(USART_
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值