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
CT16B1_PWM.cpp@2:ddae311a4533, 2013-10-30 (annotated)
- 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?
User | Revision | Line number | New 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 |