Design-in of LPC11U24 (lqfp48) of mbed as Steppermotor controller with USB control.
Mbed repository of Stepper Motor Control board. Using mbed LPC11U24 chip with HID USB.
Hardware in copy repo on bitbucket https://bitbucket.org/jeroen3/stepper-motor-board
main.cpp
- Committer:
- jeroen3
- Date:
- 2013-10-30
- Revision:
- 2:ddae311a4533
- Parent:
- 0:d0306c0cbee6
File content as of revision 2:ddae311a4533:
/**
* @file main.c
* @brief Main thread controlling everything
* @details This main thread received USB commands and executes them to other modules
*
* @Author Jeroen Lodder
* @Date October 2013
*
* @{
*/
#include "mbed.h"
#include "smc.h"
#include "watchdog.h"
#include "USBHID.h"
#include "ByteOperations.h"
#include "USBHIDProtocol.h"
#include "CT16B1_PWM.h"
/* Main routine handles USB and SMC api */
#define VERSION 0x02
/**
* @brief USB HID Declarations
* @{
*/
USBHID *hid;
HID_REPORT send_report __attribute__((aligned (4))); // Aligned for fast access
HID_REPORT recv_report __attribute__((aligned (4))); // Aligned for fast access
/**
* @}
*/
/* Input Output */
DigitalOut led(P0_21); /**< @brief User led */
DigitalIn button(P0_1); /**< @brief User button input (bootloader pin) */
DigitalOut aux(P0_22); /**< @brief Auxilary mosfet channel */
/**
* @brief Debounced button reader
*/
Ticker Ticker_button;
volatile uint32_t button_history = 0xFF;
void Ticker_button_handler(void){
button_history <<= 1;
button_history |= button;
}
/**
* @brief LED Blink Handler
*/
Ticker Ticker_led;
void Ticker_led_handler(void){
led = !led;
}
/**
* @brief Clear buffer contents
* @note Requires 4 byte alignement of data
* @param[in] c Pointer to @p HID_REPORT.
*/
void empty_report(HID_REPORT *data){
register uint32_t *p = (uint32_t *)data->data;
for( register int i=0; i<((sizeof(HID_REPORT)-1)/4); i++ ){
*p = 0xFFFFFFFF;
p++;
}
}
/* Program entry */
int main(void){
/* Init */
// reset flags
LPC_SYSCON->SYSRSTSTAT = 0x1F;
// Motor Control IO config
SMC_init();
// aux init
aux = 0;
// LED
led = 0;
// USB Initialize
static USBHID hid_object(64, 64);
hid = &hid_object;
send_report.length = 64;
// button config
Ticker_button.attach_us(&Ticker_button_handler, 20000);
// Ready
while(1){
// insert idle time, since we cant be running USB stuff all the time
wait_us(5000);
//try to read a msg
if(hid->readNB(&recv_report)){
// Data packet received, start parsing
int irx=0;
int itx=0;
send_report.data[itx++] = recv_report.data[0];
switch( recv_report.data[irx++] ){
case CMD_SYS_CHECK :
send_report.data[itx++] = VERSION;
break;
case CMD_SYS_RESET :
// Soft reset
SMC_deinit();
SMC_init();
CT16B1_deinit(0);
led = 1;
Ticker_led.detach();
aux = 0;
empty_report(&recv_report);
break;
case CMD_LED_OFF :
led = 1; // inverted led
Ticker_led.detach();
break;
case CMD_LED_ON :
led = 0; // inverted led
Ticker_led.detach();
break;
case CMD_LED_BLINK :
Ticker_led.attach_us(&Ticker_led_handler, 100000);
break;
case CMD_LED_BREATH :
// Not implemented
break;
case CMD_GET_BUTTON :
write_32_to_8(&itx, send_report.data, button_history);
break;
case CMD_SMC_STEP : {
uint32_t arg_step = read_8_to_32(&irx, recv_report.data);
uint8_t arg_dir = recv_report.data[irx++];
uint32_t arg_time = read_8_to_32(&irx, recv_report.data);
uint8_t arg_free = recv_report.data[irx++];
SMC_step(arg_step, arg_dir, arg_time, arg_free);
}
break;
case CMD_SMC_STATE :
write_32_to_8(&itx, send_report.data, SMC_getState());
break;
case CMD_SMC_STOP :
SMC_deinit();
break;
case CMD_SMC_PAUSE :
SMC_pause();
break;
case CMD_SMC_CONTINUE:
SMC_continue();
break;
case CMD_SMC_FREE :
SMC_free();
break;
case CMD_SMC_BRAKE :
SMC_brake();
break;
case CMD_AUX_OFF :
CT16B1_deinit(0);
aux = 0;
//if(CT16B1_isStarted())
break;
case CMD_AUX_ON :
CT16B1_deinit(1);
aux = 1;
//if(CT16B1_isStarted())
break;
case CMD_AUX_PWM : {
uint16_t dutycycle, period, prescaler;
dutycycle = read_8_to_16(&irx, recv_report.data);
period = read_8_to_16(&irx, recv_report.data);
prescaler = read_8_to_16(&irx, recv_report.data);
/* Invert PWM, since timer is inverted */
dutycycle = period - dutycycle;
if(CT16B1_isStarted()){
CT16B1_wait_refresh();
CT16B1_set(1, dutycycle);
}else{
CT16B1_initpwm(period,dutycycle,prescaler);
CT16B1_start();
}
}
break;
case 0xEE : {
hid->sendNB(&send_report);
SMC_egg();
WatchDog_us bello(100);
}
break;
default:
send_report.data[0] = 0xFF; //Failure
break;
} // Switch
// Return command + optional new args
hid->send(&send_report);
// 0xFF unused bytes
empty_report(&recv_report);
empty_report(&send_report);
} // if packet
} // While
} // Main
/** @} */