Friday, August 6, 2010

Computer controlling a DC motor...?

Hi,





I've heard this is possible and now I'd like to do it. I've been told that I can build, on a breadboard, a controller device that would let my computer control a motor connected to a battery (and tell it to run forwards, backwards, and at a variable speed). Does anyone know how to do this specifically (we can talk about it through E-mails or IM) or a site that has instructions for how to do this? If my computer could ';talk'; to the board through my USB or Modem, that would be great. As for programming, I'd like to use JAVA or C, if that makes any difference.





ThanksComputer controlling a DC motor...?
Stepper Motor (including circuitry)


Intel 8255 PC interface card














/*





FILE: STEPPER.C Adapted from Stepper.c by P.Oh


DESC: Speed and Positioning options for Stepper Motor











Port A has 5 lines attached and described as follows:











OP = PHASE Line A.0 1 enable / 0 disable





HS = HALF STEP Line A.1 2 enable / 0 disable





SI = STEP INPUT Line A.2 4 enable / 0 disable





DR = DIRECTION Line A.3 8 enable / 0 disable





OE : OUTPUT ENABLE Line A.4 16 enable / 0 disable





*/











#include%26lt;stdio.h%26gt;





#include%26lt;stdlib.h%26gt;





#include%26lt;dos.h%26gt; /* outportb, inportb defined here */





#include%26lt;conio.h%26gt; /* formatted text functions defined here */








void StepTheMotor(int, int, int);





void Selection(int, int, int);





void MoveToFixedAngle(int, int, int);





void Continuous(int, int, int);











void main(void) {











int Sgnal;





int BASEADDR;





int PORTA, PORTB, PORTC;





int CNTRL;





int Choice;





int StepsPerRev;





int DR = 0;

















clrscr(); /* clear screen */





window(5,5,75,30); /* set up text window */











gotoxy(1,1);





cprintf(';Enter Base Address (decimal) e.g. 608\n';);





gotoxy(1,2); scanf(';%d';, %26amp;BASEADDR);





PORTA = BASEADDR;





PORTB = BASEADDR + 1;





PORTC = BASEADDR + 2;





CNTRL = BASEADDR + 3;





outportb(CNTRL, 128); /* configure all ports for output */











outportb(PORTB, 0); /* Ports B and C not used, so just set to 0 */





outportb(PORTC, 0);











StepsPerRev = 96;





Selection(PORTA, StepsPerRev, DR);











} /* end of main */























void Selection(int PORTA, int StepsPerRev, int DR) {











/* Motor speed and position options */











int DegPerStep;





int Choice;











clrscr();





gotoxy(1,4); cprintf(';Motor requires %d steps per rev\n';, StepsPerRev);





DegPerStep = (int)(360 / StepsPerRev);





gotoxy(40,4); cprintf('; =%26gt; thus 1 step = %d degrees\n';, DegPerStep);











do {





gotoxy(1,6); cprintf(';(1) To rotate to a certain angle clockwise\n';);





gotoxy(1,7); cprintf(';(2) To rotate to a certain angle counter-clockwise\n';);





gotoxy(1,8); cprintf(';(3) To rotate continuously - with speed options\n';);





gotoxy(1,9); cprintf(';(4) To quit\n';);





gotoxy(1,10); cprintf(';Selection =%26gt;\n';);





gotoxy(14,10); scanf(';%d';, %26amp;Choice);











switch(Choice) {





case 1 : DR = 0;





MoveToFixedAngle(PORTA, DR, DegPerStep);





break;





case 2 : DR = 8;





MoveToFixedAngle(PORTA, DR, DegPerStep);





break;





case 3 : Continuous(PORTA, DR, StepsPerRev);





break;





case 4 : outportb(PORTA, 16); /* shutdown all signals */





gotoxy(1,22); cprintf(';Quitting\n';);





exit(0);





default : gotoxy(1,14); cprintf(';Choose 1, 2, 3, or 4\n';);





break;











}; /* end select */





} while (1); /* can only exit Selection if user selects 4 */











}; /* end of Selection */











void MoveToFixedAngle(int PORTA, int DR, int DegPerStep) {











int Degrees;





int NumberOfSteps;





char *GetKey[2];





int WaitSomeTime = 0;





int i;











clrscr();





if(DR == 0) {





gotoxy(1,4); cprintf(';Will step CW fixed number of degrees\n';);





} else { /* DR is 8 */





gotoxy(1,4); cprintf(';Will step CCW fixed number of degrees\n';);





};





gotoxy(1,5); cprintf(';Enter number of degrees =%26gt; ';);





gotoxy(28,5); scanf(';%d';, %26amp;Degrees);





gotoxy(1,7); cprintf(';Will step %d degrees';, Degrees);





gotoxy(1,8); cprintf(';Hit a key to start';);





while (!kbhit());











NumberOfSteps = (int)(Degrees / DegPerStep);





for(i = 1; i %26lt;= NumberOfSteps; i++) {





StepTheMotor(PORTA, DR, WaitSomeTime);





};





gotoxy(1,10); cprintf(';Finished!';);





gotoxy(1,11); cprintf(';Hit a key then %26lt;ENTER%26gt; to do another angle';);





gotoxy(42,11); cprintf(';or q then %26lt;ENTER%26gt; to quit to main menu';);





scanf(';%s';, %26amp;GetKey);





if(GetKey[0] == 'q' || GetKey[0] == 'Q') {





clrscr();





return;





} else {





MoveToFixedAngle(PORTA, DR, DegPerStep);





};











}; /* end of MoveToFixedAngle */











void Continuous(int PORTA, int DR, int StepsPerRev) {





int WaitSomeTime;





int TapKey;





int SpeedGrade;





int OE;











clrscr();





gotoxy(1,2); cprintf(';Tap a key:';);





gotoxy(1,3); cprintf(';(f)aster';);





gotoxy(1,4); cprintf(';(s)lower';);





gotoxy(1,5); cprintf(';(r)everse';);





gotoxy(1,6); cprintf(';(q)quit to main menu';);





gotoxy(1,7);





WaitSomeTime = 0;





SpeedGrade = 1;











do {





do {





StepTheMotor(PORTA, DR, WaitSomeTime);





} while(!kbhit());





TapKey = getch();











switch(TapKey) {





case 102 : /* hit f key */





WaitSomeTime = WaitSomeTime + 5;





if(WaitSomeTime %26gt;= 100) {





WaitSomeTime = 100;





gotoxy(1,10); cprintf(';Can't go faster';);





SpeedGrade = 20;





} else {





gotoxy(1,10); cprintf(';Going faster...';);





SpeedGrade = SpeedGrade + 1;





};





gotoxy(1,12); cprintf(';speed grade = %2d';, SpeedGrade);





StepTheMotor(PORTA, DR, WaitSomeTime);





break;





case 115 : /* hit s key */





WaitSomeTime = WaitSomeTime - 5;





if(WaitSomeTime %26lt;= 0) {





WaitSomeTime = 0;





gotoxy(1,10); cprintf(';Won't go slower';);





SpeedGrade = 0;





} else {





gotoxy(1,10); cprintf(';Going slower...';);





SpeedGrade = SpeedGrade - 1;





};





gotoxy(1,12); cprintf(';speed grade = %2d';, SpeedGrade);





StepTheMotor(PORTA, DR, WaitSomeTime);





break;





case 114 : /* hit the r key */





gotoxy(1,14); cprintf(';Reversing direction';);





delay(500);





gotoxy(1,14); cprintf('; ';);





gotoxy(1,7);





if(DR == 0) {





DR = 8;





} else {





DR = 0;





};





StepTheMotor(PORTA, DR, WaitSomeTime);





break;





case 113 : /* hit the q key */





OE = 16;





outportb(PORTA, OE);





clrscr();





Selection(PORTA, StepsPerRev, DR);





break;





default : break;





};





} while (1);











}; /* end of Continuous */











void StepTheMotor(int PORTA, int DR, int WaitSomeTime) {











int i;





int SI = 4;





int OE = 0;





int FixedTime = 100; /* 100 msec */





outportb(PORTA, SI + DR + OE);





SI = 0;





OE = 0;





delay(FixedTime-WaitSomeTime); /* 100 msec */





outportb(PORTA, SI + DR + OE);





return;











}; /* --- end of StepTheMotor --- */
  • trilogy
  • No comments:

    Post a Comment