1.硬體操作

動作說明:使用兩個SG90伺服馬達做為X軸與Y軸方向的轉向馬達,搭配一個搖桿作為轉向控制。當操作控制桿時,伺服馬達會隨搖桿控制幅度轉向至對應的位置。

控制板:Arduino UNO

材料: 伺服馬達SG90*2、XY軸控制桿*1

 

2.I/O與程式規劃

(1) 馬達控制: 2個PWM Output,輸出頻率操作在50Hz,Duty可操作在400us至2500us。

(2) 搖桿: 2個ADC Input,輸入X軸與Y軸電壓。

(3) 需要一個[map]函式,將ADC讀入值轉為馬達控制值。

 

3. PWM設定

(1)選D9與D10作為PWM輸出(Timer1)

(2)PWM操作在Mode14,所以要設定ICR1。

(3)在比較模式清除OC1A,OC1B,因此要設定COM1A1,COM1B1=1。

(4)需分頻除8,設定CS11=1。

16MHz/50Hz=320000 >65535,若以320000/65535=4.88,所以分頻要大於4.88,因此設除8。

ICR1=16MHz/8/50Hz=40000

(5)Duty正週期設定值400us~2500us,設定OCR1A,OCR1B=800~5000。 

50Hz為計數40000次,所以1個Count=1/50Hz/40000=0.5us。

因此OCR1A=400us/0.5us=800

 

 

設定值整理如下

TCCR1A= (1 << COM1A1) | ( 1 << COM1B1) | ( 1 << WGM11)

TCCR1B= (1 << WGM13) | ( 1 << WGM12) | ( 1 << CS11)

 

 

4.完整程式碼

const int x_analogInPin = A0; 
const int y_analogInPin = A1; 
const int x_analogOutPin = 9; 
const int y_analogOutPin = 10; 
int sensorValue = 0;
int outputValue = 0; 

void setup() {

pinMode(x_analogOutPin, OUTPUT);
pinMode(y_analogOutPin, OUTPUT);

  TCCR1A = ((1 << COM1A1) |(1 << COM1B1)| (1 << WGM11)); // 
  TCCR1B = ((1 << WGM12) | (1 << WGM13) | (1 << CS11)); // 
  ICR1  = 40000;  //set ICR1 to produce 50Hz frequency (16000000 / 8 / 40000 = 50hz)
  OCR1A = 2000;   // 40000 * 0.05 most left
  OCR1B=2000;
}

// the loop routine runs over and over again forever:
void loop() {
      sensorValue = analogRead(x_analogInPin);
      if(sensorValue<=512) outputValue = map(sensorValue, 0, 512,1000, 2310);  //MG90S=1600,5200  SG90=1000,4200
      else outputValue = map(sensorValue, 513, 1023,2320, 4200);  //MG90S=1600,5200  SG90=1000,4200
      OCR1A = outputValue;   // 40000 * 0.05 most left
 
      sensorValue = analogRead(y_analogInPin);
      if(sensorValue<=512) outputValue = map(sensorValue, 0, 512,1000, 2310);  //MG90S=1600,5200  SG90=1000,4200
      else outputValue = map(sensorValue, 513, 1023,2320, 4200);  //MG90S=1600,5200  SG90=1000,4200
      OCR1B = outputValue;   // 40000 * 0.05 most left
      delay(20);  
}

arrow
arrow
    全站熱搜

    門外漢 發表在 痞客邦 留言(0) 人氣()