先开个坑吧…
熬夜了4天4夜的比赛要记录一下诶..
而且第一次做四轴飞行器还是挺有趣的~
首先是题目
这是我们第一次做飞行器所以有很多东西我们都不太懂
经过一番查资料我们大概了解了一些制作步骤吧
首先是飞行原理,很简单四个轴的小飞机..
如果飞机是绝对对称的,只要在四个轴上产生同样大小的风力就能够稳定起飞
飞行模式有两种,一个是十字模式一个是X字模式.
区别很简单X字就是十字的航行方向偏移了45度
这些都不是太大的问题什么的不懂就自己百度吧或者可以上果壳的飞行器小组
题目上要求了不许用飞行控制模块(目的为了是限制北航之类的专业高校的能力)
但是它规定了必须要用瑞萨的单片机(目的是为了防止你们直接购买网上现成的基于主流单片机例如STM32的飞行器)
但是这些都不是问题…问题是为什么这款单片机这么不好用!!!!!!!!!
待会再慢慢吐槽…
我的角色是程序员:就是好好的用好这个单片机和各种传感器
不过还是要赞一下瑞萨的Code Generator真好用!!!!各种外设的初始化变得简单多了…
网上有人说这种”偷懒”的初始化特别不好因为会使得硬件工程师对单片机的各种寄存器和外设的了解程度降低
但是我觉得这并不影响开发者的学习过程
因为要真正的好好的去使用一款单片机你不可能不了解他的各个寄存器,而Code Generator这种东西只是给你了一个快捷的方法去进行一些设置
而且通过查看生成的代码开发者也能够更加清晰的去知道该往什么方向去修改寄存器
因为生成的代码后面都有注释让你知道对某个寄存器的操作是处于什么样的目的
总之目前我对瑞萨这套IDE的欣赏程度应该仅仅次于Eclipse for Java
下面来写下这里的编程笔记吧..
首先是单片机的各种使用部分:
>>单片机的各种资源设置统计:
定时器:
TIM0定时器:系统定时器,1us中断计时
TIM1定时器:高电平测宽模式,用于超声波模块的返回值处理
TIM2定时器:4路PWM的Master定时器
TIM3-6定时器:4路PWM输出的Slave定时器,用于输出PWM波
TIM7定时器:预留做遥控器接收机的信号处理或者其他用途
传感器:
MPU6050三轴陀螺仪+三轴加速度模块
HR-SC04超声波
还有几个不是我采购的激光的光电反射式传感器貌似比较贵70一个用于循迹
>>MPU6050的使用
目前我的使用方法是软件端口的IIC模拟的形式,第一次用IIC虽然有例程
不过我这个傻叉在数据移位的时候多移了一位尼玛输出都是000000
>>串口函数的改写
瑞萨单片机提供串口的发送函数,并不需要我们自己来给寄存器直接写数据但是每次写数据就必须把数据长度输入什么的比较麻烦
于是我就稍微改写了一下原来在STM32上的串口输出程序
void print( uint8_t *Data,int de){ const char *s; int d; char buf[16]; va_list ap; va_start(ap, Data); while(*Data!=0){ if(*Data==0x5c){ switch (*++Data){ case 'r': txflag=0; tx_data[0]=0x0d; R_UART0_Send(tx_data,1); while(!txflag){NOP();} Data++; break; case 'n': //USART_SendData(USARTx, 0x0a); txflag=0; tx_data[0]=0x0a; R_UART0_Send(tx_data,1); while(!txflag){NOP();} Data++; break; default: Data++; break; } } else if(*Data=='%'){ switch (*++Data){ case 'd': //d = va_arg(ap, int); itoa(de, buf, 10); for (s = buf; *s; s++) { txflag=0; tx_data[0]=*s; R_UART0_Send(tx_data,1); while(!txflag){NOP();} } Data++; break; default: Data++; break; } } else { txflag=0; tx_data[0]=*Data++; R_UART0_Send(tx_data,1); while(!txflag){NOP();} } //USART_SendData(USARTx, *Data++); //while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); }}char *itoa(int value, char *string, int radix){ int i, d; int flag = 0; char *ptr = string; if (radix != 10) { *ptr = 0; return string; } if (!value) { *ptr++ = 0x30; *ptr = 0; return string; } if (value < 0) { *ptr++ = '-'; value *= -1; } for (i = 10000; i > 0; i /= 10) { d = value / i; if (d || flag) { *ptr++ = (char)(d + 0x30); value -= (d * i); flag = 1; } } *ptr = 0; return string;} /* End user code. Do not edit comment generated here */
大约用到的就是这些.
以下是虽然不是我负责的但是我也稍稍参与了的算法部分:
继续留坑.下次要把IIC的通讯改写和算法贴上来…