mit Buttons/PWM als einzelne cpp und init in main
Dependencies: mbed mbed-rtos X_NUCLEO_IHM02A1
Diff: main.cpp
- Revision:
- 27:23bd03a6a6f6
- Parent:
- 26:caec5f51abe8
- Child:
- 30:e464b2bb2376
--- a/main.cpp Mon Mar 13 17:53:12 2017 +0000 +++ b/main.cpp Sun Apr 07 18:31:29 2019 +0000 @@ -1,46 +1,41 @@ /** ****************************************************************************** * @file main.cpp - * @author Davide Aliprandi, STMicroelectronics + * @author Fabian Scherrer * @version V1.0.0 - * @date November 4th, 2015 - * @brief mbed test application for the STMicroelectronics X-NUCLEO-IHM02A1 - * Motor Control Expansion Board: control of 2 motors. + * @date April 7th, 2019 + * @brief ****************************************************************************** * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * Verwendete I/O's: Input: + * PA9 (InputKontrollmodul Pin von Kontroll-Modul)(CN5-1) + * + * Output: + * PA10 (D2) (Select Steppmotor Treiber2) + * PA7 (D11) (mosi Steppmotor Treiber1) + * PA6 (D12) (miso Steppmotor Treiber1) + * PA4 (A2) (Select Steppmotor Treiber1) * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - - + * PB15 (mosi Steppmotor Treiber2) + * PB14 (miso Steppmotor Treiber2) + * PB13 (slk Steppmotor Treiber2) + * PB6 (D10)(pwm_io)(CN5-3) + * PB5 (D4)(Standby_reset Steppmotor) + * PB4 (D5)(pwm_io2)(CN9-6) + * PB3 (D3)(Select Steppmotor Treiber1) + + * PC1 (A4)(Flag_irq Steppmotor) + * PC0 (A5)(Busy_irq Steppmotor) + ******************************************************************************/ + /* Includes ------------------------------------------------------------------*/ /* mbed specific header files. */ #include "mbed.h" +#include "main.h" +#include "PWM.h" +#include "ST_SOLO.h" +#include "ST_DUO.h" /* Helper header files. */ #include "DevSPI.h" @@ -63,11 +58,45 @@ #define DELAY_2 2000 #define DELAY_3 5000 +/* Status Spleisser definieren*/ +int StatusSpleisser = ST_SOLO; + +/*Input initalisieren für Status Spleisser*/ +DigitalIn InputKontrollmodul(PA_9); + +InterruptIn button1(USER_BUTTON); +volatile int idx = 0; +volatile bool button1_pressed = false; // Used in the main loop +volatile bool button1_enabled = true; // Used for debouncing +Timeout button1_timeout; // Used for debouncing + +// Enables button when bouncing is over +void button1_enabled_cb(void) +{ + button1_enabled = true; +} + +// ISR handling button pressed event +void button1_onpressed_cb(void) +{ + if (button1_enabled) { // Disabled while the button is bouncing + button1_enabled = false; + button1_pressed = true; // To be read by the main loop + + if(idx<4){ + idx++; + } + else{idx=1;} + + button1_timeout.attach(callback(button1_enabled_cb), 0.03); // Debounce time 300 ms + } +} /* Variables -----------------------------------------------------------------*/ /* Motor Control Expansion Board. */ -XNucleoIHM02A1 *x_nucleo_ihm02a1; +XNucleoIHM02A1 *x_nucleo_ihm02a1_1; +XNucleoIHM02A12 *x_nucleo_ihm02a1_2; /* Initialization parameters of the motors connected to the expansion board. */ L6470_init_t init[L6470DAISYCHAINSIZE] = { @@ -128,307 +157,54 @@ } }; - /* Main ----------------------------------------------------------------------*/ int main() { /*----- Initialization. -----*/ - - /* Initializing SPI bus. */ -#ifdef TARGET_STM32F429 - DevSPI dev_spi(D11, D12, D13); -#else - DevSPI dev_spi(D11, D12, D3); -#endif + + pwm_io2(20000, 0.075); /* Initializing Motor Control Expansion Board. */ - x_nucleo_ihm02a1 = new XNucleoIHM02A1(&init[0], &init[1], A4, A5, D4, A2, &dev_spi); - - /* Building a list of motor control components. */ - L6470 **motors = x_nucleo_ihm02a1->get_components(); - - /* Printing to the console. */ - printf("Motor Control Application Example for 2 Motors\r\n\n"); - - - /*----- Setting home and marke positions, getting positions, and going to positions. -----*/ - - /* Printing to the console. */ - printf("--> Setting home position.\r\n"); - - /* Setting the home position. */ - motors[0]->set_home(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Getting the current position. */ - int position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Moving forward %d steps.\r\n", STEPS_1); - - /* Moving. */ - motors[0]->move(StepperMotor::FWD, STEPS_1); - - /* Waiting while active. */ - motors[0]->wait_while_active(); - - /* Getting the current position. */ - position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Printing to the console. */ - printf("--> Marking the current position.\r\n"); - - /* Marking the current position. */ - motors[0]->set_mark(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Moving backward %d steps.\r\n", STEPS_2); - - /* Moving. */ - motors[0]->move(StepperMotor::BWD, STEPS_2); - - /* Waiting while active. */ - motors[0]->wait_while_active(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Getting the current position. */ - position = motors[0]->get_position(); + x_nucleo_ihm02a1_2 = new XNucleoIHM02A12(&init[0], &init[1],A4, A5, D4, D2, PB_15, PB_14, PB_13 ); + x_nucleo_ihm02a1_1 = new XNucleoIHM02A1(&init[0], &init[1], A4, A5, D4, A2, D11, D12, D3 ); + + - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Going to marked position.\r\n"); - - /* Going to marked position. */ - motors[0]->go_mark(); - - /* Waiting while active. */ - motors[0]->wait_while_active(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Getting the current position. */ - position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Going to home position.\r\n"); - - /* Going to home position. */ - motors[0]->go_home(); - - /* Waiting while active. */ - motors[0]->wait_while_active(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Getting the current position. */ - position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Halving the microsteps.\r\n"); - - /* Halving the microsteps. */ - init[0].step_sel = (init[0].step_sel > 0 ? init[0].step_sel - 1 : init[0].step_sel); - if (!motors[0]->set_step_mode((StepperMotor::step_mode_t) init[0].step_sel)) { - printf(" Step Mode not allowed.\r\n"); - } - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Setting home position.\r\n"); - - /* Setting the home position. */ - motors[0]->set_home(); - - /* Waiting. */ - wait_ms(DELAY_1); - - /* Getting the current position. */ - position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); + printf("--> bis hier gehts2.\r\n"); + /* Building a list of motor control components. */ + L6470B **motors2 = x_nucleo_ihm02a1_2->get_components(); + L6470 **motors = x_nucleo_ihm02a1_1->get_components(); + + printf("--> bis hier gehts3.\r\n"); + + button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event - /* Waiting. */ - wait_ms(DELAY_1); - - /* Printing to the console. */ - printf("--> Moving forward %d steps.\r\n", STEPS_1); - - /* Moving. */ - motors[0]->move(StepperMotor::FWD, STEPS_1); - - /* Waiting while active. */ - motors[0]->wait_while_active(); - - /* Getting the current position. */ - position = motors[0]->get_position(); - - /* Printing to the console. */ - printf("--> Getting the current position: %d\r\n", position); - - /* Printing to the console. */ - printf("--> Marking the current position.\r\n"); - - /* Marking the current position. */ - motors[0]->set_mark(); - - /* Waiting. */ - wait_ms(DELAY_2); - - - /*----- Running together for a certain amount of time. -----*/ - - /* Printing to the console. */ - printf("--> Running together for %d seconds.\r\n", DELAY_3 / 1000); - - /* Preparing each motor to perform a run at a specified speed. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_run(StepperMotor::BWD, 400); - } - - /* Performing the action on each motor at the same time. */ - x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Waiting. */ - wait_ms(DELAY_3); - - - /*----- Increasing the speed while running. -----*/ - - /* Preparing each motor to perform a run at a specified speed. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_get_speed(); - } - - /* Performing the action on each motor at the same time. */ - uint32_t* results = x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Printing to the console. */ - printf(" Speed: M1 %d, M2 %d.\r\n", results[0], results[1]); - - /* Printing to the console. */ - printf("--> Doublig the speed while running again for %d seconds.\r\n", DELAY_3 / 1000); - - /* Preparing each motor to perform a run at a specified speed. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_run(StepperMotor::BWD, results[m] << 1); + while(1) + { + switch (StatusSpleisser) + { + case ST_SOLO: + if(InputKontrollmodul ==0) + { + EntrySOLO(); + } + else + { + StatusSpleisser = ST_DUO; + } + break; + case ST_DUO: + if(InputKontrollmodul ==1) + { + EntryDUO(); + } + else + { + StatusSpleisser = ST_SOLO; + } + break; + + } } - - /* Performing the action on each motor at the same time. */ - results = x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Waiting. */ - wait_ms(DELAY_3); - - /* Preparing each motor to perform a run at a specified speed. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_get_speed(); - } - - /* Performing the action on each motor at the same time. */ - results = x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Printing to the console. */ - printf(" Speed: M1 %d, M2 %d.\r\n", results[0], results[1]); - - /* Waiting. */ - wait_ms(DELAY_1); - - - /*----- Hard Stop. -----*/ - - /* Printing to the console. */ - printf("--> Hard Stop.\r\n"); - - /* Preparing each motor to perform a hard stop. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_hard_stop(); - } - - /* Performing the action on each motor at the same time. */ - x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Waiting. */ - wait_ms(DELAY_2); - - - /*----- Doing a full revolution on each motor, one after the other. -----*/ - - /* Printing to the console. */ - printf("--> Doing a full revolution on each motor, one after the other.\r\n"); - - /* Doing a full revolution on each motor, one after the other. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - for (int i = 0; i < MPR_1; i++) { - /* Computing the number of steps. */ - int steps = (int) (((int) init[m].fullstepsperrevolution * pow(2.0f, init[m].step_sel)) / MPR_1); - - /* Moving. */ - motors[m]->move(StepperMotor::FWD, steps); - - /* Waiting while active. */ - motors[m]->wait_while_active(); - - /* Waiting. */ - wait_ms(DELAY_1); - } - } - - /* Waiting. */ - wait_ms(DELAY_2); - - - /*----- High Impedance State. -----*/ - - /* Printing to the console. */ - printf("--> High Impedance State.\r\n"); - - /* Preparing each motor to set High Impedance State. */ - for (int m = 0; m < L6470DAISYCHAINSIZE; m++) { - motors[m]->prepare_hard_hiz(); - } - - /* Performing the action on each motor at the same time. */ - x_nucleo_ihm02a1->perform_prepared_actions(); - - /* Waiting. */ - wait_ms(DELAY_2); }