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

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

记录从零开始,制作位置式直流电机伺服驱动

[复制链接]
跳转到指定楼层
楼主
发表于 2011-7-12 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
真正电子,机械,软件都要做的是,在机器人栏目的从零开开始玩自平衡车,同步进行,那个硬件都有的,淘宝都可以收集到所有配件,可能会快些,大家可以关注.
http://bbs.5imx.com/bbs/viewthread.php?tid=510345&extra=page%3D1
伺服驱动要慢慢更新,细节可能比较多,好久没用PIC的单片机了,所以基本是从零开始.烂尾的可能性是非常高的.这个涉及硬件,软件,电机控制,硬件可能焊一次还不行,要焊些调试电路,我也不是电子专业.开始先把软件调试界面上来看下.

[ 本帖最后由 keelai8 于 2011-7-12 23:54 编辑 ]

18.JPG (125.96 KB, 下载次数: 5)

18.JPG

评分

参与人数 2威望 +4 收起 理由
vermon + 2 【发贴鼓励】第一次评分,把所有的分都给你 ...
cpkf + 2 【发贴鼓励】感谢分享,希望继续努力发更多 ...

查看全部评分

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

沙发
 楼主| 发表于 2011-7-12 11:58 | 只看该作者

其实就是一步步把主程序的流程和硬件对应调好

int main(void)
{
int cs;
// vars used for detection of incremental motion
jerk = 0.0;
setup_io();   // make all i/o pins go the right dir
STATUS_LED = 0;  // led on
setup_uart();  // setup the serial interface to the PC
    setup_TMR1();       // set up 1ms timer
IEC0bits.T1IE = 1;  // Enable interrupts for timer 1
         // needed for delays in following routines
// 1/2 seconds startup delay
timer_test = 5000;  
while ( timer_test );
printf("\r\nPowerup..i/o...uart...timer...");
init_pid();
pid.enable = 0;  // turn servo loop off for a while
printf("pid...");
setup_pwm();  // start analog output
set_pwm(0.0);
printf("pwm...");
    setup_encoder();    // 16 bit quadrature encoder module setup
printf("encoder...");
    setup_capture();    // 2 pins with quadrature cmd from PC
printf("capture...");
printf("done\r\n");
// some junk for the serial channel
printf("%s%s\n\r",CPWRT,VERSION);
STATUS_LED = 1;  // led off when init finished
// restore config from eeprom
// Read array named "setupEE" from DataEEPROM and place
// the result into array in RAM named, "setup"
restore_setup();
cs = -calc_cksum(((long int)&pid.cksum - (long int)&pid)/sizeof(int),(int*)&pid);
if ( cs != pid.cksum )
{
  // opps, no valid setup detected
  // assume we are starting from a new box
  printf("No valid setup found in EEPROM 0x%04X\r\n",pid.cksum);
  init_pid();
  while (1 )
  {
   // a very fast flash to indicate no config... serial activity
   // (hopefully the user setting params gets us out of the loop)
      STATUS_LED = 0; timer_test = 500; while ( timer_test );
   STATUS_LED = 1; timer_test = 500; while ( timer_test );
   if ( rxrdy ) break;
  }
}
else
{
  printf("Using setup from eeprom.. ? for help\r\n");
  print_tuning();
}
    printf("using %fms servo loop interval\r\n",pid.ticksperservo * 0.250);
// BLOCK OF TEST ROUTINES FOR HARDWARE DEBUGGING  
// test_pwm_interface();  // play with opa549 hardware
// test_pc_interface();  // echo cmded posn to serial port
while (1)
{
  // check for serial cmds
  if ( rxrdy )
   process_serial_buffer();
  if ( jerk > 0.0 )
  {
   while ( 1 )
   {
    // loop forever until serial active or servo gets disabled
    if ( rxrdy || !SVO_ENABLE )
    {
     jerk = 0.0;
     break;
    }
    pid.command += jerk;
       timer_test = 5000; while ( timer_test );
    pid.command -= jerk;
       timer_test = 5000; while ( timer_test );
   }
  }
        // show we are at drive limit(error)
  if (pid.limit_state)
   STATUS_LED = 0;
  else
   STATUS_LED = 1;
     // check for a drive fault ( posn error > allowed )
     if (( pid.maxerror > 0.0 ) &&
      ( fabs(pid.error) > pid.maxerror ) &&
   SVO_ENABLE )
     {
   pid.enable = 0;  // shut down servo updates
      while (1)         // trap here until svo disabled or pwr cycle
      {
       set_pwm( 0.0 );
       printf("drive fault... maxerror exceeded %f\r\n",(double)pid.error);
       STATUS_LED = 0; timer_test = 2500; while ( timer_test );
    STATUS_LED = 1; timer_test = 2500; while ( timer_test );
    STATUS_LED = 0; timer_test = 2500; while ( timer_test );
    STATUS_LED = 1; timer_test = 2500; while ( timer_test );
    if (!SVO_ENABLE)
     break;
   }
            while ( !SVO_ENABLE ); // wait for us to be enabled
  }
  // check to see if external forces are causing use to change servo status
  if (SVO_ENABLE)
  {
   if ( pid.enable == 0 ) // last loop, servo was off
   {
    pid.enable = 1;
    printf("servo-enabled\r\n>");
    // give the servo loop some time to get established
    timer_test = 2500; while ( timer_test );
   }
  }
  else
  {
   if ( pid.enable == 1 ) // last loop servo was active
   {
    pid.enable = 0;
    printf("servo-disabled\r\n>");
   }
  }
}
// to keep compiler happy....
return 0;
}
3
 楼主| 发表于 2011-7-12 12:02 | 只看该作者

这个程序也很适合入门深入式开发.

这是最先的几行,有一个亮指示灯的动作,所以第一步就先焊好硬件,调试以下入门级的程序先.
int main(void)
{
int cs;
// vars used for detection of incremental motion
jerk = 0.0;
setup_io();   // make all i/o pins go the right dir
STATUS_LED = 0;  // led on
}
后面的几节就是关于指这个硬件的了.
4
发表于 2011-7-12 12:18 | 只看该作者
发这个大部分人看不懂也没兴趣,要引人入胜,就得先发大家都感兴趣的内容。
5
发表于 2011-7-12 12:34 | 只看该作者
不错的记录,跟车学习,顶一下:em15:
6
发表于 2011-7-12 12:44 | 只看该作者
看到一大堆代码,现在就怕看这个,我:em15: 闪
7
发表于 2011-7-12 15:39 | 只看该作者
厉害的楼主,伺服贵就贵在软件上啊,硬件都公式化了
8
发表于 2011-7-12 19:54 | 只看该作者
看不懂,等成品
9
发表于 2011-7-12 20:15 | 只看该作者
捡到一本武林秘籍,无奈看不懂 , 哎:em25:
10
发表于 2011-7-12 22:17 | 只看该作者
软硬兼施才是高手 ,学习了
11
发表于 2011-7-12 23:06 | 只看该作者
看天书
12
 楼主| 发表于 2011-7-12 23:51 | 只看该作者
哈哈,其实早就有把程序组合成图形的软件了,一拉就生成代码,不用看的.
伺服方案现在也不贵,很多人都能买到成套生产方案带样机.关键是成本控制问题,另外也要有一定看代码调试能力,
对于写代码我的年龄已经太老,只能玩这些简单的东西了.
13
发表于 2011-7-13 00:54 | 只看该作者
囫囵吞枣总比不看强,支持下。
14
发表于 2011-7-13 08:33 | 只看该作者
看不懂!代码看着头晕!
15
发表于 2011-7-13 09:18 | 只看该作者
强力支持
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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