// // // hello.stepper.bipolar.44.c // // bipolar full stepping hello-world // // Neil Gershenfeld // 11/21/12 // // (c) Massachusetts Institute of Technology 2012 // This work may be reproduced, modified, distributed, // performed, and displayed for any purpose. Copyright is // retained and must be preserved. The work is provided // as is; no warranty is provided, and users accept all // liability. // #include #include #include #define RX PA6 // *** D3, Pin 2 //#define input_pin (1 << PA5) #define TX PA5 // *** D4, Pin 3 //#define output_pin (1 << PA6) #define output(directions,pin) (directions |= pin) // set port direction for output #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set //++++++++++++++++++++++++++++++++++from seraila NEIL+++++++++++++++++++++++++++++++++++++++++++++++ #define bit_delay_time 102 // bit delay for 115200 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define char_delay() _delay_ms(10) // char delay #define serial_port PORTA #define serial_direction DDRA #define serial_pins PINA #define serial_pin_in (1 << PA6) #define serial_pin_out (1 << PA5) #define max_buffer 25 //++++++++++++++++++++++++++++++++++from seraila NEIL+++++++++++++++++++++++++++++++++++++++++++++++ #define bridge_port PORTA // H-bridge port #define bridge_direction DDRA // H-bridge direction #define A2 (1 << PA0) // H-bridge output pins #define A1 (1 << PA1) // " #define B2 (1 << PA3) // " #define B1 (1 << PA4) // " #define on_delay() _delay_us(10) // PWM on time #define off_delay() _delay_us(2) // PWM off time #define PWM_count 100 // number of PWM cycles #define step_count 20 // number of steps #define wait_delay() _delay_us(1000) // PWM on time static uint8_t count; // // A+ B+ PWM pulse // void pulse_ApBp() { clear(bridge_port, A2); clear(bridge_port, B2); set(bridge_port, A1); set(bridge_port, B1); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A1); set(bridge_port, B1); on_delay(); clear(bridge_port, A1); clear(bridge_port, B1); off_delay(); } } // // A+ B- PWM pulse // void pulse_ApBm() { clear(bridge_port, A2); clear(bridge_port, B1); set(bridge_port, A1); set(bridge_port, B2); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A1); set(bridge_port, B2); on_delay(); clear(bridge_port, A1); clear(bridge_port, B2); off_delay(); } } // // A- B+ PWM pulse // void pulse_AmBp() { clear(bridge_port, A1); clear(bridge_port, B2); set(bridge_port, A2); set(bridge_port, B1); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A2); set(bridge_port, B1); on_delay(); clear(bridge_port, A2); clear(bridge_port, B1); off_delay(); } } // // A- B- PWM pulse // void pulse_AmBm() { clear(bridge_port, A1); clear(bridge_port, B1); set(bridge_port, A2); set(bridge_port, B2); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A2); set(bridge_port, B2); on_delay(); clear(bridge_port, A2); clear(bridge_port, B2); off_delay(); } } // // clockwise step //there is a bug if you call it repeatedly eventually it starts going back and frth instead of vcontinuiing going round void step_cw() { pulse_ApBp(); pulse_AmBp(); pulse_AmBm(); pulse_ApBm(); } // // counter-clockwise step //there is a possible bug if you call it repeatedly eventually it starts going back and frth instead of vcontinuiing going round. //could be connection in the electronics or miswiring ...... void step_ccw() { pulse_ApBm(); pulse_AmBm(); pulse_AmBp(); pulse_ApBp(); } // we want: // 1. start n at 0 // 2. repaet the following sequence but incremet the number of steps n by 50 each time: // 2a. the sequence is to spin n steps cw // 2b. than n steps step_ccw //spins n steps clockwise void step_ncw(int n) { int i=0; while(i 0); } else { int i = 0; while ( i < 15) { buffer[i] = buffer[i+2]; i++; } int number2 = atoi( buffer ); put_string(&serial_port, serial_pin_out, number2); step_nccw(number2); put_string(&serial_port, serial_pin_out, "positive"); put_char(&serial_port, serial_pin_out, 10); // new line do { put_string(&serial_port, serial_pin_out, "+z"); number2--; } while (number2 > 0); } } put_char(&serial_port, serial_pin_out, 10); // new line //if (index == (max_buffer-1)) memset(buffer, 0, 16); index = 0; } }