Page 1 of 1
Adafruit motorshield port
Posted: Fri Jul 04, 2014 4:29 pm
by renegade82
Hi to all forum users,
i'm academic student (and newbie) and i'm working, together with another student, at port Adafruit motorshield library to stm32f303 with chibios enviroment.
This motorshield uses a 74HC595 shift register e two L293D to drive four dc motor and two stepper motor.
After a series of experiments we realized we had problems with the shifit register, Asthe if we try to drive the motors directly with L293D these work.
Is there anyone who has had experience with 74HC595 shift register and stm32f303 and can help us?
PS
excuse me for my bad english and i hope not to have posted the wrong section!
Re: Adafruit motorshield port
Posted: Fri Jul 04, 2014 4:46 pm
by Tectu
Please tell us exactly what problem you are facing and attach the corresponding code. Otherwise we cannot help you.
~ Tectu
Re: Adafruit motorshield port
Posted: Fri Jul 04, 2014 6:18 pm
by renegade82
This is a code :
Code: Select all
#include "ch.h"
#include "hal.h"
static PWMConfig pwmcfg = {
1000000, // 1MHz PWM clock frequency
10000, // PWM period 10 milliseconds
NULL,
{
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
},
0,
0
};
int main(void) {
halInit();
chSysInit();
/****************************************************************************
* ADAFRUIT MOTOR SHIELD
****************************************************************************/
int i;
// MC.ENABLE
pwmStart(&PWMD3, &pwmcfg);
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATE(2)); // PWM
palSetPadMode(GPIOB, 12, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 4, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL);
palSetPadMode(GPIOB, 8, PAL_MODE_OUTPUT_PUSHPULL);
palClearPad(GPIOB,7); // motorenable
// RESET
palClearPad(GPIOB,12); //motorlatch
palClearPad(GPIOB,8); //motordata
for (i = 0; i < 8; ++i) {
palClearPad(GPIOB,4); //motorclock
palClearPad(GPIOB,8);//motordata 0
palSetPad(GPIOB,4); //motorclock
}
palSetPad(GPIOB,12); //motorlatch
while (1) {
// RUN FORWARD (OUTPUT SHIFT REGISTER => Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 = 0 0 0 0 0 1 0 0)
pwmEnableChannel(&PWMD3, 2, PWM_PERCENTAGE_TO_WIDTH(&PWMD3, 6000));
palClearPad(GPIOB,12); //motorlatch
palClearPad(GPIOB,8); //motordata 0
for (i = 0; i < 8; ++i) {
palClearPad(GPIOB,4); //motorclock
if(i==5) // run to foward test
palSetPad(GPIOB,8);//motordata 1
else
palClearPad(GPIOB,8);//motordata 0
palSetPad(GPIOB,4); //motorclock
}
palSetPad(GPIOB,12); //motorlatch
}
return 0;
}
Re: Adafruit motorshield port
Posted: Fri Jul 04, 2014 6:51 pm
by Giovanni
Hi,
You can clock the shift register using a SPI port (sending one byte), if you have N cascaded shift registers then send N bytes.
BTW the cube project does exactly this.
Giovanni
Re: Adafruit motorshield port
Posted: Fri Jul 04, 2014 7:45 pm
by renegade82
Thanks for the reply Giovanni,
how can I access the source code of chibi cube, the links on this forum don't works anymore!
Re: Adafruit motorshield port
Posted: Fri Jul 04, 2014 8:01 pm
by Giovanni
You may PM the author.
Giovanni
Re: Adafruit motorshield port
Posted: Mon Jul 07, 2014 12:05 pm
by renegade82
i'm tried this code but continues to don't work, Where i wrong?
Code: Select all
#include "ch.h"
#include "hal.h"
int latchPin = 4;
int clockPin = 5;
int dataPin = 7;
static uint8_t txbuf[1];
static uint8_t rxbuf[1];
#define SPI_BaudRatePrescaler_8 ((uint16_t)0x0010)
static const SPIConfig spicfg = {
NULL,
GPIOA,
4, //GPIOA_PIN4
SPI_BaudRatePrescaler_8
};
static PWMConfig pwmcfg = {
1000000, // 1MHz PWM clock frequency
10000, // PWM period 10 milliseconds
NULL,
{
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL},
{PWM_OUTPUT_ACTIVE_HIGH, NULL}
},
0,
0
};
int main(void) {
halInit();
chSysInit();
*******************************************************************
* ADAFRUIT MOTOR SHIELD
******************************/
int i;
// MC.ENABLE
pwmStart(&PWMD3, &pwmcfg);
palSetPadMode(GPIOB, 0, PAL_MODE_ALTERNATE(2)); // PWM
palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL);
/* Initializes the SPI driver 1.*/
spiStart(&SPID1, &spicfg);
/* SPI1 I/O pins setup.*/
palSetPadMode(GPIOA, latchPin, PAL_MODE_ALTERNATE(5)); // SS = GPIOA_PIN4
palSetPadMode(GPIOA, clockPin, PAL_MODE_ALTERNATE(5)); // SCLK
palSetPadMode(GPIOA, dataPin, PAL_MODE_ALTERNATE(5)); // MOSI
palClearPad(GPIOB,7); // motorenable
//RESET
txbuf[0] = 0;
palClearPad(GPIOA, latchPin);
spiSelect(&SPID1); /* Slave Select assertion. */
spiExchange(&SPID1, 1,
txbuf, rxbuf); /* Atomic transfer operations. */
palSetPad(GPIOA, latchPin);
while (1) {
// RUN FORWARD (OUTPUT SHIFT REGISTER => Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 = 0 0 0 0 0 1 0 0)
pwmEnableChannel(&PWMD3, 2, PWM_PERCENTAGE_TO_WIDTH(&PWMD3, 6000));
txbuf[0] = (uint8_t)4;
palClearPad(GPIOA, latchPin);
spiSelect(&SPID1); /* Slave Select assertion. */
spiExchange(&SPID1, 2,
txbuf, rxbuf); /* Atomic transfer operations. */
palSetPad(GPIOA, latchPin);
chThdSleepMilliseconds(200);
}
return 0;
}
Re: Adafruit motorshield port
Posted: Mon Jul 07, 2014 12:23 pm
by Giovanni
The SS must be a GPIO not an alternate, also, use spiSelect() and spiUnselect() in order to control it.
Giovanni