Перейти к содержанию
    

Абсолютный энкодер с SSI-протоколом

Всем здравствуйте.

Решил поиграться с абсолютным энкодером, у которого внутри опционально стоит еще и инкрементальный (кому интересно: "Kubler" Type: 8.9081.3252.2003 Code: 24 Bit Gray). Он остался от старого проекта, абсолютный читался контроллером, инкрементальный использовался в качестве ОС для частотного преобразователя (векторное управление). Сейчас оба подключил к контроллеру (LPC1768): инкрементальный к QEI-модулю, а абсолютный через ногодрыг реализовал SSI-протокол. Программно синхронизирую оба, кручу энкодер и вижу чудеса:

 

 

Отладочный лог.
Примечание:
Inc - показания QEI-модуля (учетверенное значение инк.энк.) 2048 имп/оборот => 8192 имп/оборот
Abs - показания абсолютного энк. (младший бит = 0, так как для выравнивания показаний с инк.энк. пришлось умножать на 2) 4096 имп/оборот * 2
32 бита - специфика программы
Dif - разница между ними, интервал - 100 мс

Inc = 0x7E04C70E  Abs = 0x7E04C70E  Dif = 0
Inc = 0x7E04C70E  Abs = 0x7E04C70E  Dif = 0
Inc = 0x7E04C70C  Abs = 0x7E04C70E  Dif = -2
Inc = 0x7E04C6BD  Abs = 0x7E04C70C  Dif = -79
Inc = 0x7E04C679  Abs = 0x7E04C6BE  Dif = -69
Inc = 0x7E04C656  Abs = 0x7E04C67A  Dif = -36
Inc = 0x7E04C643  Abs = 0x7E04C656  Dif = -19
Inc = 0x7E04C64E  Abs = 0x7E04C644  Dif = 10
Inc = 0x7E04C666  Abs = 0x7E04C64E  Dif = 24
Inc = 0x7E04C657  Abs = 0x7E04C666  Dif = -15
Inc = 0x7E04C64A  Abs = 0x7E04C658  Dif = -14
Inc = 0x7E04C64C  Abs = 0x7E04C64A  Dif = 2
Inc = 0x7E04C64D  Abs = 0x7E04C64C  Dif = 1
Inc = 0x7E04C650  Abs = 0x7E04C64E  Dif = 2
Inc = 0x7E04C657  Abs = 0x7E04C650  Dif = 7
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C658  Abs = 0x7E04C658  Dif = 0
Inc = 0x7E04C658  Abs = 0x7E04C658  Dif = 0
Inc = 0x7E04C658  Abs = 0x7E04C658  Dif = 0
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C657  Abs = 0x7E04C658  Dif = -1
Inc = 0x7E04C656  Abs = 0x7E04C658  Dif = -2
Inc = 0x7E04C655  Abs = 0x7E04C656  Dif = -1
Inc = 0x7E04C4EB  Abs = 0x7E04C656  Dif = -363
Inc = 0x7E04C0D7  Abs = 0x7E04C4F0  Dif = -1049
Inc = 0x7E04BB4E  Abs = 0x7E04C0E0  Dif = -1426
Inc = 0x7E04B582  Abs = 0x7E04BB56  Dif = -1492
Inc = 0x7E04AF73  Abs = 0x7E04B590  Dif = -1565
Inc = 0x7E04A8F7  Abs = 0x7E04AF7E  Dif = -1671
Inc = 0x7E04A252  Abs = 0x7E04A8FE  Dif = -1708
Inc = 0x7E049BE5  Abs = 0x7E04A25E  Dif = -1657
Inc = 0x7E04972C  Abs = 0x7E049BEE  Dif = -1218
Inc = 0x7E0496BC  Abs = 0x7E049730  Dif = -116
Inc = 0x7E0496BC  Abs = 0x7E0496BC  Dif = 0
Inc = 0x7E0496BC  Abs = 0x7E0496BC  Dif = 0

 

Пока энкодер в покое показания совпадают, начинаешь вращать - показания не совпадают.

Оказалось что SSI мне выдает информацию с задержкой на один запрос.

 

note1_2004_1.pdf

 

 

По описанию SSI-протокола по первому синхроимпульсу TSSI информация фиксируется и с последующими выдается в RSSI. У меня-же получается что значение фиксируется в буфере, а мне выдается значение зафиксированное при прошлом запросе, текущее значение будет выдано при следующем запросе. Там же написано что можно одно и то-же показание считать несколько раз если выдать лишний синхроимпульс, я подумал что возможно моя ошибка выливается в этот случай и стал менять число синхроимпульсов как в большую, так и в меньшую сторону, но кардинальных изменений кроме увеличения/уменьшения показаний в 2/4 раза не получил. Показания так-же задерживаются на один запрос.

Дальше еще интересней. Выключаю питание, проворачиваю энкодер, включаю питание:

 

Отладочный лог.
Примечание: первое значение - "сырое" число из SSI-протокола.

0x0000C2AA  Inc = 0x8000C2AA  Abs = 0x8000C2AA  Dif = 0
Save position on Power off!

Start System
Ver 1.1 14:10:50 Mar 14 2012
Init RS232
Init RS485
Reset from : POR EXTR BODR
Init EEPROM
Init Data from EEPROM
Init SSI Absolute Encoder : 0x0000C2AA  0x0000D514  0x8000D514
Correct Increment Encoder!
Init Increment Encoder to B = \/ 0x8000D514
0x0000D514  Inc = 0x8000D514  Abs = 0x8000D514  Dif = 0
0x0000D514  Inc = 0x8000D514  Abs = 0x8000D514  Dif = 0

...

0x0000D514  Inc = 0x8000D514  Abs = 0x8000D514  Dif = 0
Save position on Power off!

Start System
Ver 1.1 14:10:50 Mar 14 2012
Init RS232
Init RS485
Reset from : POR EXTR BODR
Init EEPROM
Init Data from EEPROM
Init SSI Absolute Encoder : 0x0000D514  0x0000F1E6  0x8000F1E6
Correct Increment Encoder!
Init Increment Encoder to B = /\ 0x8000F1E6
0x0000F1E6  Inc = 0x8000F1E6  Abs = 0x8000F1E6  Dif = 0
0x0000F1E6  Inc = 0x8000F1E6  Abs = 0x8000F1E6  Dif = 0

 

После выключения питания в буфере энкодера сохраняется значение, зафиксированное в последний раз перед отключением питания! "0x0000D514 0x0000F1E6" - это я уже специально стал считывать дважды при инициализации.

 

Теперь приходится каждый раз читать дважды, но это-же бардак. И так процесс неспешный (1 считывание = 26 тактов по 1 мкс), так надо еще между ними паузу вставлять не менее 30 мкс в моем случае, итого набирается 82 мкс. Но даже сейчас цифры не совпадают:

 

 

Отладочный лог.
Примечание: два первых значения - "сырые" числа из SSI-протокола.

0x00008A6C  0x00008A6A  Inc = 0x80008A6A  Abs = 0x80008A6A  Dif = 0
0x00008A6A  0x00008A68  Inc = 0x80008A69  Abs = 0x80008A68  Dif = 1
0x00008A68  0x00008A68  Inc = 0x80008A69  Abs = 0x80008A68  Dif = 1
0x00008A68  0x00008A68  Inc = 0x80008A69  Abs = 0x80008A68  Dif = 1
0x00008A68  0x00008A68  Inc = 0x80008A69  Abs = 0x80008A68  Dif = 1
0x00008A68  0x00008A68  Inc = 0x80008A69  Abs = 0x80008A68  Dif = 1
0x00008A68  0x00008BC8  Inc = 0x80008BD1  Abs = 0x80008BC8  Dif = 9
0x00008BC8  0x000094CA  Inc = 0x800094D8  Abs = 0x800094CA  Dif = 14
0x000094CA  0x0000A1AE  Inc = 0x8000A1C7  Abs = 0x8000A1AE  Dif = 25
0x0000A1AE  0x0000AFD0  Inc = 0x8000AFEF  Abs = 0x8000AFD0  Dif = 31
0x0000AFD0  0x0000BE2A  Inc = 0x8000BE3E  Abs = 0x8000BE2A  Dif = 20
0x0000BE2A  0x0000CCC4  Inc = 0x8000CCE1  Abs = 0x8000CCC4  Dif = 29
0x0000CCC4  0x0000DF06  Inc = 0x8000DF3B  Abs = 0x8000DF06  Dif = 53
0x0000DF24  0x0000F94E  Inc = 0x8000F990  Abs = 0x8000F94E  Dif = 66
0x0000F974  0x000115E2  Inc = 0x80011628  Abs = 0x800115E2  Dif = 70
0x00011608  0x00013354  Inc = 0x80013376  Abs = 0x80013354  Dif = 34
0x00013354  0x00015114  Inc = 0x8001515E  Abs = 0x80015114  Dif = 74
0x0001513E  0x0001713A  Inc = 0x80017184  Abs = 0x8001713A  Dif = 74
0x0001713A  0x00019296  Inc = 0x800192DD  Abs = 0x80019296  Dif = 71
0x00019296  0x0001B4BA  Inc = 0x8001B506  Abs = 0x8001B4BA  Dif = 76
0x0001B4BA  0x0001DCE4  Inc = 0x8001DD2B  Abs = 0x8001DCE4  Dif = 71
0x0001DCE4  0x000208B8  Inc = 0x800208EC  Abs = 0x800208B8  Dif = 52
0x000208B8  0x000235E6  Inc = 0x80023634  Abs = 0x800235E6  Dif = 78
0x000235E6  0x000263E0  Inc = 0x8002641A  Abs = 0x800263E0  Dif = 58
0x000263E0  0x000291CC  Inc = 0x80029221  Abs = 0x800291CC  Dif = 85
0x000291CC  0x0002C01C  Inc = 0x8002C057  Abs = 0x8002C01C  Dif = 59
0x0002C01C  0x0002EE1C  Inc = 0x8002EE72  Abs = 0x8002EE1C  Dif = 86
0x0002EE1C  0x00031C6A  Inc = 0x80031CAA  Abs = 0x80031C6A  Dif = 64
0x00031C6A  0x00034A74  Inc = 0x80034AD5  Abs = 0x80034A74  Dif = 97
0x00034A74  0x000378C6  Inc = 0x80037911  Abs = 0x800378C6  Dif = 75
0x000378C6  0x0003A6D8  Inc = 0x8003A747  Abs = 0x8003A6D8  Dif = 111
0x0003A716  0x0003D52A  Inc = 0x8003D581  Abs = 0x8003D52A  Dif = 87
0x0003D52A  0x00040382  Inc = 0x800403B9  Abs = 0x80040382  Dif = 55
0x00040382  0x00043194  Inc = 0x800431E3  Abs = 0x80043194  Dif = 79
0x00043194  0x00045FB0  Inc = 0x8004601F  Abs = 0x80045FB0  Dif = 111
0x00045FEE  0x00048DEC  Inc = 0x80048E3D  Abs = 0x80048DEC  Dif = 81
0x00048DEC  0x0004BC16  Inc = 0x8004BC54  Abs = 0x8004BC16  Dif = 62
0x0004BC16  0x0004EA06  Inc = 0x8004EA62  Abs = 0x8004EA06  Dif = 92
0x0004EA06  0x0005182A  Inc = 0x80051871  Abs = 0x8005182A  Dif = 71
0x0005182A  0x00054614  Inc = 0x8005467A  Abs = 0x80054614  Dif = 102
0x00054614  0x0005741C  Inc = 0x8005746B  Abs = 0x8005741C  Dif = 79
0x0005741C  0x0005A1FA  Inc = 0x8005A26B  Abs = 0x8005A1FA  Dif = 113
0x0005A236  0x0005D00E  Inc = 0x8005D060  Abs = 0x8005D00E  Dif = 82
0x0005D00E  0x0005FE28  Inc = 0x8005FE5F  Abs = 0x8005FE28  Dif = 55
0x0005FE28  0x00062BF4  Inc = 0x80062C49  Abs = 0x80062BF4  Dif = 85
0x00062BF4  0x000659FE  Inc = 0x80065A36  Abs = 0x800659FE  Dif = 56
0x000659FE  0x000687A2  Inc = 0x80068804  Abs = 0x800687A2  Dif = 98
0x000687A2  0x0006B58E  Inc = 0x8006B5D2  Abs = 0x8006B58E  Dif = 68
0x0006B58E  0x0006E348  Inc = 0x8006E3B7  Abs = 0x8006E348  Dif = 111
0x0006E384  0x00071136  Inc = 0x80071185  Abs = 0x80071136  Dif = 79
0x00071136  0x00073EE8  Inc = 0x80073F56  Abs = 0x80073EE8  Dif = 110
0x00073F24  0x00076CC0  Inc = 0x80076D18  Abs = 0x80076CC0  Dif = 88
0x00076CC0  0x00079AAA  Inc = 0x80079AE9  Abs = 0x80079AAA  Dif = 63
0x00079AAA  0x0007C84E  Inc = 0x8007C8B5  Abs = 0x8007C84E  Dif = 103
0x0007C88A  0x0007F63C  Inc = 0x8007F683  Abs = 0x8007F63C  Dif = 71
0x0007F63C  0x000823F6  Inc = 0x80082460  Abs = 0x800823F6  Dif = 106
0x00082432  0x000851D0  Inc = 0x8008521A  Abs = 0x800851D0  Dif = 74
0x000851D0  0x00087F7A  Inc = 0x80087FE7  Abs = 0x80087F7A  Dif = 109
0x00087FB6  0x0008AD58  Inc = 0x8008ADA6  Abs = 0x8008AD58  Dif = 78
0x0008AD58  0x0008DB32  Inc = 0x8008DB6E  Abs = 0x8008DB32  Dif = 60
0x0008DB32  0x000908CA  Inc = 0x8009092E  Abs = 0x800908CA  Dif = 100
0x000908CA  0x000936AE  Inc = 0x800936F0  Abs = 0x800936AE  Dif = 66
0x000936AE  0x00096442  Inc = 0x800964AB  Abs = 0x80096442  Dif = 105
0x0009647E  0x00099202  Inc = 0x8009924D  Abs = 0x80099202  Dif = 75
0x00099202  0x0009BF88  Inc = 0x8009BFF4  Abs = 0x8009BF88  Dif = 108
0x0009BFC4  0x0009ED36  Inc = 0x8009ED85  Abs = 0x8009ED36  Dif = 79
0x0009ED36  0x000A1AEE  Inc = 0x800A1B22  Abs = 0x800A1AEE  Dif = 52
0x000A1AEE  0x000A485C  Inc = 0x800A48B6  Abs = 0x800A485C  Dif = 90
0x000A485C  0x000A760E  Inc = 0x800A764A  Abs = 0x800A760E  Dif = 60
0x000A760E  0x000AA388  Inc = 0x800AA3ED  Abs = 0x800AA388  Dif = 101
0x000AA388  0x000AD146  Inc = 0x800AD18A  Abs = 0x800AD146  Dif = 68
0x000AD146  0x000AFECC  Inc = 0x800AFF31  Abs = 0x800AFECC  Dif = 101
0x000AFECC  0x000B2C70  Inc = 0x800B2CBB  Abs = 0x800B2C70  Dif = 75
0x000B2C70  0x000B59E6  Inc = 0x800B5A54  Abs = 0x800B59E6  Dif = 110
0x000B5A24  0x000B8788  Inc = 0x800B87E0  Abs = 0x800B8788  Dif = 88
0x000B8788  0x000BB53C  Inc = 0x800BB57F  Abs = 0x800BB53C  Dif = 67
0x000BB53C  0x000BE2B8  Inc = 0x800BE31F  Abs = 0x800BE2B8  Dif = 103
0x000BE2B8  0x000C1078  Inc = 0x800C10B8  Abs = 0x800C1078  Dif = 64
0x000C1078  0x000C3E00  Inc = 0x800C3E5F  Abs = 0x800C3E00  Dif = 95
0x000C3E00  0x000C6BA8  Inc = 0x800C6BED  Abs = 0x800C6BA8  Dif = 69
0x000C6BA8  0x000C9918  Inc = 0x800C9986  Abs = 0x800C9918  Dif = 110
0x000C9918  0x000CC6C6  Inc = 0x800CC714  Abs = 0x800CC6C6  Dif = 78
0x000CC6C6  0x000CF46C  Inc = 0x800CF4A3  Abs = 0x800CF46C  Dif = 55
0x000CF46C  0x000D21D8  Inc = 0x800D2232  Abs = 0x800D21D8  Dif = 90
0x000D21D8  0x000D4F74  Inc = 0x800D4FAD  Abs = 0x800D4F74  Dif = 57
0x000D4F74  0x000D7CD4  Inc = 0x800D7D37  Abs = 0x800D7CD4  Dif = 99
0x000D7CD4  0x000DAA60  Inc = 0x800DAAA4  Abs = 0x800DAA60  Dif = 68
0x000DAA60  0x000DD7AC  Inc = 0x800DD819  Abs = 0x800DD7AC  Dif = 109
0x000DD7E8  0x000E0530  Inc = 0x800E0586  Abs = 0x800E0530  Dif = 86
0x000E0530  0x000E3278  Inc = 0x800E32E6  Abs = 0x800E3278  Dif = 110
0x000E32B4  0x000E5FE6  Inc = 0x800E603B  Abs = 0x800E5FE6  Dif = 85
0x000E5FE6  0x000E8D48  Inc = 0x800E8D7E  Abs = 0x800E8D48  Dif = 54
0x000E8D48  0x000EBA6E  Inc = 0x800EBACC  Abs = 0x800EBA6E  Dif = 94
0x000EBA6E  0x000EE7C0  Inc = 0x800EE807  Abs = 0x800EE7C0  Dif = 71
0x000EE7C0  0x000F14FA  Inc = 0x800F152D  Abs = 0x800F14FA  Dif = 51
0x000F14FA  0x000F41FE  Inc = 0x800F4251  Abs = 0x800F41FE  Dif = 83
0x000F41FE  0x000F6F02  Inc = 0x800F6F71  Abs = 0x800F6F02  Dif = 111
0x000F6F3E  0x000F9C4C  Inc = 0x800F9CA7  Abs = 0x800F9C4C  Dif = 91
0x000F9C4C  0x000FC988  Inc = 0x800FC9C7  Abs = 0x800FC988  Dif = 63
0x000FC988  0x000FF688  Inc = 0x800FF6F0  Abs = 0x800FF688  Dif = 104
0x000FF6C4  0x001023C2  Inc = 0x8010240F  Abs = 0x801023C2  Dif = 77
0x001023C2  0x001050B4  Inc = 0x8010511B  Abs = 0x801050B4  Dif = 103
0x001050F0  0x00107DDA  Inc = 0x80107E22  Abs = 0x80107DDA  Dif = 72
0x00107DDA  0x0010AAD4  Inc = 0x8010AB08  Abs = 0x8010AAD4  Dif = 52
0x0010AAD4  0x0010D78E  Inc = 0x8010D7E9  Abs = 0x8010D78E  Dif = 91
0x0010D78E  0x0011047A  Inc = 0x801104C2  Abs = 0x8011047A  Dif = 72
0x0011047A  0x00112FEA  Inc = 0x80113044  Abs = 0x80112FEA  Dif = 90
0x00112FEA  0x00115522  Inc = 0x80115568  Abs = 0x80115522  Dif = 70
0x00115522  0x001161F8  Inc = 0x801161FA  Abs = 0x801161F8  Dif = 2
0x001161F8  0x00116238  Inc = 0x80116238  Abs = 0x80116238  Dif = 0
0x00116238  0x0011625A  Inc = 0x8011625A  Abs = 0x8011625A  Dif = 0
0x0011625A  0x00116268  Inc = 0x80116269  Abs = 0x80116268  Dif = 1
0x00116268  0x00116286  Inc = 0x80116286  Abs = 0x80116286  Dif = 0
0x00116286  0x0011629A  Inc = 0x8011629A  Abs = 0x8011629A  Dif = 0
0x0011629A  0x0011629A  Inc = 0x8011629B  Abs = 0x8011629A  Dif = 1
0x0011629A  0x0011629C  Inc = 0x8011629C  Abs = 0x8011629C  Dif = 0

 

Может я все-таки что-то не так делаю, может кто-то сталкивался с подобной проблемой, может это энкодер "неправильный" (был за ним один грешок, но это отдельная история).

Получается в прошлом проекте у меня задержка в расчетах на 40 мс, связанная с этим фактом, так как на тот момент увидеть ее я никак не мог.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...