我以前发过几个老贴是关于电直电子设备的DIY,其中混控是最后搞出来的,有些东西没有和大家分享.今天上来收到jackyzh的留言,希望我能够把混控的电路图和程序公布出来.这没有什么需要保密的商业秘密,又不是很复杂,所以我决定就如其所愿.
我想先谈谈我的电直DIY历程,希望能够对各位有所帮助和借鉴.今年年初商场有一款238的jabo空机架卖,当时我头脑一热就买下来了.回来后就开始配置电子设备,让我的jabo能飞起来.jabo的电子设备包括主电机的有刷电调,尾电机的有刷电调,陀螺,混控,发射接收,舵机,以及一个5V的电源。发射接收电路有但没外壳,所以买了一套FUTABA4通的;舵机手上是现成的,有8、9个;陀螺本想搞个压电晶体自己做的,可是网友送了偶二个陀螺,这个也免了;下面的是重点:
5V的电源:这个5V的电源就是大家所说的BEC(我不懂为什么叫这个,好深奥哦^_^),其实就是一个DCDC把电池的直流电压转换为陀螺,混控,接收,舵机所需的5V直流电压,电调上的运放、单片机也要用。一般电调上常用7805的稳压管来出这个5V,但这容易出问题——舵机工作时电流是比较大的,大概3、400mA(单个),再加上一些其它的设备,整个5V的负载电流经常超过1A,用7805就感觉很吃力了。7805是线型稳压管,缺点是电压转换效率比较低,发热量大,输出电流小,而优点是纹波小,价格便宜。我采用的方案是MAX724开关电源,优点是输出电流大(最大5A),电压转换效率高,发热量小,而缺点是纹波稍大(不过对电直没什么影响),价格稍高(20元左右吧)。大家可以直接采用官方PDF文档中的推荐电路,在这个地址查看下载http://www.maxim-ic.com.cn/pdfserv/en/ds/MAX724-MAX726.pdf
有刷电调:原理是通过接收产生的周期为20ms,1.5ms±0.5ms的脉冲来控制PWM的占空比,从而用MOSFET来控制通过电机的电流,达到控制转速的目的。低端的有刷电调是直接用运放等对接收产生的信号处理来产生PWM控制波形,无非就是一些波形的变换。这样成本很低,也很适合DIY制作,但频率固定在50Hz,论坛里有很多这方面的资料我就不重复了。中高端的有刷电调一般用的是单片机,PIC的12C508/9用的比较多(电路简单,但不比第一种的好)。我用的是TINY13的单片机自带PWM发生器,可以产生较高频率的PWM波形,控制通过电机的电流就比第一种要平滑。不要问我要程序,自己学!要不然就不是DIY了。
混控:这个我走了很多弯路,论坛上这方面很少。这个一定要用单片机,我选的是ATMEGA8。算法:OUT=(α-1)*60%+(β-1.5)+1。out是输出波形,α是接收产生的主电机输入波形(周期为20ms,1ms-2ms的脉冲波形),β是接收产生的尾电机输入波形(周期为20ms,1.5ms±0.5ms的脉冲波形)。这个算法是自己琢磨出来的,让大家见笑了!欢迎回帖讨论。电路方面很简单就是一个ATMEGA8的单片机和一个3.3V的电源。程序是一位朋友帮我写的,希望他不要介意,在此表示由衷的感谢。程序如下:
/***********************************************
Chip type : ATmega8L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
//第一路输入为PD2,第二路输入为PD3,输出为PB1
#include <mega8.h>
#include <delay.h>
unsigned int T0_CNT,T2_CNT;
unsigned int T0_LENGTH,T2_LENGTH;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) // 第一路输入的脉宽计数控制
{
delay_us(3);
if(PIND.2==0) //下降沿
{
TCCR0=0x0; //中止计数
T0_LENGTH=T0_CNT*256+TCNT0;
}
else //上升沿
{
TCNT0=0x00;
T0_CNT=0;
TCCR0=0x01; //启动计数
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void) // 第二路输入的脉宽计数控制
{
delay_us(3);
if(PIND.3==0) //下降沿
{
TCCR2=0x0; //中止计数
T2_LENGTH=T2_CNT*256+TCNT2;
}
else //上升沿
{
TCNT2=0x00;
T2_CNT=0;
TCCR2=0x01; //启动计数
}
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void) // 32us中断一次 第一路脉宽计数
{
T0_CNT++;
}
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void) // 32us中断一次 第二路脉宽计数
{
T2_CNT++;
}
void cal_pulse() //根据输入计算输出
{
long a,b,t;
a=T0_LENGTH;
a=a*125;
a=a-1000000;
a=(a*6)/10;
b=T2_LENGTH;
b=b*125;
b=b-1500000;
t=a+b+1000000;
t=t/1000; //转换为us
OCR1A=t; //设定高电平时间
}
void main(void)
{
PORTB=0x00;DDRB=0x02;
PORTC=0x00;DDRC=0x00;
PORTD=0x00;DDRD=0x00;
// Clock value: 8000.000 kHz
TCCR0=0x01;
TCNT0=0x00;
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Inverted
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ICR1=20800; //设定周期为20ms 频率不准,微调800
OCR1A=1000;
// Clock value: 8000.000 kHz
ASSR=0x00;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: On
// INT1 Mode: Any change
GICR|=0xC0;
MCUCR=0x05;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41;
// Analog Comparator: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
T0_CNT=0;
T2_CNT=0;
T0_LENGTH=0;
T2_LENGTH=0;
#asm("sei")
while (1)
{
cal_pulse(); //实时根据输入调整输出
};
}
最后我的jabo飞起来了^_^,不过感觉不爽卖了,现在进了一架X400在折腾,噗哧、噗哧……
^_^
[ 本帖最后由 喜乐蒂 于 2006-10-21 02:04 编辑 ] |