magvitron
Active Member
Hi,
i was doing a project on automatic sealing machine and I'm changing a printer to suit my needs., a lexmark printer. it has got a MISTSUMI unipolar 4.7 degree,10Ω. the problem is that the maximum RPM is very low when I m using an L293D h bridge driver. Im posting my code.. and every file I have.
View attachment stamper.zip
this is the piece of code that controls the stepper
void forward(int delayx)
{
PORTB = 0b10101111;
_delay_ms(3);
PORTB = 0b01101111;//-45*/
_delay_ms(3);
PORTB = 0b01011111;//-45*/
_delay_ms(3);
PORTB = 0b10011111;//-45*/
_delay_ms(3);
PORTB = 0b00000000;//-45*/
}
i was doing a project on automatic sealing machine and I'm changing a printer to suit my needs., a lexmark printer. it has got a MISTSUMI unipolar 4.7 degree,10Ω. the problem is that the maximum RPM is very low when I m using an L293D h bridge driver. Im posting my code.. and every file I have.
View attachment stamper.zip
Code:
/*****************************
Stamper
******************************
Program by : Manu krishnan
version : 1.0.0.0 (beta)
Assembled in : winavr
core : mega 8 (8k)
fuse : 8Mhz internal rc
rst disabled
AVR Studio : 4.15.623
GUI Version : 4, 15, 0, 623
AVR Simulator: 1, 0, 2, 1
ATMEGA16 247
date : 12 feb 2013 20.44
*******************************/
/*******************************
Preprovcessor Directive
*******************************/
#define F_CPU 1000000UL
//#include <avr/pgmspace.h>
#include<avr/io.h>
#include<util/delay.h>
//#include<avr/interrupt.h>
#include<avr/eeprom.h>
/******************************/
//MACROS
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)
/*******************************
LCD definitions
*******************************/
#define ctrl PORTD
#define en PD3 //enable signal
#define rs PD2 //resister select signal
/*******************************
uart definitions
*******************************/
#define motor PORTB
#define servo PB6
#define mot1 PB2
#define mot2 PB3
void init();
void backward(int delayx);
void forward(int delayx);
void servo_to(char degree);void calibrate();
void lcddata(char dataout);
void lcdcmd(char cmdout);
void dis_data(char data_value);
void to_line(char line,char pos);
void dis_cmd(char cmd_value);
void lcd_init(); // fuction for intialize
void run(unsigned char X);
void stamp();
unsigned int degree_value,time,number_of_steps;
unsigned char temp,del,k,serial,pre;
unsigned int max_ser,min_ser,addr,delay,r;
void lcd_write_string(char *str);
int main()
{
max_ser=180;
min_ser=0;
temp=100;
init();
to_line(1,0);
lcd_write_string("AutomaticStamper");
to_line(2,0);
lcd_write_string("----------------");
int i,j;
//_delay_ms(1000);
while(1)
{
for(j=0;j<=4;j++)
{
for(i=0;i<100;i++)
{
run('F');
}
stamp();
}
//_delay_ms(1000);
run('U');
_delay_ms(500);
stamp();
run('D');
_delay_ms(500);
}
}
void refil()
{
run('U');
_delay_ms(1000);
stamp();
run('D');
}
void init()
{
DDRB=0xff;DDRD=0xFC;
lcd_init();
ICR1=20000;
TCCR1A = (0<<COM1A0)|(1<<COM1A1)|(0<<COM1B0)|(0<<COM1B1)|(0<<FOC1A)|(0<<FOC1B)|(1<<WGM11)|(0<<WGM10);
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
}
void run(unsigned char X)
{
switch (X)
{
case 'F':
forward(1);
to_line(2,0);
lcd_write_string(" Stepper Forward");
pre='F';
break;
case 'B':
backward(26);
to_line(2,0);
lcd_write_string(" Stepper Backward");
pre='B';
break;
case 'S':
to_line(2,0);
lcd_write_string(" Stamping... ");
stamp();
break;
case 'U':
to_line(1,0);
lcd_write_string("Motor UP ");
output_high(motor,mot1) ;
output_low(motor,mot2);
break;
case 'D':
to_line(1,0);
lcd_write_string("Motor DOWN ");
output_high(motor,mot2);
output_low(motor,mot1);
break;
}
}
void stamp()
{
to_line(2,0);
lcd_write_string("Stamping...");
// unsigned int a;
OCR1A=2000;
_delay_ms(1000);
/////////////////
OCR1A=1000;
_delay_ms(1000);
// OCR1A=1000;
}
void forward(int delayx)
{
PORTB = 0b10101111;
_delay_ms(3);
PORTB = 0b01101111;//-45*/
_delay_ms(3);
PORTB = 0b01011111;//-45*/
_delay_ms(3);
PORTB = 0b10011111;//-45*/
_delay_ms(3);
PORTB = 0b00000000;//-45*/
}
void backward(int delayx)
{
PORTB = 0b1001;//-45
_delay_ms(delayx);
PORTB = 0b0101;//-135
_delay_ms(delayx);
PORTB = 0b0110; //+135
_delay_ms(delayx);
PORTB = 0b1010;//+45
_delay_ms(delayx);
PORTB = 0b0000;//-45
}
/*******************************
Class LCD 4 bit for 4 bit lcd
interface
*******************************/
void lcd_init() // fuction for intialize
{
dis_cmd(0x02); // to initialize LCD in 4-bit mode.
dis_cmd(0x28); //to initialize LCD in 2 lines, 5X7 dots and 4bit mode.
dis_cmd(0x0C);
dis_cmd(0x06);
dis_cmd(0x80);
_delay_ms(100);
}
void dis_cmd(char cmd_value)
{
char cmd_value1;
cmd_value1 = cmd_value & 0xF0; //mask lower nibble because PA4-PA7 pins are used.
lcdcmd(cmd_value1); // send to LCD
cmd_value1 = ((cmd_value<<4) & 0xF0); //shift 4-bit and mask
lcdcmd(cmd_value1); // send to LCD
}
void to_line(char line,char pos)
{
if(line ==1)
{
dis_cmd(0x80 + pos);
}
else
{
dis_cmd(0xC0+pos);
}
}
void clear()
{
to_line(1,0);
lcd_write_string(" ");
}
void dis_data(char data_value)
{
char data_value1;
data_value1=data_value&0xF0;
lcddata(data_value1);
data_value1=((data_value<<4)&0xF0);
lcddata(data_value1);
}
void lcdcmd(char cmdout)
{
ctrl=cmdout;
ctrl&=~(1<<rs);
ctrl|=(1<<en);
_delay_ms(1);
ctrl&=~(1<<en);
}
void lcddata(char dataout)
{
ctrl=dataout;
ctrl|=(1<<rs);
ctrl|=(1<<en);
_delay_ms(1);
ctrl&=~(1<<en);
}
void lcd_write_string(char *str) //take address vaue of the string in pionter *str
{
int i=0;
while(str[i]!='\0') // loop will go on till the NULL charaters is soon in string
{
dis_data(str[i]); // sending data on CD byte by byte
i++;
}
}
this is the piece of code that controls the stepper
void forward(int delayx)
{
PORTB = 0b10101111;
_delay_ms(3);
PORTB = 0b01101111;//-45*/
_delay_ms(3);
PORTB = 0b01011111;//-45*/
_delay_ms(3);
PORTB = 0b10011111;//-45*/
_delay_ms(3);
PORTB = 0b00000000;//-45*/
}