5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: DIY个飞翼用的陀螺仪混控器 [打印本页]

作者: n44303    时间: 2012-7-23 22:59
标题: DIY个飞翼用的陀螺仪混控器
最近天天有空就陪小女儿下水,收获大啊,比做混控还有意思:em15:
http://player.56.com/v_71123331.swf

混控要等到10月分了呀。
一直想玩个飞翼,但是在论坛上潜水发现都说飞翼比较难控制。飞直机的时候有陀螺仪,现在还有1个0704和一个FUTABA GY401,控是天八2.4G。
前段时间学习了下AVR单片机,觉得用最小系统板就可以实现这个混控了。

慢慢来吧,反正连飞翼都没有。

舵机有3颗85mg bb,电机就多了,什么1806有3个,还有几个也说不上牌号的,电调也有。


准备定制专用翼型的机翼,看能不能做个没有垂尾的飞翼。

翼展想大点,还要能组合的。虽然有车,不过运输途中体积越小越好啊。

翼展多大好?初步定1600mm吧。



其实单片机有3个,一个avr16,一个avr32,还有一个avr128,应该用avr16 + 8M 晶振就可以了。

进度不会很快,因为还有别的事。虽然大女儿放假了准备去上高中,但还有个2岁半的小女儿要我陪啊。

先上个小女儿最近学游泳的视频吧

视频地址:http://www.56.com/u55/v_NzAwNTE4Mjg.html#fromoutpvid=NzAwNTE4Mjg
http://player.56.com/v_NzAwNTE4Mjg.swf

[ 本帖最后由 n44303 于 2012-8-18 13:35 编辑 ]
作者: n44303    时间: 2012-7-23 23:00
标题: 占楼-系统图
这里准备贴混控器1

[ 本帖最后由 n44303 于 2012-7-26 15:15 编辑 ]
作者: n44303    时间: 2012-7-23 23:01
标题: 占楼
这里应该还是混控器
作者: n44303    时间: 2012-7-23 23:02
标题: 占楼
这里准备贴机翼
作者: n44303    时间: 2012-7-23 23:03
标题: 占楼
这里准备贴组装
作者: n44303    时间: 2012-7-23 23:07
标题: 占楼
这里备用吧
作者: cola    时间: 2012-7-24 01:49
:em04: 不夠這裡也請用
作者: OSAISAIO    时间: 2012-7-24 02:36
哦,准备阶段:em15: 那这里也给你留着以备不时:em05:
作者: 张灏    时间: 2012-7-24 02:36
:em04:
作者: guanlingfei    时间: 2012-7-24 08:28
厉害
作者: yteng    时间: 2012-7-24 13:14
楼主好幸福啊
作者: n44303    时间: 2012-7-24 13:25
今天在MBP上装了虚拟机,icc avr只能在Win上用。
作者: 17620462    时间: 2012-7-24 16:37
很可爱的女儿

一样是icc的飘过
作者: its5001    时间: 2012-7-25 10:47
:em00:
作者: 铜河    时间: 2012-7-26 09:26
帮LZ占个位。
只是不明白,飞翼用带飞翼混控的遥控器就可直接飞了,还D什么陀螺仪混控器,有什么作用呢?
作者: n44303    时间: 2012-7-26 14:51
标题: 加陀螺仪的目的是保持飞翼飞行中稳定
遥控器的混控是纯手动控制,并且没办法在混控输出通道中用一个陀螺仪控制一个飞翼通道,如果强行要用的话需要在每个轴上使用2个陀螺仪。
就是说要用陀螺仪控制一个2舵机的飞翼的X、Y轴,需要安装4个陀螺仪,并且要求每一个轴上的2个陀螺仪什么感度、灵敏度之类的要尽可能一致。

我准备做的这个混控器准备用2个陀螺仪完美控制X、y2个轴,使得飞翼飞行更加容易,平稳。
作者: airwolf    时间: 2012-7-27 17:19
强帖留名,期待楼主完工!
作者: 578400    时间: 2012-7-27 18:55
tyyty
作者: 岸声    时间: 2012-7-27 21:15
厉害啊:em26:
作者: 高鼻子    时间: 2012-7-27 22:53
太棒了,特意登录顶贴!:em26:
作者: n44303    时间: 2012-7-28 00:15
最近家里来了好多亲戚,不多的时间就更少了。

AVR16有一个16位定时器,如果用它来做输出计数器的话混控器的输出精度可以达到1uS。不过输入捕捉就没了,要用外部中断才行。好在飞翼的控制比较简单,只需要2路输入。

看来用AVR16做这个有些奢侈了:em15:
作者: 铜河    时间: 2012-7-28 07:31
原帖由 n44303 于 2012-7-26 14:51 发表
遥控器的混控是纯手动控制,并且没办法在混控输出通道中用一个陀螺仪控制一个飞翼通道,如果强行要用的话需要在每个轴上使用2个陀螺仪。
就是说要用陀螺仪控制一个2舵机的飞翼的X、Y轴,需要安装4个陀螺仪,并且要求 ...
大约明白LZ的意思了:就是在不动摇杆的时候,保持副翼和升降方向的稳定?
买一个现成的混控器就可以了,淘宝20元左右。
作者: pangchen    时间: 2012-7-28 10:16
好可爱啊!!:loveliness:
作者: n44303    时间: 2012-7-29 12:27
原帖由 铜河 于 2012-7-28 07:31 发表
大约明白LZ的意思了:就是在不动摇杆的时候,保持副翼和升降方向的稳定?
买一个现成的混控器就可以了,淘宝20元左右。


用现成的混控一来速度慢、滞后严重,二来少了DIY的乐趣了。再说我那些单片机反正闲着也是闲着,还可以巩固一下单片机的知识。

好处多多啊。:em15: :em15:
作者: n44303    时间: 2012-7-29 13:02
标题: 用M16或者M32实现2通道输出
用16位计数器的比较匹配输出功能实现2通道输出控制。

输出频率先定为100Hz,也就是10mS的周期,比普通的50Hz快一倍,但也没有333Hz那么快。飞翼还是没有那个必要的:em15:

就2个通道的输出,就没有必要用数组了

int   ch_in_01,                    //存储ch1的输入值,来自接收器
        ch_in_02,                 //存储ch2的输入值,来自接收器
        ch_out_01,         //存储ch1的输出值,直接作为舵机信号线的驱动信号
        ch_out_02,         //存储ch2的输出值,直接作为舵机信号线的驱动信号
        out_f = 100;         //设置驱动信号输出频率,单位Hz;今后可以方便的修改为50Hz或者333Hz

//TIMER1 initialize - prescale:8
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 10000uSec
// actual value: 10000.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
  OCR1A = ch_out_01;
  OCR1B = ch_out_02;
  ICR1  = out_f*100*2;//16M晶振;8分频;实际TOP数值为20000;TOP值可以用“out_f”进行修改;
TCCR1A|= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);        //OC1A/B 比较匹配时输出低电平;WGM13:WGM10配置TC1为快速PWM、TOP值=ICR1;
TCCR1B|= (1<<WGM13)|(1<<WGM12)|(1<<CS11);        //时钟8分频,每2个时钟=1uS;
}
作者: k600    时间: 2012-7-31 17:04
标题: DDD
DDD
作者: FY-Able    时间: 2012-7-31 17:18
NICE:em15:
作者: n44303    时间: 2012-7-31 23:49
昨晚把输入检测写好了,现在手机上网,明天贴上来。

可以贴上了:

//ICC-AVR application builder : 2012/7/27 17:49:05
// Target : M16
// Crystal: 16.000Mhz

#include <iom16v.h>
#include <macros.h>


int out_f = 100,
//设置输出频率,单位Hz

ch_in_01,
   
//存储ch1的输入值

ch_in_02,
//存储ch2的输入值

ch_out_01,
//存储ch1的输出值

ch_out_02,
//存储ch2的输出值

int0_rising,

int0_falling,

int1_rising,

int1_falling;


char int0_ovf_count,

int1_ovf_count;
  //这里记录上升沿后timer1的溢出次数


void port_init(void)
{
PORTA = 0x0F;
DDRA  = 0xF0;
//PORTA最高4位为输出端口
PORTB = 0xFF;
DDRB  = 0x00;
PORTC = 0xFF;
DDRC  = 0x00;
PORTD = 0xFF;
DDRD  = 0x30;
}

//TIMER1 initialize - prescale:8
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 10000uSec
// actual value: 10000.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00;
  //stop
TCNT1H = 0x00;
  //setup
TCNT1L = 0x00;
  OCR1A = ch_out_01;
  OCR1B = ch_out_02;
  ICR1  = out_f*100*2;
   

//16M晶振;8分频;实际TOP数值为20000;TOP值可以用“out_f”进行修改;
TCCR1A|= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);
//OC1A/B 比较匹配时输出低电平;WGM13:WGM10配置TC1为快速PWM、TOP值=ICR1;
TCCR1B|= (1<<WGM13)|(1<<WGM12)|(1<<CS11);
//时钟8分频,每2个时钟=1uS;
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
int0_ovf_count++;
int1_ovf_count++;

ch_out_01 = (unsigned long)ch_in_01/100*75+(ch_in_02>>1);
//更新ch1的输出值

ch_out_02 = (unsigned long)ch_in_01/100*75-(ch_in_02>>1);
//更新ch2的输出值
}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{//external interupt on INT0  PD2

if(PIND & 0x04)//如果PD2为高电平,证明是上升沿触发

{

int0_rising = TCNT1;

int0_ovf_count = 0;

}

else

{

int0_falling = TCNT1;
//读取当前寄存器数值

ch_in_01 =(unsigned long)int0_ovf_count*ICR1+(unsigned long)int0_falling-(unsigned long)int0_rising;

}
}

#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{//external interupt on INT1 PD3

if(PIND & 0x08)//如果PD3为高电平,证明是上升沿触发

{

int1_rising = TCNT1;

int1_ovf_count = 0;

}

else

{

int1_falling = TCNT1;
//读取当前寄存器数值

ch_in_02 =(unsigned long)int1_ovf_count*ICR1+(unsigned long)int1_falling-(unsigned long)int1_rising;

}
}


//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
TIMSK |= 1<<TOIE1;   
  
//开timer1溢出中断

  GICR |= (1<<INT1)|(1<<INT0);
//开启外部中断int1,int0
MCUCR |= (1<<ISC10)|(1<<ISC00);
  
//设置int1,int0电平变化触发中断
SEI(); //re-enable interrupts
//all peripherals are now initialized
}








void main(void)
{
init_devices();
while(1)
{
;
}

}

[ 本帖最后由 n44303 于 2012-8-1 23:43 编辑 ]
作者: 铜河    时间: 2012-8-4 10:35
不错,程序都出来了。不知调通没?
看了上面程序,感觉有个地方可小小改进一下,现提出探讨:
TC1在TOP值为ICR1的快速PWM模式下,当计数器计到ICR1+1后,会自动清0,在溢出中断中可以省去清0的语句,省去两个时钟周期的中断时长。
作者: ilrbrc    时间: 2012-8-4 21:11
顶了
作者: n44303    时间: 2012-8-4 21:49
原帖由 铜河 于 2012-8-4 10:35 发表
不错,程序都出来了。不知调通没?
看了上面程序,感觉有个地方可小小改进一下,现提出探讨:
TC1在TOP值为ICR1的快速PWM模式下,当计数器计到ICR1+1后,会自动清0,在溢出中断中可以省去清0的语句,省去两个时钟周 ...

接受
调通很容易,问题是混控程序还没有搞好,有什么好的建议么?
作者: n44303    时间: 2012-8-10 12:19
标题: 混控没时间搞,确有了意外的收获
:em15:

没耐心拖到中间看,呵呵。

http://player.56.com/v_NzA5MDU1OTk.swf
作者: n44303    时间: 2012-8-15 02:01
没人关注啊
作者: magong    时间: 2012-8-15 04:20
这个其实有简单的办法。随便找个 MCPX, GCP 的主板上面带了三维陀螺仪。
还是数字的。芯片是 xmega 的,比 mega 还要好。然后就是编程就行了。
你这个读 gyro PPM 的输出频率太慢了,比较难做。
作者: buknwbg    时间: 2012-8-16 10:21
看中LZ的手提。。是苹果的吧。。
作者: n44303    时间: 2012-8-16 12:52
原帖由 buknwbg 于 2012-8-16 10:21 发表
看中LZ的手提。。是苹果的吧。。

Apple MBP
作者: 759919499    时间: 2012-8-17 12:05
:em26:
作者: 依薇特    时间: 2012-8-22 13:04

作者: xccdb    时间: 2012-8-22 13:39
占楼看更新,真是幸福的人:em15:
作者: n44303    时间: 2012-10-11 11:21

作者: 苍龙    时间: 2012-10-11 17:19
不错
作者: zzzx000321    时间: 2012-10-14 15:22





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com/) Powered by Discuz! X3.3