极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 47609|回复: 27

stm32 pca9685 舵机使用

[复制链接]
发表于 2015-10-27 22:00:33 | 显示全部楼层 |阅读模式
本帖最后由 顺子 于 2015-11-6 21:33 编辑

各位高手你们好。我买了块pca9685这块板子。本来是在Arduino上使用的,但是我买的时候没有看,我现在正在使用stm32,我一直在写I2c通讯,希望能够使用pca9685这块板子,但是一直出错,下面我把代码贴上来,希望高手来帮助我一下

这个是Arduino原程序main.c函数

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  150 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  600 // this is the 'maximum' pulse length count (out of 4096)

// our servo # counter
//uint8_t servonum = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel Servo test!");

  pwm.begin();
  
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000;
  pulse /= pulselength;
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {
  // Drive each servo one at a time
  //Serial.println(servonum);
  for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
    pwm.setPWM(0, 0, pulselen);
    pwm.setPWM(1, 0, pulselen);
    pwm.setPWM(2, 0, pulselen);
    pwm.setPWM(3, 0, pulselen);
    pwm.setPWM(4, 0, pulselen);
    pwm.setPWM(5, 0, pulselen);
    pwm.setPWM(6, 0, pulselen);
    pwm.setPWM(7, 0, pulselen);
    pwm.setPWM(8, 0, pulselen);
    pwm.setPWM(9, 0, pulselen);
    pwm.setPWM(10, 0, pulselen);
    pwm.setPWM(11, 0, pulselen);
    pwm.setPWM(12, 0, pulselen);
    pwm.setPWM(13, 0, pulselen);
    pwm.setPWM(14, 0, pulselen);
  }
  delay(500);
  for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
    pwm.setPWM(0, 0, pulselen);
    pwm.setPWM(0, 0, pulselen);
    pwm.setPWM(1, 0, pulselen);
    pwm.setPWM(2, 0, pulselen);
    pwm.setPWM(3, 0, pulselen);
    pwm.setPWM(4, 0, pulselen);
    pwm.setPWM(5, 0, pulselen);
    pwm.setPWM(6, 0, pulselen);
    pwm.setPWM(7, 0, pulselen);
    pwm.setPWM(8, 0, pulselen);
    pwm.setPWM(9, 0, pulselen);
    pwm.setPWM(10, 0, pulselen);
    pwm.setPWM(11, 0, pulselen);
    pwm.setPWM(12, 0, pulselen);
    pwm.setPWM(13, 0, pulselen);
    pwm.setPWM(14, 0, pulselen);
  }
  delay(500);
}


这个是Arduino原程序Adafruit_PWMServoDriver.h函数

/***************************************************
  This is a library for our Adafruit 16-channel PWM & Servo driver

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate, 2 pins are required to  
  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
****************************************************/

#ifndef _ADAFRUIT_PWMServoDriver_H
#define _ADAFRUIT_PWMServoDriver_H

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif


#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4

#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE

#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9

#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD


class Adafruit_PWMServoDriver {
public:
  Adafruit_PWMServoDriver(uint8_t addr = 0x40);//我没有用过Arduino,但是根据我的判断pca9685地址应该是0x40.
  void begin(void);
  void reset(void);
  void setPWMFreq(float freq);
  void setPWM(uint8_t num, uint16_t on, uint16_t off);
  void setPin(uint8_t num, uint16_t val, bool invert=false);

private:
  uint8_t _i2caddr;

  uint8_t read8(uint8_t addr);
  void write8(uint8_t addr, uint8_t d);
};

#endif

这个是Arduino原程序Adafruit_PWMServoDriver.cpp函数

/***************************************************
  This is a library for our Adafruit 16-channel PWM & Servo driver

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/products/815

  These displays use I2C to communicate, 2 pins are required to  
  interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
****************************************************/

#include <Adafruit_PWMServoDriver.h>
#include <Wire.h>
#if defined(__AVR__)
#define WIRE Wire
#elif defined(CORE_TEENSY) // Teensy boards
#define WIRE Wire
#else // Arduino Due
#define WIRE Wire1
#endif

// Set to true to print some debug messages, or false to disable them.
#define ENABLE_DEBUG_OUTPUT true

Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t addr) {
  _i2caddr = addr;
}

void Adafruit_PWMServoDriver::begin(void) {
WIRE.begin();
reset();
}


void Adafruit_PWMServoDriver::reset(void) {
write8(PCA9685_MODE1, 0x0);
}

void Adafruit_PWMServoDriver::setPWMFreq(float freq) {
  //Serial.print("Attempting to set freq ");
  //Serial.println(freq);
  freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).
  float prescaleval = 25000000;
  prescaleval /= 4096;
  prescaleval /= freq;
  prescaleval -= 1;
  if (ENABLE_DEBUG_OUTPUT) {
    Serial.print("Estimated pre-scale: "); Serial.println(prescaleval);
  }
  uint8_t prescale = floor(prescaleval + 0.5);
  if (ENABLE_DEBUG_OUTPUT) {
    Serial.print("Final pre-scale: "); Serial.println(prescale);
  }
  
  uint8_t oldmode = read8(PCA9685_MODE1);
  uint8_t newmode = (oldmode&0x7F) | 0x10; // sleep
  write8(PCA9685_MODE1, newmode); // go to sleep
  write8(PCA9685_PRESCALE, prescale); // set the prescaler
  write8(PCA9685_MODE1, oldmode);
  delay(5);
  write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
                                          // This is why the beginTransmission below was not working.
  //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
}

void Adafruit_PWMServoDriver::setPWM(uint8_t num, uint16_t on, uint16_t off) {
  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);

  WIRE.beginTransmission(_i2caddr);
  WIRE.write(LED0_ON_L+4*num);
  WIRE.write(on);
  WIRE.write(on>>8);
  WIRE.write(off);
  WIRE.write(off>>8);
  WIRE.endTransmission();
}

// Sets pin without having to deal with on/off tick placement and properly handles
// a zero value as completely off.  Optional invert parameter supports inverting
// the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.
void Adafruit_PWMServoDriver::setPin(uint8_t num, uint16_t val, bool invert)
{
  // Clamp value between 0 and 4095 inclusive.
  val = min(val, 4095);
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 4095) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, 4095-val);
    }
  }
  else {
    if (val == 4095) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 0) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, val);
    }
  }
}

uint8_t Adafruit_PWMServoDriver::read8(uint8_t addr) {
  WIRE.beginTransmission(_i2caddr);
  WIRE.write(addr);
  WIRE.endTransmission();

  WIRE.requestFrom((uint8_t)_i2caddr, (uint8_t)1);
  return WIRE.read();
}

void Adafruit_PWMServoDriver::write8(uint8_t addr, uint8_t d) {
  WIRE.beginTransmission(_i2caddr);
  WIRE.write(addr);
  WIRE.write(d);
  WIRE.endTransmission();
}


下面是我stm32的修改代码
void I2C_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        I2C_InitTypeDef  HS_I2C;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//I2C1 í¨μàSCL-PB6oíSDA-PB7
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
        HS_I2C.I2C_Mode=I2C_Mode_I2C;
        HS_I2C.I2C_DutyCycle=I2C_DutyCycle_2;
        HS_I2C.I2C_OwnAddress1=0x40;//stm32×÷&#206;a&#214;÷&#187;úê±&#191;éò&#212;2&#187;ó&#195;1&#216;D&#196;&#213;a&#184;&#246;μ&#216;&#214;·
        HS_I2C.I2C_Ack=I2C_Ack_Enable;
        HS_I2C.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        HS_I2C.I2C_ClockSpeed=400000;
        I2C_Cmd(I2C1,ENABLE);
        I2C_Init(I2C1,&HS_I2C);
       
//        write8(PCA9685_MODE1, 0x0);
}

u8 read8(u8 addr)
{
        I2C_AcknowledgeConfig(I2C1,ENABLE); //
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,0x40,I2C_Direction_Transmitter);//这里地址应该的对的,但是到下面一句就出不来循环了
        time_ms(10);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//到这里就停住了,返回值应该的错误,
        I2C_SendData(I2C1,addr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));,当我把0x40改为0x00时候上面循环可以通过,这个循环就通不过
        I2C_GenerateSTOP(I2C1,ENABLE);
       
        return I2C_ReceiveData(I2C1);
}

void write8(u8 addr, u8 d)
{
        I2C_AcknowledgeConfig(I2C1,ENABLE); //
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,0x40,I2C_Direction_Transmitter);
        time_ms(10);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1,addr);
        I2C_SendData(I2C1,d);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTOP(I2C1,ENABLE);
}

void setPWMFreq(u8 freq)
{
        u8 prescale;
        u8 prescaleval;
        u8 oldmode;
        u8 newmode;
  freq *= 0.9;  // Correct for overshoot in the frequency setting (see issue #11).
  prescaleval = (u8)25000000/4096;
  prescaleval /= freq;
  prescaleval -= 1;
  if (ENABLE_DEBUG_OUTPUT) {
  //  printf("Estimated pre-scale: "); printf(prescaleval);
  }
  prescale = (u8)floor(prescaleval + 0.5);

  
  oldmode = read8(PCA9685_MODE1);
  newmode = (oldmode&0x7F) | 0x10; // sleep
  write8(PCA9685_MODE1, newmode); // go to sleep
  write8(PCA9685_PRESCALE, prescale); // set the prescaler
  write8(PCA9685_MODE1, oldmode);
  time_ms(5);
  write8(PCA9685_MODE1, oldmode | 0xa1);  //  This sets the MODE1 register to turn on auto increment.
                                          // This is why the beginTransmission below was not working.
  //  Serial.print("Mode now 0x"); Serial.println(read8(PCA9685_MODE1), HEX);
}

void setPWM(u8 num, u16 on, u16 off)
{
  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);
       
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,_I2CADDR,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1,LED0_ON_L+4*num);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_SendData(I2C1,on);
        I2C_SendData(I2C1,on>>8);
        I2C_SendData(I2C1,off);
        I2C_SendData(I2C1,off>>8);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTOP(I2C1,ENABLE);
}

// Sets pin without having to deal with on/off tick placement and properly handles
// a zero value as completely off.  Optional invert parameter supports inverting
// the pulse for sinking to ground.  Val should be a value from 0 to 4095 inclusive.
void setPin(u8 num, u16 val, u8 invert)
{
        if(val>4095)val=4095;
  if (invert) {
    if (val == 0) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 4095) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, 4095-val);
    }
  }
  else {
    if (val == 4095) {
      // Special value for signal fully on.
      setPWM(num, 4096, 0);
    }
    else if (val == 0) {
      // Special value for signal fully off.
      setPWM(num, 0, 4096);
    }
    else {
      setPWM(num, 0, val);
    }
  }
}
希望高人指点

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-10-27 22:58:27 | 显示全部楼层
貌似我也买了一个舵机控制器,有点像,还没开始用。。。
回复 支持 反对

使用道具 举报

发表于 2015-10-28 00:20:19 | 显示全部楼层
我的舵机驱动板和你的一模一样,不过我用的就是Arduino。几个月前才弄懂让几号舵机在何时转动多少度。试过用PS2手柄控制舵机,但程序写的不好,取摇杆的模拟值,但是摇杆恢复,舵机就到中间了。最精确的是用电位器。
那个0x40是只的这个舵机控制板不在板子上做短接的最初的16路。
上面都是些没帮到你的废话,别介意,帮你顶一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-28 13:09:59 | 显示全部楼层
pumpitup 发表于 2015-10-27 22:58
貌似我也买了一个舵机控制器,有点像,还没开始用。。。

快点用好了告诉我。谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-28 14:21:23 | 显示全部楼层
据点兵长 发表于 2015-10-28 00:20
我的舵机驱动板和你的一模一样,不过我用的就是Arduino。几个月前才弄懂让几号舵机在何时转动多少度。试过用 ...

能否解释一下这句话的含义“那个0x40是只的这个舵机控制板不在板子上做短接的最初的16路。”
然后我想问的是这块舵机控制板的具体地址究竟是多少?
希望你能告诉我,非常感谢!
回复 支持 反对

使用道具 举报

发表于 2015-11-3 01:43:25 | 显示全部楼层
在给的例子的有效代码的第三行“Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();”括号里默认就是0x40,0x40是板子右上方的那六对短接口全部都不做短接的状态。这个板子可以串接舵机控制板,以前我找资料的时候看过,不过是arduino的,看可否参考一下“http://www.7gp.cn/index.php/archives/182”。
例子里的全能看懂,但是*.cpp和*.h就云里雾里的了。新手一枚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-6 21:27:38 | 显示全部楼层
本帖最后由 顺子 于 2015-11-6 21:31 编辑
据点兵长 发表于 2015-11-3 01:43
在给的例子的有效代码的第三行“Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();”括号里默认就 ...


谢谢你,我现在终于看懂了电路板上的意思了,
1+A5+A4+A3+A2+A1+A0+rw
如果不用短接的话Ax=0;短接的话Ax=1;
rw为写的话rw=0;rw为读的话rw=1;
所以我写入数据不做短接则地址应该为1000 0000 =0x80;
今天终于成功了,附上代码

void setPWM(u8 num, u16 on, u16 off)
{
  //Serial.print("Setting PWM "); Serial.print(num); Serial.print(": "); Serial.print(on); Serial.print("->"); Serial.println(off);
       
       
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,0x80,I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1,LED0_ON_L+4*num);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_SendData(I2C1,on);
        I2C_SendData(I2C1,on>>8);
        I2C_SendData(I2C1,off);
        I2C_SendData(I2C1,off>>8);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTOP(I2C1,ENABLE);
}

谢谢你们的关心、、

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-11-8 01:16:02 | 显示全部楼层
楼主作为交流者很负责,找到原因了还特意回一帖,供大家参考,大家共同进步吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-8 21:54:40 | 显示全部楼层
据点兵长 发表于 2015-11-8 01:16
楼主作为交流者很负责,找到原因了还特意回一帖,供大家参考,大家共同进步吧

对了,你已经研究出来了在何时转动到多少度?能否把你的写入代码给我参考一下。我现在也在思考这个问题。。。谢谢了。哈哈哈
回复 支持 反对

使用道具 举报

发表于 2015-11-11 02:00:25 | 显示全部楼层
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <Servo.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

#define SERVOMIN  150
#define SERVOMAX  600
int val;   
int val1;
int val2;
int val3,val4;
int val5,val6;

void setup() {
  Serial.begin(57600);
  
  pwm.begin();
  
  pwm.setPWMFreq(60);  // 在~ 60赫兹更新运行模拟伺服系统
}
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;  
  pulselength /= 60;  
  Serial.print(pulselength); Serial.println(" 1");
  pulselength /= 4096;  
  Serial.print(pulselength); Serial.println(" 1");
  pulse *= 1000;  //pulse=pulse*1000
  pulse /= pulselength; //pulse=pulse/pulselength
  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void a1(){
val = analogRead(A1);            //读取电位器控制的模拟值 (范围在0-647,建议取值646)
  val1 = map(val, 0, 646, 150, 600);
  val2 = map(val, 0, 646, 600, 150);
  pwm.setPWM(0, 0, val1);
  pwm.setPWM(1, 0, val2);
}

void a2(){
val3=analogRead(A0);
  val4 = map(val3, 0, 646, 150, 600);
  pwm.setPWM(2, 0, val4);
}
void a3(){
val5=analogRead(A2);
  val6 = map(val5, 0, 646, 150, 600);
  pwm.setPWM(3, 0, val6);
}


void loop() {
  a1();
  a2();
  a3();
   delay(20);
}

//刚入坑不久,代码有点乱。如果有错误请发帖指正,以免此帖误导新人,谢谢。这个实验有4个舵机,3个电位器。val1,val2是2个舵机,用1个电位器同时控制转动相同角度,但方向相反;val4,val6是另外2个舵机,分别用2个电位器控制;总共有三个10K电位器,通过改变阻值利用map函数来控制舵机角度,这个是我能控制的最精确的程序了,前面用过PS2手柄编,完全达不到想要的效果(水平有限)。
在舵机带的文件<Adafruit_PWMServoDriver.h>里有个setServoPulse函数,最后一句“pwm.setPWM(n, 0, pulse);”其中n是舵机编号,pulse就是舵机转动的度数。像我扭动A1上的那个10K电位器,0号舵机和1号舵机就相应的转动相同角度,但方向相反。
回复 支持 反对

使用道具 举报

发表于 2015-11-11 11:38:45 | 显示全部楼层
忘说了,我的那个实验程序没用到setServoPulse函数。pwm.setPWM(n, 0, pulse)本身就能用,比如我的舵机最小值SERVOMIN  150 最大值SERVOMAX  600 ,让0号舵机转动到中间就是pwm.setPWM(0, 0, 375)
一小时回复限制、、、早上才回个贴
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-23 22:45:54 | 显示全部楼层
非常感谢!我试试!
回复 支持 反对

使用道具 举报

发表于 2016-1-11 12:42:55 | 显示全部楼层
楼主可以发一份你这工程的源代码到我邮箱1137770581@qq。com 吗?急用,谢谢!
回复 支持 反对

使用道具 举报

发表于 2016-1-26 16:27:47 | 显示全部楼层
据点兵长 发表于 2015-11-11 02:00
#include
#include
#include  

楼主,你好,我也用这个驱动板了,就是时好时坏,能不能看一下你的stm32的工程文件
邮箱[email protected]
急用,先谢过
回复 支持 反对

使用道具 举报

发表于 2016-1-27 17:02:45 | 显示全部楼层
楼主可以发一份你这工程的源代码到我邮箱[email protected]吗?急用,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 07:07 , Processed in 0.045237 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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