powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм вычисления позиции
2 сообщений из 2, страница 1 из 1
Алгоритм вычисления позиции
    #39736702
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня 16-битный энкодер. По нему я знаю позицию мотора.
Проблема когда счетчик энкодера делает rollover.
Допустим энкодер считает вверх - первое чтение энкодера 65530, второе 10 – то есть произошел rollover и тогда позиция = 65535 + 10.
Энкодер считает вниз - первое чтение энкодера 10, второе 65530 - и тогда позиция = (65535-65530) + 10.
Но у меня почему то не получается построить правильный алгоритм. При смене направления UP-DOWN, DOWN-U что то ломается.

Вот пример симуляции в шарпе
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
UInt16 encoder_counter;
UInt16 prev_encoder_counter;
Int32 position;

 private void buttonEncUp_Click(object sender, EventArgs e)
        {
            encoder_counter += (UInt16)numericUpDownEncoderStep.Value;
            numericUpDowneEncoder.Value = encoder_counter;

            CalculatePosition();
        }

        private void buttonEncDown_Click(object sender, EventArgs e)
        {
            encoder_counter -= (UInt16)numericUpDownEncoderStep.Value;
            numericUpDowneEncoder.Value = encoder_counter;

            CalculatePosition();
        }

        void CalculatePosition()
        {
            if (comboBoxDirection.SelectedIndex == 0)  //UP
            {
                //overflow up - 0xFFFF -> 0
                if (encoder_counter < prev_encoder_counter)
                    position = 0xFFFF + encoder_counter;
                else
                    position = encoder_counter;
            }
            else if (comboBoxDirection.SelectedIndex == 1) //DOWN
            {
                //overflow down - 0 -> 0xFFFF 
                if (encoder_counter > prev_encoder_counter)
                    position = encoder_counter - 0xFFFF;
                else
                    position = encoder_counter;
            }

            prev_encoder_counter = encoder_counter;

            textBoxPosition.Text = position.ToString();
        }
...
Рейтинг: 0 / 0
Алгоритм вычисления позиции
    #39736754
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде мне удалось найти правильный алгоритм
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
        UInt16 encoder_counter;
        UInt16 prev_encoder_counter;
        Int32 position;
        Int32 rounds;
        UInt32 direction;

        private void buttonEncUp_Click(object sender, EventArgs e)
        {
            direction = 1;

            encoder_counter += (UInt16)numericUpDownEncoderStep.Value;
            numericUpDowneEncoder.Value = encoder_counter;

            GetEncoder();
       }

        private void buttonEncDown_Click(object sender, EventArgs e)
        {
            direction = 2;

            encoder_counter -= (UInt16)numericUpDownEncoderStep.Value;
            numericUpDowneEncoder.Value = encoder_counter;

            GetEncoder();
        }

        void GetEncoder()
        {
            if (Math.Abs(encoder_counter- prev_encoder_counter)>40000) //rollover
            {
                if (encoder_counter < prev_encoder_counter)
                    rounds++;
                else
                    rounds--;    
            }
            position = (Int32)((rounds * 65535) + encoder_counter);

            prev_encoder_counter = encoder_counter;

            textBoxPosition.Text = position.ToString();
        }
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм вычисления позиции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]