5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 3392|回复: 19
打印 上一主题 下一主题

我用AVR MEGA128写的一个电调程序

[复制链接]
跳转到指定楼层
楼主
发表于 2005-4-2 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个电调是我用我公司实验室里的电路板飞线做的(那板是仪器里拆出来的),接收机的输出用信号发生器来模拟的,用信号发生器试验已成功,当时IRF管用的是16A的IRF530,实验后我买了MEGA8和MEGA16做一个真实放到船上试的,但不知为什么我的这个网上买的二个MEGA8都下载不到,MEGA16能下,但我移植了一下,不知为什么不行,近来公司又有新的项目所以无时间了,拿出来和大家分享一下算了,本了用AVR只是玩玩,所以可能有错的地方.用ICC写的,原理简单,有条件的朋友可以玩玩


//ICC-AVR application builder : 2005-3-23 10:23:44
// Target : M128
// Crystal: 16.000Mhz

#include <iom128v.h>
#include <macros.h>


unsigned int up,down,a;
unsigned int T;

void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
PORTE = 0xFF;
DDRE  = 0x00;
PORTF = 0xFF;
DDRF  = 0x00;
PORTG = 0x1F;
DDRG  = 0x00;
}

//TIMER0 initialisation - prescale:64
// WGM: PWM Fast
// desired value: 1.5KHz
// actual value:  0.977KHz (-53.6%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT0 = 0x00; //set count
OCR0  = 0xFF;
TCCR0 = 0x7C; //start timer
}



//TIMER1 initialisation - prescale:1
// WGM: 15) PWM fast, TOP=OCRnA
// desired value: 1uSec
// actual value:  1.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xF1;
OCR1AH = 0xFF;   //OCR1AH = 0x29;
OCR1AL = 0xFF;   //OCR1AL = 0xA9;
OCR1BH = 0x11;
OCR1BL = 0x11;
OCR1CH = 0x00;
OCR1CL = 0x00;
ICR1H  = 0x00;
ICR1L  = 0x00;
TCCR1A = 0x33;
TCCR1B = 0xD9; //start Timer
}

#pragma interrupt_handler timer1_capt_isr:12
void timer1_capt_isr(void)
{
  if((TCCR1B&0x40)==0)
  {
  
  down=ICR1L;            //Read low byte first (important)
  down|=(int)ICR1H << 8; //Read high byte and shift into top byte
   T=down/16;
   //OCR1B=T;
   //if(T>=1000)
   //{T=1000;}
    //OCR0  = 254;
          a=T;
        //T=T-994;
       
        if(T<=994)
        OCR0=0x00;
        else
        if(T>=1994)
        OCR0=0xFF;
        else
   OCR0  = (T/3.921);
  // a=T/4;
printf("T=%u,down=%u,a=%d\n",T,down,a);
  TCCR1B^=0x40;
TIFR=(1<<ICF1);
/*

//TCNT1=0;
//timer 1 input capture event, read (int)value in ICR1 using;
down=ICR1L;            //Read low byte first (important)
down|=(int)ICR1H << 8; //Read high byte and shift into top byte
ICR1=0;
TCNT1=0;
  a=down-up;
  T=a/16;
OCR1B = T;
TCCR1B^=0x40;
TIFR=(1<<ICF1);
printf("T=%d,down=%d,up=%d\n",T,down,up);


*/
}
else
{
TCNT1=0;
TCCR1B^=0x40;
TIFR=(1<<ICF1);

/*

up=ICR1L;            //Read low byte first (important)
up|=(int)ICR1H << 8; //Read high byte and shift into top byte
ICR1=0;

TCCR1B^=0x40;
TIFR=(1<<ICF1);


*/
}
}

//UART0 initialisation
// desired baud rate: 11520
// actual: baud rate:11520
// char size: 8 bit
// parity: Disabled

void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x08; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x18;
}

//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
timer1_init();
uart0_init();
timer0_init();


MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x20; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

void main(void)
{
int T,up,down,a;
  a='d';
init_devices();
  printf("ok!");
while(1)
{
   //printf("%u",T);
}

}

欢迎继续阅读楼主其他信息

头像被屏蔽
沙发
发表于 2005-4-6 22:59 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
3
发表于 2005-4-7 04:05 | 只看该作者
:em26:谢谢,收藏
4
发表于 2005-5-24 22:29 | 只看该作者
有C51的吗?
5
发表于 2005-5-27 22:03 | 只看该作者
虽然我不懂,但还是要尊重你的劳动,强顶一下!!
6
 楼主| 发表于 2005-5-28 09:15 | 只看该作者
这个星期写一个计算里电冲电容量的
7
发表于 2005-7-3 21:29 | 只看该作者
mega8和其他AVR片子不一样,不能用jtag下载:)
8
发表于 2005-7-9 09:14 | 只看该作者
tshh  在 2005-7-3 09:29 PM 发表:

mega8和其他AVR片子不一样,不能用jtag下载:)

咳!JTAG用不了,用ISP不就OK了么!!!
:em15:
反正ISP的什么都能下,就是麻烦点!:em15:不能断点测试
9
发表于 2005-11-29 15:25 | 只看该作者

程序怎么好象很小呀

10
发表于 2005-11-29 16:39 | 只看该作者
我比较贪心,电路图呢。。。。。。
11
发表于 2005-11-29 19:08 | 只看该作者
没图,没说明,就没用啊!!!
12
发表于 2005-12-1 08:54 | 只看该作者

能解释一下你这个程序的思路吗?

能不能解释一下你这个程序的思路啊?或者给个电路图,可以吗?
13
发表于 2005-12-1 17:20 | 只看该作者
有钱人竟然用m128作电调!
14
发表于 2005-12-1 18:05 | 只看该作者
有没有BGA封装的?不然太大
15
发表于 2005-12-4 09:34 | 只看该作者
16
发表于 2005-12-4 21:59 | 只看该作者
用M128只是拿来写程序罢了!我还用ARM7写呢!(LPC2138写的)这没什么,楼主做克不可能用M128做。M8那么便宜用M128做没任何意义。有可能是楼主没有M8的板子才用M128写的。楼上有个朋友问有没有BGA的。老兄你不去市场问问用BGA的成本会高多少!看来你不是搞电子的,呵呵!不过M8和M128都有MLF封装的(比TQFP小),不过批量不大成本也很高。需要X光监测焊接的可靠性!这不是一般的公司能搞得起的,没有点实力根本没法搞。而且MLF封装的在国内很难买,一般都是一板以上才从国外发货过来!所以国内的无刷没有一个赶用MLF.因为他们没有那个实力!呵呵!
17
发表于 2005-12-16 13:26 | 只看该作者
TQFP的并比MLF的大多少,几平方毫米而已.占地方的是MOSFET.太挤了还可能过热.
电调用MEGA8足够了.其实TINY系列就可以.
业余情况下MLF也可以可靠焊接,但BGA就只有看运气了.BGA在这种场合下发挥不了什么优越性.
对了,楼主的TIMER0设置可能有问题,你看看.
M8不支持JTAG,得用ISP下载,或者STK500.
18
发表于 2005-12-17 08:22 | 只看该作者

顶 顶

19
发表于 2005-12-17 10:36 | 只看该作者

楼主能给出电路图吗?我们还可以继续你未竟的事业呀

20
发表于 2005-12-20 15:48 | 只看该作者
楼主试了没有,行不行咯
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表