Low voltage output from TB6612FNG, driving with Wixel

Hi folks,

I’m trying to drive a linear actuator (Firgelli PQ12) with a Wixel and the TB6612FNG. What’s happening is that no matter what PWM I send to the 6612, I’m only getting 1.5v out to the actuator (and the VMOT is getting the full 12v from the power supply).

I know the PQ12 is good, since I can connect the 12v leads directly to it and get fast motion (and this happens with multiple PQ12s). When the program (below) runs, I do get actuator motion (it extends and then retracts in a cycle), but it’s very slow and appears to stall occasionally for several seconds at a time. I think this is only due to the low output voltage from the 6612. I have also replaced the 6612 with another unit and the same behavior occurs.

Connections:

Wixel TB6612 GND GND VALT VCC (5v from USB) P0_0 None (position feedback from PQ12 - hi/low reference is tied to Wixel VALT and GND, so 0-5v) P1_0 PWMA P1_6 AIN2 P1_7 AIN1 3V3 !STBY (always driven high) None AOUT1 -> motor lead pin 2 None AOUT2 -> motor lead pin 3

Program:[code]
#include <cc2511_types.h>
#include <cc2511_map.h>
#include <servo.h>
#include <wixel.h>
#include <usb.h>
#include <usb_com.h>
#include <gpio.h>
#include <adc.h>

int32 CODE param_servo_speed = 4500;

uint16 position_readback; // analog voltage on pin P0_0
uint8 direction; // 1 if extending, 2 if retracting, 0 if not moving, 3 if already moved and stopped

// Here we define what pins we will be using for servos. Our choice is:
// Servo 0 = P1_0
// Servo 1 = P1_1

uint8 CODE servo_pins[] = {10, 11};

void myServosInit()
{
// Start the servo library.
servosStart((uint8 XDATA *)servo_pins, sizeof(servo_pins));

// Set the speed of servo 0
servoSetSpeed(0, 1000);

}

void myGPIOInit()
{
// set up pins P1_6 and P1_7 as digital output pins
setDigitalOutput(16, 0); // drive P1_6 LOW
setDigitalOutput(17, 0); // drive P1_7 LOW
}

void updateServos()
{

// first, check position
position_readback = adcRead(0);

// which way are we going?
switch(direction)
		{
	case 0:	// not moving yet, start extending
		direction = 1;
		setDigitalOutput(17, 0);
		setDigitalOutput(16, 1);
		break;
	case 1: // extending
		if (position_readback <= 250) //>= 1750)
                 {
		   // reached end of travel, turn around and retract
		   direction = 2;
		   setDigitalOutput(16, 0);
		   setDigitalOutput(17, 1);
		   }
		else
		   {
		   // keep going
		   setDigitalOutput(17, 0);
		   setDigitalOutput(16, 1);
		   }
		break;
	case 2: // retracting
		if (position_readback >= 1750) //<= 250)
                       {
		   // reached end of travel, start over
		   direction = 1;
		   setDigitalOutput(17, 0);
		   setDigitalOutput(16, 1);
		   }
		else
		   {
		   // keep going
		   setDigitalOutput(16, 0);
		   setDigitalOutput(17, 1);
		   }
		break;
	case 3:
		
	//case 3: // finished, do not move
	default:
		setDigitalOutput(17, 0);
		setDigitalOutput(16, 0);			  
		break;

	}



servoSetTarget(0, param_servo_speed); // set speed of servo movement via PWM

if (getMs() >> 10 & 1)
{
    // For 2048 ms, the code in this block will be called.
    // Then for the next 2048 ms, the code in the "else" block will be called.
    // The pattern repeats every 4096 ms.
    LED_YELLOW(0);
}
else
{
    LED_YELLOW(1);
}

}

void main()
{
systemInit();
usbInit();
myServosInit();
myGPIOInit();

while(1)
{
    boardService();
    usbComService();
    usbShowStatusWithGreenLed();
    updateServos();
    receiveCommands();

    // The red LED will be on if any of the servos are moving.
    LED_RED(servosMoving());
}

}
[/code]

Any idea what I’m missing here?

Hello.

It looks like you are not supplying the right duty cycles to your motor driver. The Wixel’s servo library is not appropriate for most PWM applications because it is designed for RC servos and cannot produce a full range of duty cycles. We recently posted an example PWM script for the Wixel here, which might be helpful to you.