v12345vtm

wat

Mar 16th, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.91 KB | None | 0 0
  1. // For RAMPS 1.4
  2. #define X_DIR_PIN 55
  3. #define X_STEP_PIN 54
  4. #define X_ENABLE_PIN 38
  5.  
  6. #define Y_DIR_PIN 61
  7. #define Y_STEP_PIN 60
  8. #define Y_ENABLE_PIN 56
  9.  
  10. #define Z_DIR_PIN 48
  11. #define Z_STEP_PIN 46
  12. #define Z_ENABLE_PIN 62
  13.  
  14. #define A_DIR_PIN 28
  15. #define A_STEP_PIN 26
  16. #define A_ENABLE_PIN 24
  17.  
  18. #define B_DIR_PIN 34
  19. #define B_STEP_PIN 36
  20. #define B_ENABLE_PIN 30
  21.  
  22. #define C_DIR_PIN 32
  23. #define C_STEP_PIN 47
  24. #define C_ENABLE_PIN 45
  25.  
  26. #define X_STEP_HIGH PORTF |= 0b00000001;
  27. #define X_STEP_LOW PORTF &= ~0b00000001;
  28.  
  29. #define Y_STEP_HIGH PORTF |= 0b01000000;
  30. #define Y_STEP_LOW PORTF &= ~0b01000000;
  31.  
  32. #define Z_STEP_HIGH PORTL |= 0b00001000;
  33. #define Z_STEP_LOW PORTL &= ~0b00001000;
  34.  
  35. #define A_STEP_HIGH PORTA |= 0b00010000;
  36. #define A_STEP_LOW PORTA &= ~0b00010000;
  37.  
  38. #define B_STEP_HIGH PORTC |= 0b00000010;
  39. #define B_STEP_LOW PORTC &= ~0b00000010;
  40.  
  41. #define C_STEP_HIGH PORTL |= 0b00000100;
  42. #define C_STEP_LOW PORTL &= ~0b00000100;
  43.  
  44. #define TIMER1_INTERRUPTS_ON TIMSK1 |= (1 << OCIE1A);
  45. #define TIMER1_INTERRUPTS_OFF TIMSK1 &= ~(1 << OCIE1A);
  46.  
  47. struct stepperInfo {
  48. // externally defined parameters
  49. float acceleration;
  50. volatile unsigned int minStepInterval; // ie. max speed, smaller is faster
  51. void (*dirFunc)(int);
  52. void (*stepFunc)();
  53.  
  54. // derived parameters
  55. unsigned int c0; // step interval for first step, determines acceleration
  56. long stepPosition; // current position of stepper (total of all movements taken so far)
  57.  
  58. // per movement variables (only changed once per movement)
  59. volatile int dir; // current direction of movement, used to keep track of position
  60. volatile unsigned int totalSteps; // number of steps requested for current movement
  61. volatile bool movementDone = false; // true if the current movement has been completed (used by main program to wait for completion)
  62. volatile unsigned int rampUpStepCount; // number of steps taken to reach either max speed, or half-way to the goal (will be zero until this number is known)
  63.  
  64. // per iteration variables (potentially changed every interrupt)
  65. volatile unsigned int n; // index in acceleration curve, used to calculate next interval
  66. volatile float d; // current interval length
  67. volatile unsigned long di; // above variable truncated
  68. volatile unsigned int stepCount; // number of steps completed in current movement
  69. };
  70.  
  71. void xStep() {
  72. X_STEP_HIGH
  73. X_STEP_LOW
  74. }
  75. void xDir(int dir) {
  76. digitalWrite(X_DIR_PIN, dir);
  77. }
  78.  
  79. void yStep() {
  80. Y_STEP_HIGH
  81. Y_STEP_LOW
  82. }
  83. void yDir(int dir) {
  84. digitalWrite(Y_DIR_PIN, dir);
  85. }
  86.  
  87. void zStep() {
  88. Z_STEP_HIGH
  89. Z_STEP_LOW
  90. }
  91. void zDir(int dir) {
  92. digitalWrite(Z_DIR_PIN, dir);
  93. }
  94.  
  95. void aStep() {
  96. A_STEP_HIGH
  97. A_STEP_LOW
  98. }
  99. void aDir(int dir) {
  100. digitalWrite(A_DIR_PIN, dir);
  101. }
  102.  
  103. void bStep() {
  104. B_STEP_HIGH
  105. B_STEP_LOW
  106. }
  107. void bDir(int dir) {
  108. digitalWrite(B_DIR_PIN, dir);
  109. }
  110.  
  111. void cStep() {
  112. C_STEP_HIGH
  113. C_STEP_LOW
  114. }
  115. void cDir(int dir) {
  116. digitalWrite(C_DIR_PIN, dir);
  117. }
  118.  
  119. void resetStepperInfo( stepperInfo& si ) {
  120. si.n = 0;
  121. si.d = 0;
  122. si.di = 0;
  123. si.stepCount = 0;
  124. si.rampUpStepCount = 0;
  125. si.totalSteps = 0;
  126. si.stepPosition = 0;
  127. si.movementDone = false;
  128. }
  129.  
  130. #define NUM_STEPPERS 6
  131.  
  132. volatile stepperInfo steppers[NUM_STEPPERS];
  133.  
  134. void setup() {
  135.  
  136. pinMode(X_STEP_PIN, OUTPUT);
  137. pinMode(X_DIR_PIN, OUTPUT);
  138. pinMode(X_ENABLE_PIN, OUTPUT);
  139.  
  140. pinMode(Y_STEP_PIN, OUTPUT);
  141. pinMode(Y_DIR_PIN, OUTPUT);
  142. pinMode(Y_ENABLE_PIN, OUTPUT);
  143.  
  144. pinMode(Z_STEP_PIN, OUTPUT);
  145. pinMode(Z_DIR_PIN, OUTPUT);
  146. pinMode(Z_ENABLE_PIN, OUTPUT);
  147.  
  148. pinMode(A_STEP_PIN, OUTPUT);
  149. pinMode(A_DIR_PIN, OUTPUT);
  150. pinMode(A_ENABLE_PIN, OUTPUT);
  151.  
  152. pinMode(B_STEP_PIN, OUTPUT);
  153. pinMode(B_DIR_PIN, OUTPUT);
  154. pinMode(B_ENABLE_PIN, OUTPUT);
  155.  
  156. pinMode(C_STEP_PIN, OUTPUT);
  157. pinMode(C_DIR_PIN, OUTPUT);
  158. pinMode(C_ENABLE_PIN, OUTPUT);
  159.  
  160. digitalWrite(X_ENABLE_PIN, LOW);
  161. digitalWrite(Y_ENABLE_PIN, LOW);
  162. digitalWrite(Z_ENABLE_PIN, LOW);
  163. digitalWrite(A_ENABLE_PIN, LOW);
  164. digitalWrite(B_ENABLE_PIN, LOW);
  165. digitalWrite(C_ENABLE_PIN, LOW);
  166.  
  167. noInterrupts();
  168. TCCR1A = 0;
  169. TCCR1B = 0;
  170. TCNT1 = 0;
  171.  
  172. OCR1A = 1000; // compare value
  173. TCCR1B |= (1 << WGM12); // CTC mode
  174. TCCR1B |= ((1 << CS11) | (1 << CS10)); // 64 prescaler
  175. interrupts();
  176.  
  177. steppers[0].dirFunc = bDir;
  178. steppers[0].stepFunc = bStep;
  179. steppers[0].acceleration = 1000;
  180. steppers[0].minStepInterval = 50;
  181.  
  182. steppers[1].dirFunc = aDir;
  183. steppers[1].stepFunc = aStep;
  184. steppers[1].acceleration = 4000;
  185. steppers[1].minStepInterval = 50;
  186.  
  187. steppers[2].dirFunc = cDir;
  188. steppers[2].stepFunc = cStep;
  189. steppers[2].acceleration = 1000;
  190. steppers[2].minStepInterval = 50;
  191.  
  192. steppers[3].dirFunc = xDir;
  193. steppers[3].stepFunc = xStep;
  194. steppers[3].acceleration = 1000;
  195. steppers[3].minStepInterval = 250;
  196.  
  197. steppers[4].dirFunc = yDir;
  198. steppers[4].stepFunc = yStep;
  199. steppers[4].acceleration = 1000;
  200. steppers[4].minStepInterval = 50;
  201.  
  202. steppers[5].dirFunc = zDir;
  203. steppers[5].stepFunc = zStep;
  204. steppers[5].acceleration = 1000;
  205. steppers[5].minStepInterval = 450;
  206. }
  207.  
  208. void resetStepper(volatile stepperInfo& si) {
  209. si.c0 = si.acceleration;
  210. si.d = si.c0;
  211. si.di = si.d;
  212. si.stepCount = 0;
  213. si.n = 0;
  214. si.rampUpStepCount = 0;
  215. si.movementDone = false;
  216. }
  217.  
  218. volatile byte remainingSteppersFlag = 0;
  219.  
  220. void prepareMovement(int whichMotor, int steps) {
  221. volatile stepperInfo& si = steppers[whichMotor];
  222. si.dirFunc( steps < 0 ? HIGH : LOW );
  223. si.dir = steps > 0 ? 1 : -1;
  224. si.totalSteps = abs(steps);
  225. resetStepper(si);
  226. remainingSteppersFlag |= (1 << whichMotor);
  227. }
  228.  
  229. volatile byte nextStepperFlag = 0;
  230.  
  231. volatile int ind = 0;
  232. volatile unsigned int intervals[100];
  233.  
  234. void setNextInterruptInterval() {
  235.  
  236. bool movementComplete = true;
  237.  
  238. unsigned int mind = 999999;
  239. for (int i = 0; i < NUM_STEPPERS; i++) {
  240. if ( ((1 << i) & remainingSteppersFlag) && steppers[i].di < mind ) {
  241. mind = steppers[i].di;
  242. }
  243. }
  244.  
  245. nextStepperFlag = 0;
  246. for (int i = 0; i < NUM_STEPPERS; i++) {
  247. if ( ! steppers[i].movementDone )
  248. movementComplete = false;
  249.  
  250. if ( ((1 << i) & remainingSteppersFlag) && steppers[i].di == mind )
  251. nextStepperFlag |= (1 << i);
  252. }
  253.  
  254. if ( remainingSteppersFlag == 0 ) {
  255. OCR1A = 65500;
  256. }
  257.  
  258. OCR1A = mind;
  259. }
  260.  
  261. ISR(TIMER1_COMPA_vect)
  262. {
  263. unsigned int tmpCtr = OCR1A;
  264.  
  265. OCR1A = 65500;
  266.  
  267. for (int i = 0; i < NUM_STEPPERS; i++) {
  268.  
  269. if ( ! ((1 << i) & remainingSteppersFlag) )
  270. continue;
  271.  
  272. if ( ! (nextStepperFlag & (1 << i)) ) {
  273. steppers[i].di -= tmpCtr;
  274. continue;
  275. }
  276.  
  277. volatile stepperInfo& s = steppers[i];
  278.  
  279. if ( s.stepCount < s.totalSteps ) {
  280. s.stepFunc();
  281. s.stepCount++;
  282. s.stepPosition += s.dir;
  283. if ( s.stepCount >= s.totalSteps ) {
  284. s.movementDone = true;
  285. remainingSteppersFlag &= ~(1 << i);
  286. }
  287. }
  288.  
  289. if ( s.rampUpStepCount == 0 ) {
  290. s.n++;
  291. s.d = s.d - (2 * s.d) / (4 * s.n + 1);
  292. if ( s.d <= s.minStepInterval ) {
  293. s.d = s.minStepInterval;
  294. s.rampUpStepCount = s.stepCount;
  295. }
  296. if ( s.stepCount >= s.totalSteps / 2 ) {
  297. s.rampUpStepCount = s.stepCount;
  298. }
  299. }
  300. else if ( s.stepCount >= s.totalSteps - s.rampUpStepCount ) {
  301. s.d = (s.d * (4 * s.n + 1)) / (4 * s.n + 1 - 2);
  302. s.n--;
  303. }
  304.  
  305. s.di = s.d; // integer
  306. }
  307.  
  308. setNextInterruptInterval();
  309.  
  310. TCNT1 = 0;
  311. }
  312.  
  313. void runAndWait() {
  314. setNextInterruptInterval();
  315. while ( remainingSteppersFlag );
  316. }
  317.  
  318. void loop() {
  319.  
  320. TIMER1_INTERRUPTS_ON
  321.  
  322. for (int i = 0; i < 4; i++) {
  323. for (int k = 0; k < NUM_STEPPERS; k++) {
  324. prepareMovement( k, 200 );
  325. runAndWait();
  326. }
  327. }
  328. for (int i = 0; i < 4; i++) {
  329. for (int k = 0; k < NUM_STEPPERS; k++) {
  330. prepareMovement( k, 200 );
  331. }
  332. runAndWait();
  333. }
  334.  
  335. for (int i = 0; i < NUM_STEPPERS; i++)
  336. prepareMovement( i, 400 );
  337. runAndWait();
  338. for (int i = 0; i < NUM_STEPPERS; i++)
  339. prepareMovement( i, -400 );
  340. runAndWait();
  341. for (int i = 0; i < NUM_STEPPERS; i++)
  342. prepareMovement( i, 200 );
  343. runAndWait();
  344. for (int i = 0; i < NUM_STEPPERS; i++)
  345. prepareMovement( i, -200 );
  346. runAndWait();
  347. for (int i = 0; i < NUM_STEPPERS; i++)
  348. prepareMovement( i, 600 );
  349. runAndWait();
  350. for (int i = 0; i < NUM_STEPPERS; i++)
  351. prepareMovement( i, -600 );
  352. runAndWait();
  353.  
  354. while (true);
  355.  
  356. }
Advertisement
Add Comment
Please, Sign In to add comment