yuerxie 发表于 2009-11-13 14:36:27

请教关于德国电机驱动程序

有没有人读过德国的电机驱动程序呢   可不可以比较仔细的讲解一下 本人新手 这个程序有很多不懂的地方 希望可以大家互相探讨哈~~

z1234 发表于 2009-11-13 15:10:32

第一次看到,电机驱动程序是按国别进行区分的,看来这是个”新趋势“我要做第一个中国的电机驱动程序,别说我牛,我的驱动不能驱动的电机估计都不是中国的。呵呵

niceboat 发表于 2009-11-13 17:46:42

没看到楼主的程序?请上传代码先。

yuerxie 发表于 2009-11-13 19:51:00

包括程序和原理图ourdev_502943.rar(文件大小:193K) (原文件名:德国开源程序.rar)

yuerxie 发表于 2009-11-13 19:51:53

大家看后可以一起讨论啊 有很多不明白的地方 大家可以一起解决

caosix 发表于 2009-11-25 16:57:15

大家把重点还是放到::自主飞行控制吧!!____电调____只要弄完成任务,能正常使用就可以了,,花费太多力气不太必要吧!!

liufeng 发表于 2009-11-25 23:43:05

我不同意五楼的观点,电机的驱动是最最底层的东西,也可以说是整个系统性能好坏的关键。强烈建议哪位高手给大家讲解下电调程序。

sunguobing 发表于 2009-11-26 10:11:13

看了很久电调的资料还是不明白,望解释

sunguobing 发表于 2009-12-1 09:11:14

如果要了解整个四旋翼的具体工作原理,从而达到学习硬件相关知识,那么每一步都很重要,飞控部分的算法固然是最重要的,但是如果是新手,或者只是想做一个玩玩,那就没有必要深究,看来我还是慢慢学

sunguobing 发表于 2009-12-3 07:39:56

这个不能沉,急切的想知道

yangyh75 发表于 2009-12-3 10:32:28

德国程序很复杂,看看我自己写的M48程序——
int i2c_cmd=127;             //设置接口变量,将"twislave.c"里的i2c油门型号引用到"main.c"里面
unsigned char bldc_rpm=0;   //定义从机当前转速以便传递给主机。
int count_rpm=0;            //用于记录霍尔变化的次数,与时间片计算出即时转速。
int count_time=0;         //用于累计定时器溢出的中断次数,从而得到一个时间片段。
unsigned char PWM_UP=0;
unsigned char PWM_LOW=0;
char dir = 1;
int adj_cmd=0;
char flag=1;



void PORT_Init(void)//端口初始化。
{
PORTB = 0X00;
DDRB = 0X01;    //PB0-LED;PB1-OC1A;PB2-OC1B;PB3-OC2A
PORTD = 0X00;
DDRD = 0X80;    //PD3-OC2B;PD5-OC0B;PD6-OC0A;PD0-PD1-PD2霍尔输入;PD7故障指示。
}


void Timer0_Init(void)//定时器0初始化。
{

TCNT0 = 0x00;
TCCR0B = 0X01;
TIMSK0 = 0x01; //timer 0 overflow interrupt sources,中断初始化定时器0

OCR0A = 0;   //*****无指令时输出o********   
OCR0B = 0;   //*****无指令时输出o********   

}


void Timer1_Init(void)//定时器1初始化。
{

TCNT1 = 0x00;
TCCR1B = 0X01;

OCR1A = 0;   //*****无指令时输出o********   
OCR1B = 0;   //*****无指令时输出o********   

}

void Timer2_Init(void)//定时器2初始化。
{

TCNT2 = 0x00;
TCCR2B = 0X01;

OCR2A = 0;   //*****无指令时输出o********   
OCR2B = 0;   //*****无指令时输出o********   


}



void run(void)//运行函数,用于旋转方向选择和换相表调用。
{
//change_phase_function_CCW();
if(dir==1)change_phase_function_CW();
else if(dir==0)change_phase_function_CCW();
}


//绝对值函数
int ABS(int val)      
{   
    if(val>=0) return val;   
    else return (-val);   
}



void pwm(int pwm_cmd)//PWM宽度产生函数,将i2c_cmd指令变化为定时器的脉冲宽度。并生成方向标志。
{
   
   
    pwm_cmd=pwm_cmd-127;//计算与过渡点的差值。
   
    if(pwm_cmd<0)    //
    {
      dir=0;//计算出正反转的方向标志,127为正反转过渡点。
      PORTD&=0b01111111;//PD7为方向指示灯,将其关闭。
    }
    else if(pwm_cmd>0)
{
       dir=1;
       PORTD|=0b10000000;//PD7为方向指示灯,将其点亮。
}

    pwm_cmd=ABS(pwm_cmd);//计算与过渡点的差值的绝对值。
   
    pwm_cmd=255-(pwm_cmd*2);//还原转速指令,255最大。   

   
if(adj_cmd<pwm_cmd) adj_cmd++;//pwm有变化时才赋值定时器匹配值。
    else adj_cmd--;
   
   
//bldc_rpm=pwm_cmd;
    PWM_UP= adj_cmd;
    PWM_LOW= adj_cmd+1;
   
    if(PWM_UP>=253)PWM_UP = 253;    //封顶高端管pwm
    if(PWM_LOW>=254)PWM_LOW = 254;//封顶低端管pwm
   
    OCR0A = PWM_UP;
    OCR0B = PWM_LOW;
   
    OCR1A = PWM_UP;
    OCR1B = PWM_LOW;
   
    OCR2A = PWM_UP;
    OCR2B = PWM_LOW;
   
    //last_cmd=pwm_cmd;
   

}


/*******************************************/
/*霍尔信号电平变化中断*/
/*******************************************/
SIGNAL(SIG_PIN_CHANGE2)         
{
    //TCNT0 = 0x00;
//TCNT1 = 0x00;
//TCNT2 = 0x00;
//count_rpm++;             //累计转速
    //close_drive_function();//捕捉换向后,首选关闭输出。
PORTB^=0b00000001;       //霍尔信号变化,则工作指示灯不断闪
run();                   //运转bldc
    flag=1;
}

//定时器0溢出中断函数
SIGNAL(SIG_OVERFLOW0)
{
//pwm(i2c_cmd);         //调用pwm函数将I2C指令转速赋值给定时器,以产生需要的脉冲宽度。
   
count_time++;         //累计时间片
if(count_time>=9)
{
    flag=0;
    count_time=0;
}
   
//if (count_time>=900)//16khz的pwm周期大约为60us,900个周期为50ms,功率管堵转保护。
{
   
//if(PWM_UP!=0&&count_rpm<3)    //大约每分钟15转,小于则堵转保护。
{
//close_drive_function();//堵转保护,关闭输出。
//PORTD^=0b10000000;       //故障时,则工作指示灯不断闪
//PWM_UP=0;
}
//else PORTD&=0b01111111;       //故障恢复,则工作指示灯停止闪

    //bldc_rpm=(count_rpm)/126*20;//计算出RPM,21极bldc,每转产生21×6=126个状态。
    //count_time=0;
//count_rpm=0;

}
   
}



int main(void)
{
   
PORT_Init();
Timer0_Init();
Timer1_Init();
Timer2_Init();
   
PCICR=0b00000100;    //使能第二组引脚中断。
PCMSK2=0b0000111;    //使能PCINT16,PCINT17和PCINT18的引脚电平变化中断,以捕获霍尔信号

SREG|=0b10000000;    //开总中断
   
//_delay_ms(30);       //大约延时30ms

pwm(i2c_cmd);         //调用pwm函数将I2C指令转速赋值给定时器,以产生需要的脉冲宽度。
   
run();               //启动后进行霍尔状态的一次识别。
   
InitIC2_Slave(0x50); //设置I2C地址,并启动I2C总线。
   
while(1)
   
{
   if (flag==1)    //换相补偿,换相后由于感性负载电流滞后,将前9个脉冲宽度加大,
{               //以使换相后电流快速上升到换相前水平。   
OCR0A = 255-5*count_time;
      OCR0B = 255-5*count_time;
   
      OCR1A = 255-5*count_time;
      OCR1B = 255-5*count_time;
   
      OCR2A = 255-5*count_time;
      OCR2B = 255-5*count_time;
}
else pwm(i2c_cmd);         //调用pwm函数将I2C指令转速赋值给定时器,以产生需要的脉冲宽度。

; }
   
}

happyfuying 发表于 2009-12-13 22:53:26

你这电调程序时带霍尔的么,

zhengque881002 发表于 2010-1-25 13:26:54

回复【楼主位】yuerxie
-----------------------------------------------------------------------

可不可以帮我写一个飞思卡尔芯片控制电机转的程序啊,我只能勉强看一些程序,实在是不会写,C51的也行。

guoreny 发表于 2012-1-28 23:24:36

MARK

MrLCL 发表于 2012-1-29 09:12:55

回复【5楼】caosix
-----------------------------------------------------------------------

同意
页: [1]
查看完整版本: 请教关于德国电机驱动程序