Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 7087|回復: 5
打印 上一主題 下一主題

伺服馬達Futaba S3003

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-28 20:26:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想問點先可以令到個Futaba S3003向後郁嫁??????
2#
發表於 2007-8-29 22:09:25 | 只看該作者
原帖由 森涼 於 2007-8-28 20:26 發表
我想問點先可以令到個Futaba S3003向後郁嫁??????

大大,看不懂您的意思喔。
3#
 樓主| 發表於 2007-8-30 15:44:05 | 只看該作者
姐係咁
我用緊ATmega8 control隻Futaba S3003
佢而+就逆時針咁轉
但係我想佢順時針咁轉
想睇下各位大大識唔識點寫個果programme
4#
發表於 2007-8-31 18:03:17 | 只看該作者
你的意思是說你的SCM只能逆時針轉
不能順時針轉動嗎???
所以你希望我門幫你想程式???

基本上你如果能讓他逆時針轉的話
那你順時針轉動只要改變你逆時針的脈波就行了
試試看吧
看你的SCM要多少脈波竟能順時針轉動
5#
發表於 2007-8-31 18:49:49 | 只看該作者
這是我以前用 Attiny2313 的程式
用 WinAVR (GCC-4.1) 去寫的, 程式應該很容易移植,
因為只要調整晶體振盪器的數值跟暫存器名稱應該就可以用了!
  1. #include "avr/io.h"
  2. #include "avr/interrupt.h"

  3. #define SERVO_MIDDLE          1350
  4. #define SERVO(x)                 (SERVO_MIDDLE + (x))*2
  5. #define SERVO_MIDDLE2          1520
  6. #define SERVO2(x)                 (SERVO_MIDDLE2 + (x))*2
  7. #define FORWARD                 0
  8. #define BACKWARD                 1

  9. long servoCommand=0, servoCommand2=0;
  10. unsigned int dcCommandSpeed=0, dcCommandDir=0, dcStop = 0;


  11. void port_init(void)
  12. {
  13.         PORTA = 0x00;
  14.         DDRA = 0x00;
  15.         PORTB = 0x00;
  16.         DDRB = 0xFF;
  17.         PORTD = 0x00;
  18.         DDRD = _BV(PD5);

  19.         // 啟動外部中斷
  20.         MCUCR |= _BV(ISC10);
  21.         GIMSK |= _BV(INT1);
  22. }

  23. void timer0_init(void)
  24. {
  25.         TCCR0B = 0x00;
  26.         TCNT0  = 256-100;
  27.         OCR0A  = 256-100;
  28.         OCR0B  = 256-100;
  29.         TCCR0A = 0x03;
  30.         TCCR0B = 0x05;
  31.         TIMSK |= _BV(TOIE0);
  32. }

  33. void timer1_init(void)
  34. {
  35.         TCCR1B = 0x00;
  36.         TCNT1H = 0x00;
  37.         TCNT1L = 0x00;
  38.         ICR1   = (unsigned long)20000*2-1;
  39.         OCR1A  = SERVO(0);
  40.         OCR1B  = SERVO(0);
  41.         TCCR1A = 0xA2;
  42.         TCCR1B = 0x1A;
  43.         TIMSK |= _BV(TOIE1);
  44. }

  45. //UART0 initialize
  46. // desired baud rate: 9600
  47. // actual: baud rate:9615 (0.2%)
  48. void UartInit(void)
  49. {
  50.         UCSRB = 0x00;
  51.         UBRRH = 0x00;
  52.         UBRRL = 0x67;
  53.         UCSRA = 0x00;
  54.         UCSRC = 0x06;
  55.         UCSRB = _BV(RXCIE)|_BV(RXEN);
  56. }

  57. void AVRInit(void)
  58. {
  59.         cli();
  60.         port_init();
  61.         timer0_init();
  62.         timer1_init();
  63.         UartInit();
  64.         sei();
  65. }

  66. SIGNAL(SIG_OVERFLOW1)
  67. {
  68.         // Servo Load New Position
  69.         OCR1A = SERVO(servoCommand);
  70.         OCR1B = SERVO2(servoCommand2);
  71.         if ( dcStop ) {
  72.                 OCR1B = SERVO2(0);
  73.         }
  74. }

  75. SIGNAL(SIG_OVERFLOW0)
  76. {
  77.         TCNT0 = 256 - 100;
  78.         // Servo Load New Position
  79.         PORTD &= ~_BV(PD5);
  80.         PORTB &= ~_BV(PB2);
  81.         
  82.         if ( !dcCommandSpeed || dcStop) {
  83.                 TCCR0A &= ~(0xF0);
  84.                 TCCR0A |= 0xA0;

  85.         } else if ( !dcCommandDir && dcCommandSpeed/* == FORWARD*/ ) {
  86.         PORTB |= _BV(PB2);
  87.                 OCR0A = (256-100) + dcCommandSpeed;
  88.         TCCR0A &= ~(0xF0);
  89.                 TCCR0A |= 0x80;
  90.         
  91.         } else if (  dcCommandDir && dcCommandSpeed/*== BACKWARD*/ ) {
  92.         PORTD |= _BV(PD5);
  93.                 OCR0B = (256-100) + dcCommandSpeed;
  94.         TCCR0A &= ~(0xF0);
  95.                 TCCR0A |= 0x20;
  96.         }
  97. }


  98. SIGNAL( SIG_USART0_RX )
  99. {
  100.         char ch = UDR;
  101.         if ( ch == 'S' ) {
  102.                 // 初始化或重置控制板
  103.                 // 將伺服馬達設為中心
  104.                 servoCommand = 0;
  105.                 servoCommand2= 0;
  106.                 // DutyCycle = 0 %
  107.                 dcCommandSpeed = 0;
  108.                 dcCommandDir = FORWARD;
  109.         } else if ( ch >= 'A' && ch <= 'G' ) {
  110.                 // 控制轉向, 將 Ascii 'A' ~ 'G' 轉為數字 n = 2 ~ 8
  111.                 // (n+15)*50uS = 伺服馬達方向
  112.                 ch = ch - 'D';
  113.                 servoCommand = ch*50;
  114.         } else if ( ch >= '1' && ch <= '9' ) {
  115.                 ch = ch - '5';
  116.                 servoCommand2 = ch*50;
  117.                 if( ch == 4 )
  118.                         servoCommand2 = ch * 100;
  119.                 // 控制 DutyCycle, 將 Ascii '0' ~ '9' 轉為數字 0 ~ 9
  120.                 //ch = ch - '0';
  121.                 //dcCommandSpeed = ch*10;
  122.                 // 設定行徑方向向前
  123.                 //dcCommandDir = FORWARD;
  124.         } else {
  125.                 // 接收到錯誤命令
  126.                 // 避免 Compiler 產生警告
  127.         }

  128. }

  129. SIGNAL( SIG_INT1 )
  130. {
  131.         // 車體前方停止鍵被按下
  132.         // 將直流馬達控制關閉
  133.         dcStop = !dcStop;
  134. }


  135. int main(void)
  136. {
  137.         AVRInit();        

  138.         while(1);
  139.         return 0;
  140. }
複製代碼

[ 本帖最後由 TroyLee 於 2007-8-31 18:56 編輯 ]
6#
發表於 2007-8-31 18:55:07 | 只看該作者
抱歉剛剛仔細看了這是比較舊版的程式碼...
新版的跑不見了......

我大概跟你說一下, 程式是靠 Timer1 (16bit) 的 Output Compare 去產生 Servo Pulse
總共會有兩組, 分別輸出在 OC1A 和 OC1B 接腳,
硬體的設定大概是 16MHz 的振盪器,
UART 跑 9600 bps

#define SERVO_MIDDLE    1350
這個用來設定第一個 Servo 開機之後的中立點
#define SERVO(x)
用來計算位置的,
那程式要改的大概就是這邊跟 UART RX 的 ISR
可以自己定傳輸的方式...


應該不難理解吧@@
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-27 19:20 , Processed in 0.222522 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表