Design-in of LPC11U24 (lqfp48) of mbed as Steppermotor controller with USB control.

Dependencies:   USBDevice mbed

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

Committer:
jeroen3
Date:
Wed Oct 30 21:59:32 2013 +0000
Revision:
2:ddae311a4533
Parent:
0:d0306c0cbee6
fix led blink after soft reset

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jeroen3 0:d0306c0cbee6 1 /**
jeroen3 0:d0306c0cbee6 2 * @file CT16B1_PWM.cpp
jeroen3 0:d0306c0cbee6 3 * @brief Small driver to user CT16B1 for PWM
jeroen3 0:d0306c0cbee6 4 *
jeroen3 0:d0306c0cbee6 5 * @author Jeroen Lodder
jeroen3 0:d0306c0cbee6 6 * @date Oktober 2013
jeroen3 0:d0306c0cbee6 7 *
jeroen3 0:d0306c0cbee6 8 * @note This only uses MAT 1
jeroen3 0:d0306c0cbee6 9 * @{
jeroen3 0:d0306c0cbee6 10 */
jeroen3 0:d0306c0cbee6 11 #include "mbed.h"
jeroen3 0:d0306c0cbee6 12 #include "CT16B1_PWM.h"
jeroen3 0:d0306c0cbee6 13
jeroen3 0:d0306c0cbee6 14 /* NOTICE: THIS MODULE ONLY WORKS FOR MAT 1 */
jeroen3 0:d0306c0cbee6 15
jeroen3 0:d0306c0cbee6 16 /* Static makes them private to this module */
jeroen3 0:d0306c0cbee6 17 volatile static uint8_t stage = 0; /**< @brief Stage identifier for mat2/3 swap */
jeroen3 0:d0306c0cbee6 18 volatile static uint16_t period = 0; /**< @brief PWM Period register */
jeroen3 0:d0306c0cbee6 19 volatile static uint16_t mat[4]; /**< @brief PWM Mat output registers */
jeroen3 0:d0306c0cbee6 20 volatile static uint16_t default_period_us; /**< @brief Given period in us */
jeroen3 0:d0306c0cbee6 21 volatile static uint16_t defaultstate; /**< @brief Default PWM state on init */
jeroen3 0:d0306c0cbee6 22 volatile static uint16_t prescaler; /**< @brief Given prescaler */
jeroen3 0:d0306c0cbee6 23
jeroen3 0:d0306c0cbee6 24 /**
jeroen3 0:d0306c0cbee6 25 * @brief Initializes PWM
jeroen3 0:d0306c0cbee6 26 *
jeroen3 0:d0306c0cbee6 27 * @param[in] period_us Period in us, when prescaler is 48
jeroen3 0:d0306c0cbee6 28 * @param[in] defaultstate State after initializing
jeroen3 0:d0306c0cbee6 29 * @param[in] prescaler Divider from AHBCLK
jeroen3 0:d0306c0cbee6 30 * @note Prescaler 48 gives 1 us timer ticks
jeroen3 0:d0306c0cbee6 31 * @note Run Start() to start pwm
jeroen3 0:d0306c0cbee6 32 */
jeroen3 0:d0306c0cbee6 33 void CT16B1_initpwm(uint16_t period_arg, uint16_t defaultstate, uint16_t prescaler_arg){
jeroen3 0:d0306c0cbee6 34 // Calculte period
jeroen3 0:d0306c0cbee6 35 period = period_arg;
jeroen3 0:d0306c0cbee6 36 prescaler = prescaler_arg;
jeroen3 0:d0306c0cbee6 37
jeroen3 0:d0306c0cbee6 38 // Store latest setting
jeroen3 0:d0306c0cbee6 39 mat[0] = defaultstate;
jeroen3 0:d0306c0cbee6 40 mat[1] = defaultstate;
jeroen3 0:d0306c0cbee6 41 mat[2] = defaultstate;
jeroen3 0:d0306c0cbee6 42 mat[3] = defaultstate;
jeroen3 0:d0306c0cbee6 43
jeroen3 0:d0306c0cbee6 44 // Enable timer clock, and GPIO
jeroen3 0:d0306c0cbee6 45 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6)|(1<<8);
jeroen3 0:d0306c0cbee6 46
jeroen3 0:d0306c0cbee6 47 // Config timer
jeroen3 0:d0306c0cbee6 48 LPC_CT16B1->IR = 0x5F; // Clear int
jeroen3 0:d0306c0cbee6 49 LPC_CT16B1->TCR = 2; // Reset
jeroen3 0:d0306c0cbee6 50 LPC_CT16B1->PR = prescaler;
jeroen3 0:d0306c0cbee6 51 LPC_CT16B1->CCR = 0; // No capture
jeroen3 0:d0306c0cbee6 52 LPC_CT16B1->EMR = 0; // Not required, refer to PWMC
jeroen3 0:d0306c0cbee6 53 LPC_CT16B1->CTCR = 0; // No special counters mode
jeroen3 0:d0306c0cbee6 54
jeroen3 0:d0306c0cbee6 55 // Config mat 1
jeroen3 0:d0306c0cbee6 56 LPC_CT16B1->PWMC = (0<<0)|(1<<1)|(0<<2)|(0<<3); // MAT1 only
jeroen3 0:d0306c0cbee6 57 LPC_CT16B1->MCR = (1<<10); // Reset on MR3
jeroen3 0:d0306c0cbee6 58 LPC_CT16B1->MR3 = period_arg;
jeroen3 0:d0306c0cbee6 59 LPC_CT16B1->MR1 = defaultstate;
jeroen3 0:d0306c0cbee6 60 // Config met 1 IO
jeroen3 0:d0306c0cbee6 61 LPC_IOCON->PIO0_22 = 0x2 | (0x1<<3) ; // GPIO
jeroen3 0:d0306c0cbee6 62 // Take timer out of reset
jeroen3 0:d0306c0cbee6 63 LPC_CT16B1->TCR = 0;
jeroen3 0:d0306c0cbee6 64 }
jeroen3 0:d0306c0cbee6 65
jeroen3 0:d0306c0cbee6 66 /**
jeroen3 0:d0306c0cbee6 67 * @brief Re-Initializes PWM
jeroen3 0:d0306c0cbee6 68 */
jeroen3 0:d0306c0cbee6 69 void CT16B1_reinitpwm(void){
jeroen3 0:d0306c0cbee6 70 CT16B1_initpwm(default_period_us, defaultstate, prescaler );
jeroen3 0:d0306c0cbee6 71 }
jeroen3 0:d0306c0cbee6 72
jeroen3 0:d0306c0cbee6 73 /**
jeroen3 0:d0306c0cbee6 74 * @brief Start PWM
jeroen3 0:d0306c0cbee6 75 */
jeroen3 0:d0306c0cbee6 76 void CT16B1_start(void){
jeroen3 0:d0306c0cbee6 77 LPC_CT16B1->TCR = 1; // Enable
jeroen3 0:d0306c0cbee6 78 }
jeroen3 0:d0306c0cbee6 79
jeroen3 0:d0306c0cbee6 80 /**
jeroen3 0:d0306c0cbee6 81 * @brief Stop PWM
jeroen3 0:d0306c0cbee6 82 * @param[in] state PWM output state when pwm disabled
jeroen3 0:d0306c0cbee6 83 */
jeroen3 0:d0306c0cbee6 84 void CT16B1_deinit(uint8_t state){
jeroen3 0:d0306c0cbee6 85 LPC_CT16B1->TCR = 2; // Disable and reset counter
jeroen3 0:d0306c0cbee6 86 // Set all to GPIO
jeroen3 0:d0306c0cbee6 87 LPC_IOCON->PIO0_22 = 0x0 | (0x1<<3) ; // GPIO
jeroen3 0:d0306c0cbee6 88 LPC_GPIO->DIR[0] |= (1<<22);
jeroen3 0:d0306c0cbee6 89 LPC_GPIO->CLR[0] |= (1<<22);
jeroen3 0:d0306c0cbee6 90 }
jeroen3 0:d0306c0cbee6 91
jeroen3 0:d0306c0cbee6 92 /**
jeroen3 0:d0306c0cbee6 93 * @brief Reload all match compare registers
jeroen3 0:d0306c0cbee6 94 */
jeroen3 0:d0306c0cbee6 95 void CT16B1_reload_mat(void){
jeroen3 0:d0306c0cbee6 96 LPC_CT16B1->MR1 = mat[1];
jeroen3 0:d0306c0cbee6 97 LPC_CT16B1->MR3 = period;
jeroen3 0:d0306c0cbee6 98 }
jeroen3 0:d0306c0cbee6 99
jeroen3 0:d0306c0cbee6 100 /**
jeroen3 0:d0306c0cbee6 101 * @brief Set channel PWM
jeroen3 0:d0306c0cbee6 102 */
jeroen3 0:d0306c0cbee6 103 void CT16B1_set(uint8_t matnr, uint16_t value){
jeroen3 0:d0306c0cbee6 104 mat[matnr] = value;
jeroen3 0:d0306c0cbee6 105 CT16B1_reload_mat();
jeroen3 0:d0306c0cbee6 106 }
jeroen3 0:d0306c0cbee6 107
jeroen3 0:d0306c0cbee6 108 /**
jeroen3 0:d0306c0cbee6 109 * @brief Wait for timer to reach 0
jeroen3 0:d0306c0cbee6 110 */
jeroen3 0:d0306c0cbee6 111 void CT16B1_wait_refresh(void){
jeroen3 0:d0306c0cbee6 112 if( (LPC_CT16B1->TCR & 1) )
jeroen3 0:d0306c0cbee6 113 while(LPC_CT16B1->TC != 0);
jeroen3 0:d0306c0cbee6 114 }
jeroen3 0:d0306c0cbee6 115
jeroen3 0:d0306c0cbee6 116 /**
jeroen3 0:d0306c0cbee6 117 * @brief Return period
jeroen3 0:d0306c0cbee6 118 */
jeroen3 0:d0306c0cbee6 119 uint16_t CT16B1_get_period(void){
jeroen3 0:d0306c0cbee6 120 return period;
jeroen3 0:d0306c0cbee6 121 }
jeroen3 0:d0306c0cbee6 122
jeroen3 0:d0306c0cbee6 123 /**
jeroen3 0:d0306c0cbee6 124 * @brief Return 1 if timer is started
jeroen3 0:d0306c0cbee6 125 */
jeroen3 0:d0306c0cbee6 126 uint32_t CT16B1_isStarted(void){
jeroen3 0:d0306c0cbee6 127 return LPC_CT16B1->TCR & 1;
jeroen3 0:d0306c0cbee6 128 }
jeroen3 0:d0306c0cbee6 129 /**
jeroen3 0:d0306c0cbee6 130 *@}
jeroen3 0:d0306c0cbee6 131 */
jeroen3 0:d0306c0cbee6 132