M_Andrey 0 14 марта, 2012 Опубликовано 14 марта, 2012 · Жалоба Всем здравствуйте. Решил поиграться с абсолютным энкодером, у которого внутри опционально стоит еще и инкрементальный (кому интересно: "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 мс, связанная с этим фактом, так как на тот момент увидеть ее я никак не мог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться