Advertisement
Guest User

Untitled

a guest
Nov 12th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include "pch.h"
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. //Mam sobie licznik, który zlicza zmiany pozycji enkodera
  10. //Mam też sobie pozycję w której defaultowo znajduje się serwo
  11. //Chcę napisać funkcję, która będzie porównywała dwa następujące po sobie stany licznika
  12. //Jeżeli poprzednia_pozycja_enkodera < obecna_pozycja_enkodera,  tzn. że wał obrócił się zgodnie z ruchem wskazówek zegara
  13. //I trzeba zwiększyć o 1 liczbę, która później będzie konwertowana do HEX i wysyłana w pakiecie do wysterowania serwa
  14. //Jeżeli natomiast jest ">", to analogicznie trzeba tę liczbę zmniejszyć
  15. //A jak jest "=" to chuuuuuuuj jej w duuuuupę staaaaaaryyy
  16. //Problem: jak porównać dwie zmieniające się w czasie pozycje enkodera (czyli de facto dwie liczby z zakresu 0-81** (?))
  17.  
  18. uint16_t impuls_count_encoder_1 = 528; //zmienna globalna; impulsy zliczone przez enkoder
  19. uint16_t previous_encoder_position = 0;
  20.  
  21. uint16_t dec2hex(uint16_t impuls_count_encoder_1) {
  22.  
  23.     int default_position = 0x1ff; //pozycja bazowa serwa (narazie 0x1ff, czyli 150*), później trzeba ją będzie podzielić na dwa bajty: Position_H i Position_L
  24.     int position = default_position;
  25.  
  26.     uint16_t actual_encoder_position = impuls_count_encoder_1;
  27.  
  28.     uint16_t how_many = (abs((previous_encoder_position - actual_encoder_position) / 8)); //dzielone przez 8, bo enkoder chyba zlicza 4*2048 imp/obr, a więc 8 imp z enkodera = 1 imp serwa
  29.  
  30.     if (actual_encoder_position > previous_encoder_position)
  31.         position += how_many;
  32.     else if (actual_encoder_position < previous_encoder_position)
  33.         position -= how_many;
  34.  
  35.     previous_encoder_position = actual_encoder_position;
  36.  
  37. // dopełnienie liczby HEX do formy czteroznakowej
  38.     int value = 0;
  39.     int n;
  40.     value = position;
  41.     char data[4];
  42.     n = sprintf_s(data, "%x", value);
  43.  
  44.     if (n == 1) {
  45.         data[3] = data[0];
  46.         for (int i = 0; i < 3; i++)
  47.             data[i] = '0';
  48.     }
  49.     else {
  50.         for (int i = n - 1; i >= 0; i--) {
  51.             data[i + 4 - n] = data[i];
  52.             data[i] = '0';
  53.         }
  54.     }
  55.  
  56.     return 0;
  57. }
  58.  
  59. int main() {
  60.  
  61.     dec2hex(impuls_count_encoder_1);
  62.  
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement