Advertisement
Guest User

Untitled

a guest
Jul 9th, 2015
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #define measurepin 0
  2. #define pwmPin 3
  3. #define maxPwmChange 25
  4. #define pwmChangeTreshold 250
  5.  
  6. unsigned long currentRPM = 0;
  7. volatile bool durUpToDate = false;
  8. volatile unsigned long start = 0;
  9. volatile unsigned long dur = 0;
  10.  
  11. int currentPWM = 0;
  12. unsigned long wantedRPM = 2300;
  13.  
  14. long long_abs(long val){
  15.   if(val >= 0){
  16.     return val;
  17.   }
  18.   return -val;
  19. }
  20.  
  21. long long_sign(long val){
  22.   if(val > 0){
  23.     return 1;
  24.   }else if( val < 0){
  25.     return -1;
  26.   }
  27.   return 0;
  28. }
  29.  
  30. long long_map(long value, double istart, double istop, double ostart, double ostop) {
  31.     return (long)(ostart + (ostop - ostart) * ((value - istart) / (istop - istart)));
  32. }
  33.  
  34. void setup() {
  35.   Serial.begin(9600);
  36.   pinMode(pwmPin,OUTPUT);
  37.  
  38.   start = micros();
  39.   attachInterrupt(measurepin, rise, RISING);
  40. }
  41.  
  42. long currentPWMChange = 0;
  43.  
  44. void loop() {
  45.   for(int i =0; i< 10; i++){
  46.     delay(50);
  47.  
  48.     if(durUpToDate){
  49.       durUpToDate = false;
  50.       double rpm = (1000000.0/dur)/16; //approx. pulses per second. divided by 16 gives revolutions per second.
  51.       rpm*=60; //per minute
  52.       currentRPM = (unsigned long) rpm;
  53.     }else{
  54.       currentRPM = 0;
  55.     }
  56.  
  57.     long desired = wantedRPM-currentRPM;
  58.     long desiredMag = long_abs(desired);
  59.     desired = long_sign(desired);
  60.    
  61.     if(desiredMag < pwmChangeTreshold){
  62.       desired *= long_map(desiredMag,0,pwmChangeTreshold,0,maxPwmChange); // map(d,0,100,0,maxspeed);
  63.     }else{
  64.       desired *= maxPwmChange;
  65.     }
  66.  
  67.     long mod = desired - currentPWMChange;
  68.     currentPWMChange += mod;
  69.    
  70.     currentPWM += currentPWMChange;
  71.  
  72.     if(currentPWM >255){
  73.       currentPWM = 255;
  74.     }else if(currentPWM < 0){
  75.       currentPWM = 0;
  76.     }
  77.    
  78.     analogWrite(pwmPin,255-currentPWM); //reversed cause npn negates
  79.   }
  80.   Serial.print("RPM: ");
  81.   Serial.println(currentRPM);
  82.   Serial.print("DUR: ");
  83.   Serial.println(dur);
  84.   Serial.print("PWM: ");
  85.   Serial.println(currentPWM);
  86. }
  87.  
  88. void rise(){
  89.   unsigned long end_ = micros();
  90.   dur = end_ - start;
  91.   durUpToDate = true;
  92.   start = end_;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement