hi this venkatesh, i am doing a project i.e. controlling 0 to 300 rpm speed of bipolar stepper motor (nema 34,68kg cm,1.8 deg per step ) . For this i have used arduino uno & Bipolar stepper drive with 256 micro stepping. in programming i used only 8 micro stepping. But the problem if the speed more than 200 rpm while starting , jerking is happening. then after the speed was reduced to 30 or 44 rpm .
note : for start , stop, inc & dec pins can be used as pull up resistor.
i am unable to find the solution for above problem.
plz help me and the arduino code is below.
//arduino code
//
#include <TimerOne.h>
#include <EEPROM.h>
int digit1 = 10; //PWM Display segment 1
int digit2 = 11; //PWM Display segment 2
int digit3 = 12; //PWM Display segment 3
int digit4 = 13; //PWM Display segment 4
//Pin mapping from Arduino to the ATmega DIP28 if you need it
//http://www.arduino.cc/en/Hacking/PinMapping
int segA = 2; //Display LED A
int segB = 3; //Display LED B
int segC = A4; //Display LED C
int segD = A5; //Display LED D
int segE = 7; //Display LED E
int segF = 8; //Display LED F
int segG = 9; //Display LED G
int rpm;
int initial_rpm;
int dutycycle_time=0;
int stepper_Enable=5; //STEPPER MOTOR ENABLE PIN : PUL-
int stepper_Pulse=6; // STEPPER MOTOR PULSE PIN : PUL-
int address_eeprom=0;
void displayNumber(int);
void lightNumber(int);
void setup()
{
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(digit1, OUTPUT);
pinMode(digit2, OUTPUT);
pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT);
// pinMode(start_1,INPUT);
// pinMode(stop_1,INPUT);
//Serial.begin(9600);
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
pinMode(stepper_Pulse,OUTPUT); // Analog pin A2 is used for ENABLING the steeper motor
pinMode(stepper_Enable,OUTPUT); // Analog pin A2 is used for DIRECTION the steeper motor
// pinMode(5,OUTPUT); // Analog pin A2 is used for PULSE GENERATING the steeper motor
digitalWrite(stepper_Pulse,HIGH);
digitalWrite(stepper_Enable,LOW);
//digitalWrite(5,HIGH);
//pinMode(13, OUTPUT);
rpm=EEPROM.read(address_eeprom);
}
void loop()
{
while(digitalRead(stepper_Enable)==HIGH){
displayNumber(rpm);
int cycle_freq=(1600/60)*rpm;
int dutycycle_freq=2*cycle_freq;
int dutycycle_time=1000000/dutycycle_freq;
Timer1.initialize(dutycycle_time); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
if(analogRead(A3)==LOW ) // STOPPING THE STEPPER MOTOR
{
digitalWrite(stepper_Enable,LOW);
}
}
while(digitalRead(stepper_Enable)==LOW)
{
int initial_rpm=rpm;
displayNumber(rpm);
EEPROM.write(address_eeprom,rpm);
if(analogRead(A0)==LOW && rpm<300 ) ///increasing speed of stepper motor
{
rpm=rpm+1;
// delay(100);
}
if(analogRead(A1)==LOW && rpm>0) ///decreasing speed of stepper motor
{
rpm=rpm-1;
// delay(100);
}
if(analogRead(A2)==LOW ) //STARTING THE STEPPER MOTOR
{
digitalWrite(stepper_Enable,HIGH);
}
}
if(initial_rpm!=rpm){
address_eeprom=address_eeprom+1;}
}
void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
long beginTime = millis();
for(int digit = 4 ; digit > 0 ; digit--) {
//Turn on a digit for a short amount of time
switch(digit) {
case 1:
digitalWrite(digit1, DIGIT_ON);
break;
case 2:
digitalWrite(digit2, DIGIT_ON);
break;
case 3:
digitalWrite(digit3, DIGIT_ON);
break;
case 4:
digitalWrite(digit4, DIGIT_ON);
break;
}
//Turn on the right segments for this digit
lightNumber(toDisplay % 10);
toDisplay /= 10;
delayMicroseconds(DISPLAY_BRIGHTNESS);
lightNumber(10);
//Turn off all digits
digitalWrite(digit1, DIGIT_OFF);
digitalWrite(digit2, DIGIT_OFF);
digitalWrite(digit3, DIGIT_OFF);
digitalWrite(digit4, DIGIT_OFF);
}
while( (millis() - beginTime) < 20) ;
//Wait for 20ms to pass before we paint the display again
}
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
switch (numberToDisplay){
case 0:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF);
break;
case 1:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 2:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 3:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON);
break;
case 4:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 5:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 6:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 7:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
case 8:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 9:
digitalWrite(segA, SEGMENT_ON);
digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON);
digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON);
break;
case 10:
digitalWrite(segA, SEGMENT_OFF);
digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF);
digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF);
digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF);
break;
}
}
void timerIsr()
{
// Toggle LED
digitalWrite( stepper_Pulse, !digitalRead( stepper_Pulse ));
}