[四轴原创DIY] 做个四轴飞行器找工作

[复制链接]
9278|41
望若闲云 发表于 2016-11-28 15:53 | 显示全部楼层
我也面试大疆了,第三关被刷了。他要求相当高啊
zhuyemm 发表于 2016-11-28 18:29 | 显示全部楼层
支持一下 楼主加油
andraw0912 发表于 2016-12-7 13:53 | 显示全部楼层
楼主继续日记,不要太监了!
 楼主| 遇见未知的你 发表于 2016-12-12 21:06 | 显示全部楼层
楼主心累啊,飞机搞的是单环pid,参数还不太好继续努力中
 楼主| 遇见未知的你 发表于 2016-12-12 21:22 | 显示全部楼层
file:///C:/Users/MMC_CAODONG/AppData/Roaming/Tencent/QQ/Temp/$GU1KP%7BU8D~AI1YC8_UY290.jpg
 楼主| 遇见未知的你 发表于 2016-12-21 20:14 | 显示全部楼层
本帖最后由 遇见未知的你 于 2016-12-22 22:52 编辑

学习笔记:2016.11.20--2016.12.21
1)楼主上次已经搭好飞机,所有硬件环境已经完成,到公司实习时,已经有飞过飞机,飞机有点原地旋转,怀疑yaw有问题,但是在打方向舵时发现飞机没有响应,怀疑遥控捕获有问题,
2)飞机代码移植已经完成,进入代码优化,简化主函数,将一些函数写入到定时器,或者建立其他的c h文件。      在这里我先为大家上传源代码,并做一些解释,源代码bug较多,因为不是为了下载就可以用,希望大家一起努力从中学到东西。
                     《《楼主是硬件转软件,菜鸟级,大神没有必要看》》
                    百度云:pan.baidu.com/s/1hrGWt2O    密码:5qc2(请复制到新的网页打开)
 楼主| 遇见未知的你 发表于 2016-12-21 23:56 | 显示全部楼层
本帖最后由 遇见未知的你 于 2016-12-22 00:12 编辑

  1. #define  Roll_PID_ADDR_BASE    0x0800E000            //存储Roll_PID参数的Flash页首地址,对于256K的来说,就是从248k开始
  2. #define  Pitch_PID_ADDR_BASE   0x0800E800            //存储Pitch_PID参数的Flash页首地址,对于256K的来说,就是从250k开始
  3. #define  Yaw_PID_ADDR_BASE     0x0800F000            //存储Yaw_PID参数的Flash页首地址,对于256K的来说,就是从252k开始
  4. #define  Mag_ADDR_BASE         0x0800F800            //存储mag数据的Flash页首地址,对于256K的来说,就是从254k开始
  5. /*--------------------------------------------------------------------------------------------------*/

      
      这是com.h中的一段代码,com.h用来在线调试pid,并将pid参数写入flash,这一段代码主要作用是确定flash地址,飞控在开机后先会传感器自检,然后判断是否进入姿态矫正,再然后开始从主控芯片的flash中读取pid参数,用来姿态解算。所以大家如果要移植这个程序则首先要更改Flash页首地址。
      stm32c8t6的flash官方说是64k但是有一些网友的却是128k,我也是,听说是厂家可能把CB不良的部分按C8用或者用的是同一个晶圆而已了,只是测试的时候未测型号不说明的部分,这里不做讨论。
      
图片1.jpg
 楼主| 遇见未知的你 发表于 2016-12-22 22:39 | 显示全部楼层
本帖最后由 遇见未知的你 于 2016-12-22 22:54 编辑

那该如何确定flash首地址呢?对于keil软件很简单:打开工程魔术棒图标,可以看到target下有IROM1:0x8000000  0x10000(0x8000000为首地址  0x10000为偏移量),它的意思就是对于stm32f103c8t6来说64k的flash地址由0x8000000开始,到0x8010000结束,中间的长度代表64k的flash空间。 但是直接设置flash地址比较麻烦而且不易移植所以建议改为一下代码
  1. #define USER_SECTOR (60)
  2. //#define USER_ADDR
  3. #define  Roll_PID_ADDR_BASE    0x08000000+((USER_SECTOR+0)*1024)            //存储Roll_PID参数的Flash页首地址,对于256K的来说,就是从248k开始
  4. #define  Pitch_PID_ADDR_BASE   0x08000000+((USER_SECTOR+1)*1024)            //存储Pitch_PID参数的Flash页首地址,对于256K的来说,就是从250k开始
  5. #define  Yaw_PID_ADDR_BASE     0x08000000+((USER_SECTOR+2)*1024)                    //存储Yaw_PID参数的Flash页首地址,对于256K的来说,就是从252k开始
  6. #define  Mag_ADDR_BASE         0x08000000+((USER_SECTOR+3)*1024)                    //存储mag数据的Flash页首地址,对于256K的来说,就是从254k开始
注释有错大家不必在意。     #define USER_SECTOR (60)//改变60 即可适用于其他32mcu。
@G$2OZ$UGT72{T~[TE~_BIU.png
 楼主| 遇见未知的你 发表于 2016-12-22 23:00 | 显示全部楼层
本帖最后由 遇见未知的你 于 2016-12-23 00:01 编辑

      我先从主函数开始,告诉大家我如何移植的程序并阐述一些个人观点,大神勿喷,欢迎纠错。
  1. int main(void)
  2. {
  3.     Clock_Enable();                         //使能系统时钟
  4.     NVIC_Configuration();           //配置嵌套中断
  5.     SysTick_Config(SystemCoreClock / 1000);        //systick时钟采用108M,产生1ms时基,中断优先级最低0xFFF
  6.     TIM1_PWMOutMotor_Init();    //初始化Tim4 PWMOUT  周期2.5ms 频率400hz  高电平0.875ms~2.0ms
  7.     delay_ms(20);           //500ms后系统稳定
  8.     GPIO_Configuration();
  9.     Usart2Init(115200);        //配置串口
  10.     i2cInit();                         //初始化I2C总线

  11.     TIM3_PWMInCap_Init();       //初始化Tim2 PWMin捕获 周期为20ms,脉冲宽度为1ms~2ms之间
  12.     delay_ms(500);           //500ms后系统稳定
  13.     Turn_On_LEDs();         //红灯和绿灯点亮,进入等待
  14.     init_mpu9150();                 //初始化传感器
  15.     delay_ms(3000);                     //延迟3s等待系统稳定,等待接收机与遥控连接,等待是否启动compass校准
《1》  Clock_Enable();      //使能系统时钟---主要用于使能所有GPIO时钟,以下为原函数:
  1. void Clock_Enable(void)
  2. {
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
  4.                            RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
  5. }
《2》 NVIC_Configuration();    //配置嵌套中断                   这有一个讲的比较好的帖子 (  请在新网页打开      blog.sina.com.cn/s/blog_1456c40890102vaq1.html   )
        中断就是CPU在执行一件事A时突然有一件急事B要做,于是CPU停下手头的事A,保护好现场(为一会处理完急事B可以继续回来处理A)去做急事B,做完后立即回来做A.这就是一次中断。为什么要中断?为了实现实时处理与同步操作,在不写操作系统的情况下单片机不能同时做两件事,中断可以实现





















cdc321 发表于 2016-12-28 23:38 | 显示全部楼层
楼主你是电子专业出身的?拿到大僵的OFFER了吗?
 楼主| 遇见未知的你 发表于 2017-1-3 17:53 | 显示全部楼层
cdc321 发表于 2016-12-28 23:38
楼主你是电子专业出身的?拿到大僵的OFFER了吗?

电气专业出身的。拿到大疆的OFFER了,但是是做机器人,所以推了
lizhuang_1 发表于 2017-1-9 21:01 | 显示全部楼层
用的什么通讯方式?如果软件用的是现成的代码,硬件可以直接组装的话,那工作量体现在哪里啊?
 楼主| 遇见未知的你 发表于 2017-1-12 22:17 | 显示全部楼层
什么通讯方式?指的是哪个?姿态模块?还是?
 楼主| 遇见未知的你 发表于 2017-1-12 22:17 | 显示全部楼层
lizhuang_1 发表于 2017-1-9 21:01
用的什么通讯方式?如果软件用的是现成的代码,硬件可以直接组装的话,那工作量体现在哪里啊? ...

主板自己画
软件移植平台不同
liu787290 发表于 2017-1-14 16:04 | 显示全部楼层
楼主,能留个联系方式么,我最近也在做这个,遇到点问题
中西部牛仔 发表于 2017-1-14 20:24 | 显示全部楼层
楼主好厉害
cdc321 发表于 2017-1-19 00:57 | 显示全部楼层
遇见未知的你 发表于 2017-1-3 17:53
电气专业出身的。拿到大疆的OFFER了,但是是做机器人,所以推了

做机器人?大疆不是做四轴飞行器的吗
1357529032 发表于 2017-1-25 22:18 | 显示全部楼层
面试怎么样?
q2512262471 发表于 2017-2-12 22:13 | 显示全部楼层
学习了!!

wmslecz 发表于 2017-2-22 15:06 | 显示全部楼层
楼主真的强啊。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部