Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.20 KB | None | 0 0
  1. int pos = 0;
  2. int dir_pin = 3;
  3. int step_pin = 2;
  4. int dir_out_a_pin = 4;
  5. int pwm_out_a_pin = 5;
  6. int dir_out_b_pin = 7;
  7. int pwm_out_b_pin = 6;
  8.  
  9. int dir_out_a = 1;
  10. int dir_out_b = 1;
  11. int pwm_out_a = 0;
  12. int pwm_out_b = 0;
  13. int micro_steps = 32;
  14. float angle = 0;
  15. const float pi = 3.14159267;
  16.  
  17. void setup() {
  18.   Serial.begin(9600);
  19.   setPwmFrequency(5, 1);
  20.   pinMode(dir_pin, INPUT_PULLUP);
  21.   pinMode(step_pin, INPUT_PULLUP);
  22.   pinMode(dir_out_a_pin, OUTPUT);
  23.   pinMode(dir_out_a_pin, OUTPUT);
  24.   pinMode(pwm_out_a_pin, OUTPUT);
  25.   pinMode(dir_out_b_pin, OUTPUT);
  26.   pinMode(pwm_out_b_pin, OUTPUT);
  27.   attachInterrupt(digitalPinToInterrupt(step_pin), step, FALLING);
  28. }
  29.  
  30. void loop() {
  31. //  Serial.println(digitalRead(dir_pin));
  32.   delay(1);
  33. }
  34.  
  35. void setPwmFrequency(int pin, int divisor) {
  36.   byte mode;
  37.   if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
  38.     switch(divisor) {
  39.       case 1: mode = 0x01; break;
  40.       case 8: mode = 0x02; break;
  41.       case 64: mode = 0x03; break;
  42.       case 256: mode = 0x04; break;
  43.       case 1024: mode = 0x05; break;
  44.       default: return;
  45.     }
  46.     if(pin == 5 || pin == 6) {
  47.       TCCR0B = TCCR0B & 0b11111000 | mode;
  48.     } else {
  49.       TCCR1B = TCCR1B & 0b11111000 | mode;
  50.     }
  51.   } else if(pin == 3 || pin == 11) {
  52.     switch(divisor) {
  53.       case 1: mode = 0x01; break;
  54.       case 8: mode = 0x02; break;
  55.       case 32: mode = 0x03; break;
  56.       case 64: mode = 0x04; break;
  57.       case 128: mode = 0x05; break;
  58.       case 256: mode = 0x06; break;
  59.       case 1024: mode = 0x07; break;
  60.       default: return;
  61.     }
  62.     TCCR2B = TCCR2B & 0b11111000 | mode;
  63.   }
  64. }
  65.  
  66. float degree(float radians) {
  67.   return radians / 2 / pi * 360;
  68. }
  69.  
  70. float radian(float degrees) {
  71.   return degrees / 360 * 2 * pi;
  72. }
  73.  
  74. float abs_cos(float angle_in_degree) {
  75.   return abs(cos(radian(angle_in_degree)));
  76. }
  77.  
  78. float abs_sin(float angle_in_degree) {
  79.   return abs(sin(radian(angle_in_degree)));
  80. }
  81.  
  82. int pwm_out(float input) {
  83.   return 255/1*input;
  84. }
  85.  
  86. void step() {
  87.   // restart pos loop if we reach set microsteps in count up
  88.   if(pos == micro_steps) pos = 0;
  89.   // restart pos loop if we reach set microsteps in count down
  90.   if(pos == -1) pos = micro_steps-1;
  91.   // find angle from pos
  92.   angle = 360.0f/micro_steps*pos;
  93.   // set phase a
  94.   if(angle >= 90.0f) dir_out_a = 0;
  95.   if(angle >= 270.0f) dir_out_a = 1;
  96.   // set phase b
  97.   if(angle >= 0.0f) dir_out_b = 1;
  98.   if(angle >= 180.0f) dir_out_b = 0;
  99.   // read dir input
  100.   int dir=digitalRead(dir_pin);
  101.   // count up or down depending on dir input
  102.     if(dir == 1) {    
  103.     pos++;
  104.   } else {
  105.     pos--;
  106.   }
  107.   // write to pins
  108.   // dir pins
  109.   digitalWrite(dir_out_a_pin, dir_out_a);
  110.   digitalWrite(dir_out_b_pin, dir_out_b);
  111.   // pwm pins
  112.   analogWrite(pwm_out_a_pin, pwm_out(abs_cos(angle)));
  113.   analogWrite(pwm_out_b_pin, pwm_out(abs_sin(angle)));
  114.   /*
  115.   Serial.print("pos: ");
  116.   Serial.print(pos);
  117.   Serial.print(" dir_a: ");
  118.   Serial.print(dir_out_a);
  119.   Serial.print(" cur_a: ");
  120.   Serial.print(pwm_out(abs_cos(angle)));
  121.   Serial.print(" dir_b: ");
  122.   Serial.print(dir_out_b);
  123.   Serial.print(" cur_b: ");
  124.   Serial.print(pwm_out(abs_sin(angle)));
  125.   Serial.print(" Angle: ");
  126.   Serial.println(angle, DEC);
  127.   */
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement