2016年10月29日 星期六

DIY - Robot 機器人 - NXP PCA9685 16通道驅動板模塊舵機 PWM 編程(十八)

DIY - Robot 機器人 - NXP PCA9685 16通道驅動板模塊舵機 PWM 編程(十八): 

NXP PCA9685 16通道驅動板模塊的舵機(Servo)編程,由於 NXP PCA9685 內置有 PWMPulse Width Modulation)的功能,祇要控制 PWM 的佔空比(Duty Cycle),便可以控制舵機(Servo)的角度。

NXP PCA9685 16通道驅動板模塊 LCD 顯示
NXP PCA9685 接上電之後的狀態是處於休眠模式(Sleep)之下。SLEEP 模式之下,所有的 PWM 頻道輸出都會被關掉。所以開始在設定好 MODE1 PRE_SCALE 值後,必需離開休眠模式(Sleep)模式, PCA9685 才會有辦法輸出 PWM 訊號,方法是設定 MODE1 暫存器(暫存器位置:0x00)的 SLEEP bit (4 bit)為 1,將 Bit4 改設為 0 的話就醒來。

舵機(Servo)的轉動角度和 PWM 的關係
舵機(Servo)的轉動角度和 PWM 的關係:
-90° = 0.60ms / 20ms = 3% x 4096 = 129 = 0x0081 
-45° = 1.05ms / 20ms = 5.25% x 4096 = 215 = 0x00D7 
   0° = 1.50ms / 20ms = 7.5% x 4096 = 307 = 0x0133 
+45° = 1.95ms / 20ms = 9.75% x 4096 = 400 = 0x0190 
+90° = 2.40ms / 20ms = 12% x 4096 = 492 = 0x01EC

NXP PCA9685 PWM 初始化程式:
// MODE1 Control Byte
   PCA9685_WD_BYTE(PCA9685_ADDR+2);
   PCA9685_WD_BYTE(PCA9685_MODE1);
   PCA9685_WD_BYTE(0xA1);
StopI2C2();

// MODE2 Control Byte
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(PCA9685_ADDR+2);
   PCA9685_WD_BYTE(PCA9685_MODE2);
   PCA9685_WD_BYTE(0b00001101);
StopI2C2();

// Set Up Frequency = 50Hz
PCA9685_WD_PRESCALE(i2c_addr, 0x81);

// Mode1 Bit4=0 PWM will Operate
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(PCA9685_MODE1);
   PCA9685_WD_BYTE(0b00100001);  // 0xA1


NXP PCA9685 PWM 主程式:
while( 1 ) {

// ***** AntiClockwise -90 *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);

   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0xEC);
   PCA9685_WD_BYTE(0x01);
   StopI2C2(); 
delayms(2000);

// ***** Stop Servo *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   StopI2C2(); 
delayms(2000);

// ***** Centre 0 *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);

   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x1C);
   PCA9685_WD_BYTE(0x01); // 0x133 Centre 0
   StopI2C2(); 
   delayms(2000);

// ***** Stop Servo *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   StopI2C2(); 
   delayms(2000);

// ***** Clockwise +90 *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);

   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x62);
   PCA9685_WD_BYTE(0x00);  // 0x0062 = Clockwise +90
   StopI2C2(); 
   delayms(2000);

// ***** Stop Servo *****//
   PCA9685_START_BUS();
   PCA9685_WD_BYTE(i2c_addr);
   PCA9685_WD_BYTE(0x06);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   PCA9685_WD_BYTE(0x00);
   StopI2C2(); 
   delayms(2000);

}    // End while

NXP PCA9685 16通道驅動板模塊接上舵機(Servo

2016年 10月 29日 天氣報告
氣溫:25.3@ 21:30
相對濕度:百分之 77%
天氣:微雨

沒有留言:

張貼留言