搜索
bottom↓
回复: 14

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

[复制链接]

出0入0汤圆

发表于 2009-11-13 14:36:27 | 显示全部楼层 |阅读模式
有没有人读过德国的电机驱动程序呢   可不可以比较仔细的讲解一下 本人新手 这个程序有很多不懂的地方 希望可以大家互相探讨哈~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-11-13 15:10:32 | 显示全部楼层
第一次看到,电机驱动程序是按国别进行区分的,看来这是个”新趋势“我要做第一个中国的电机驱动程序,别说我牛,我的驱动不能驱动的电机估计都不是中国的。呵呵

出0入0汤圆

发表于 2009-11-13 17:46:42 | 显示全部楼层
没看到楼主的程序?请上传代码先。

出0入0汤圆

 楼主| 发表于 2009-11-13 19:51:00 | 显示全部楼层
包括程序和原理图ourdev_502943.rar(文件大小:193K) (原文件名:德国开源程序.rar)

出0入0汤圆

 楼主| 发表于 2009-11-13 19:51:53 | 显示全部楼层
大家看后可以一起讨论啊 有很多不明白的地方 大家可以一起解决

出0入0汤圆

发表于 2009-11-25 16:57:15 | 显示全部楼层
大家把重点还是放到::自主飞行控制吧!!____电调____只要弄完成任务,能正常使用就可以了,,花费太多力气不太必要吧!!

出0入0汤圆

发表于 2009-11-25 23:43:05 | 显示全部楼层
我不同意五楼的观点,电机的驱动是最最底层的东西,也可以说是整个系统性能好坏的关键。强烈建议哪位高手给大家讲解下电调程序。

出0入0汤圆

发表于 2009-11-26 10:11:13 | 显示全部楼层
看了很久电调的资料还是不明白,望解释

出0入0汤圆

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

出0入0汤圆

发表于 2009-12-3 07:39:56 | 显示全部楼层
这个不能沉,急切的想知道

出0入0汤圆

发表于 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指令转速赋值给定时器,以产生需要的脉冲宽度。
  
; }
   
  }

出0入0汤圆

发表于 2009-12-13 22:53:26 | 显示全部楼层
你这电调程序时带霍尔的么,

出0入0汤圆

发表于 2010-1-25 13:26:54 | 显示全部楼层
回复【楼主位】yuerxie
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-1-28 23:24:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-1-29 09:12:55 | 显示全部楼层
回复【5楼】caosix
-----------------------------------------------------------------------

同意
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 21:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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