Подключение датчика SSI
- Войдите на сайт для отправки комментариев
Всем привет!
По работе возникла необходимость подключиться к датчику - угловому энкодеру с выходом SSI, только не с токовыми петлями (интерфейс RS-422), а с уровнями ТТЛ CLOCK и DATA.
Датчик был еле живой, а осциллограф почти мёртвый, поэтому предложенные на форуме решения с переключениями линии порта и delaymicroseconds особого результата не дали.
В итоге подключил датчик к порту SPI (CLOCK на CLK, а DATA на MISO). В "помощнике" CodeVision указал режим работы интерфейса SPI (в том числе частоту обмена). После подбора режима (два бита в регистре настройки) датчик стал стабильно откликаться. Правда сигнал DATA с датчика был слабоват по амплитуде, его пришлось пропустить через транзисторный ключ.
Длина слова с датчика была 12 бит, потому организовал два считывания подряд - всё прекрасно заработало.
Если будет интересно принесу с работы и выложу сюда программку.
Модуль UART.c /******************************************************* Модуль приёма-передачи данных по UART для отладки *******************************************************/ void Delay(char DelayCount) { int i; int y; for (y = 0;y < DelayCount; y++) { for (i=0;i<20000;i++) { i++; i--; }; }; }; void SendSign(char SendingSign) { // while ( USART_Flag==0) // {} // // USART_Flag=0; // while ( !( UCSR0A & (1<<UDRE0)) ); while ( !( UCSR0A & 0b00100000) ) ; UDR0 = SendingSign; } void SendByte(char SendingByte) { char Sign1; char Sign2; char Temp; Temp = SendingByte; SendingByte = SendingByte/10; Sign1 = Temp - 10*SendingByte; Temp = SendingByte; SendingByte = SendingByte/10; Sign2 = Temp - 10*SendingByte; SendSign(SendingByte+0x30); SendSign(Sign2+0x30); SendSign(Sign1+0x30); SendSign(10); SendSign(13); } void SendTwoByteBin(unsigned int SendingByte) { char SendBit[16]; int i; unsigned int Temp; // SendSign(0x23); //i=5; //SendSign(i+0x30); SendSign(0x23); for (i = 0; i <= 15; i++) { // SendSign(0x23); // SendSign(i+0x30); // SendSign(0x3D); Temp = SendingByte; SendingByte = SendingByte/2; SendBit[i]=Temp-2*SendingByte; // SendSign(SendBit[i]+0x30); }; // SendSign(0x23); // SendSign(13); for (Temp = 0; Temp < 32000; Temp++) { Temp++; Temp--; }; // SendSign(10); // SendSign(13); // SendSign(13); for (i = 15; i >=0; i--) { SendSign(SendBit[i]+0x30); }; SendSign(10); SendSign(13); } void SendTwoByte(unsigned int SendingByte) { char Sign1; char Sign2; char Sign3; char Sign4; unsigned int Temp; Temp = SendingByte; SendingByte = SendingByte/10; Sign1 = Temp - 10*SendingByte; Temp = SendingByte; SendingByte = SendingByte/10; Sign2 = Temp - 10*SendingByte; Temp = SendingByte; SendingByte = SendingByte/10; Sign3 = Temp - 10*SendingByte; Temp = SendingByte; SendingByte = SendingByte/10; Sign4 = Temp - 10*SendingByte; SendSign(SendingByte+0x30); SendSign(Sign4+0x30); SendSign(Sign3+0x30); SendSign(Sign2+0x30); SendSign(Sign1+0x30); SendSign(10); SendSign(13); } //void TestTable(void) //{ // int i; // char Temp; // // for (i=0; i<8; i++) // { // SendSign(0x23); // SendSign(i+0x30); // SendSign(0x3D); // Temp=CodeTable[i]; // SendSign(Temp+0x30); // // SendSign(10); // SendSign(13); // }; // //} char USART_Receive_Char( void ) { /* Wait for data to be received */ while ( !(UCSR0A & (1<<RXC0)) ) ; /* Get and return received data from buffer */ return UDR0; } //int USART_Receive_Code( void ) //{ // unsigned int TempNum = 0; // char TempChar; // // do // { // TempChar = USART_Receive_Char(); // if (TempChar >= 0x30 & TempChar <= 0x39) // { // TempNum = TempNum * 10 + TempChar - 0x30; // }; // // } //while (TempChar != 10); //} //void SendString(int InputString) //{ // ////char *CurrentString = InputString; // ////char MyStr = InputString; //SendSign(InputString); //SendSign(InputString +2 ); // //} void SendInputData(void) { char *str = "abc"; //*str = "tes"; char Test[20]; //*Test="trd"; //SendString(*str); //char s1[100]; //puts("drt"); //gets(s1); //String TXD_String = "27IN.01"; //char TXD_String[] = "27IN.01"; //TXD_String[] = "27IN.01"; //SendString(TXD_String); //SendString("27IN.01"); } void TestSendString(char *Temp) { char *TempAdr; SendSign(*Temp); SendSign(10); SendSign(13); TempAdr = Temp; SendSign(*TempAdr); TempAdr++; SendSign(*TempAdr); TempAdr++; SendSign(*TempAdr); TempAdr++; SendSign(*TempAdr); TempAdr++; SendSign(*TempAdr); } void SendString(char *Temp, int CurrentValue) { //char FullChar[] = *Temp; char *TempAdr; char TempChar; int i; //SendSign(*Temp); //SendSign(10); //SendSign(13); TempAdr = Temp; TempChar = *TempAdr; //i = strlen ("ddf"); //do { //SendSign(*TempAdr); //TempAdr++; // // } //while (*TempAdr != "#"); //for (i=0;i<4;i++) //{ //SendSign(*TempAdr); //TempAdr++; // //}; while (TempChar != 0) { SendSign(TempChar); TempAdr++; TempChar = *TempAdr; }; SendSign(' '); SendSign('='); SendSign(' '); SendSign(CurrentValue + 48); //SendSign(10); } //void TestCall(void) //{ // //TestSendString("sbls"); //} void SendStringOnly(char *Temp) { //char FullChar[] = *Temp; char *TempAdr; char TempChar; int i; //SendSign(*Temp); //SendSign(10); //SendSign(13); TempAdr = Temp; TempChar = *TempAdr; //i = strlen ("ddf"); //do { //SendSign(*TempAdr); //TempAdr++; // // } //while (*TempAdr != "#"); //for (i=0;i<4;i++) //{ //SendSign(*TempAdr); //TempAdr++; // //}; //while (TempChar != '#') while (TempChar != 0) { SendSign(TempChar); TempAdr++; TempChar = *TempAdr; }; //SendSign(10); } /* void SendInternalVariables (void) { SendString(" InvertorSwitchOnCondition ", InvertorSwitchOnCondition); SendSign(10); SendSign(13); SendString(" StateMode ", StateMode); SendString(" LastStateMode ", LastStateMode); SendSign(10); SendSign(13); } */ /* void SendOutputVariables (void) { SendString(" LED_MotorOverHeating ", LED_MotorOverHeating); SendString(" LED_InvertorOverHeating ", LED_InvertorOverHeating); SendSign(10); SendSign(13); SendString(" LED_InvertorFaulting ", LED_InvertorFaulting); SendString(" LED_Signaling ", LED_Signaling); SendSign(10); SendSign(13); SendString(" Out_SwitchOnInvertor ", Out_SwitchOnInvertor); SendString(" Out_StabileSpeed ", Out_StabileSpeed); SendSign(10); SendSign(13); SendString(" Out_TransitModeReady ", Out_TransitModeReady); SendString(" Out_ElectricalDriveReady", Out_ElectricalDriveReady); SendSign(10); SendSign(13); SendString(" Out_InvertorSTOP ", Out_InvertorSTOP); SendString(" Out_ElectricalDriveFault", Out_ElectricalDriveFault); SendSign(10); SendSign(13); } */ void SendNumber(unsigned int InputNumber) { unsigned char CharArray[5]; unsigned int TempNumber = InputNumber; unsigned int TempNumberInt; int i; //TempNumberInt = fmod(TempNumber,10); //SendSign(TempNumber + 48); //SendSign(10); //SendSign(13); TempNumberInt = TempNumber/10; //SendSign(TempNumber + 48); //SendSign(10); //SendSign(13); //SendSign(TempNumberInt + 48); //SendSign(10); //SendSign(13); CharArray[0] = TempNumber - 10 * TempNumberInt; TempNumber = TempNumberInt; //SendSign(CharArray[0]+48); //SendSign(10); //SendSign(13); TempNumberInt = TempNumber/10; CharArray[1] = TempNumber - 10 * TempNumberInt; TempNumber = TempNumberInt; //SendSign(CharArray[1]+48); TempNumberInt = TempNumber/10; CharArray[2] = TempNumber - 10 * TempNumberInt; TempNumber = TempNumberInt; //SendSign(CharArray[2]+48); TempNumberInt = TempNumber/10; CharArray[3] = TempNumber - 10 * TempNumberInt; TempNumber = TempNumberInt; //SendSign(CharArray[3]+48); TempNumberInt = TempNumber/10; CharArray[4] = TempNumber - 10 * TempNumberInt; TempNumber = TempNumberInt; //SendSign(CharArray[4]+48); for (i=4; i>=0; i--) { SendSign(CharArray[i]+48); }; //SendSign(10); //SendSign(13); } /* void SendVariables(void) { unsigned int TempInt; unsigned int TempIN27 = IN27; SendStringOnly(" IN27 = "); SendNumber(IN27); SendSign(10); SendSign(13); //TempInt = IN27; //SendStringOnly(" TempInt = "); //SendNumber(TempInt); //SendSign(10); //SendSign(13); TempInt = TempIN27 & 1; //SendStringOnly(" TempInt = "); //SendNumber(TempInt); //SendSign(10); //SendSign(13); // SendString(" TEST", TempInt); // return; SendString(" 27IN_01 POHOD.POLOZH.", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_02 MESTNOE UPR. ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_03 VKL.INV.RAZR.", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_04 INV.VKLUCHEN ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendSign(10); SendSign(13); SendString(" 27IN_05 ZASTOPORENO ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_06 RASSTOPORENO ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_07 VKL. INVERTOR", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_08 VKL. 1 ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendSign(10); SendSign(13); SendString(" 27IN_09 VKL. 2 ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_10 VKL. 3 ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_11 VKL. 4 ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_12 VKL. 5 ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendSign(10); SendSign(13); SendString(" 27IN_13 REZHIM PAZ ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_14 REZERV ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_15 REZERV ", TempInt); TempIN27 = TempIN27 >> 1; TempInt = TempIN27 & 1; SendString(" 27IN_16 REZERV ", TempInt); SendSign(10); SendSign(13); SendString(" S1 INDIKACIYA", PanelSwitch1Code); SendString(" S2 REZHIM ", PanelSwitch2Code); SendString(" S3 VKL.INV. ", PanelSwitch3Code); SendSign(10); SendSign(13); } */ unsigned char USART_Receive(void) { /* Wait for data to be received */ while ( !(UCSR0A & (1<<RXC0)) ) ; /* Get and return received data from buffer */ return UDR0; } /* void ReceiveString(void) { unsigned char CharArray[20]; unsigned char CurrentChar; int CharArrayPointer = 0; int i; unsigned int TempCode = 0; // SendStringOnly("Point 1"); // SendSign(10); // SendSign(13); // SendSign(13); // SendString("Begin#", 0); // SendSign(13); do { CharArray [CharArrayPointer] = USART_Receive(); } while (CharArray [CharArrayPointer] != 10 && CharArray [CharArrayPointer++] != 13); // SendSign(13); // SendString("Begin#", 1); // SendSign(13); for (i=0;i<=CharArrayPointer-1;i++) { // SendSign(CharArrayPointer+48); // SendSign(13); // SendString("Begin#", 2); // SendSign(13); SendSign(CharArray [i]); }; // SendStringOnly("Point 2"); SendSign(10); SendSign(13); //SendSign(USART_Receive()); //SendSign(10); //SendSign(13); if (CharArray[0]=='2' && CharArray[1]=='7' && CharArray[2]=='i' && CharArray[3]=='n' && CharArray[4]=='=') { i = 5; while (CharArray[i] !=10 && CharArray[i] != 13 && i < 10) { TempCode = TempCode * 10 + CharArray[i] - 48; i++; }; // SendNumber(TempCode); IN27 = TempCode; SendVariables(); }; if (CharArray[0]=='s' && CharArray[1]=='1' && CharArray[2]=='=') { if (CharArray[4] ==10 || CharArray[4] == 13) { if (CharArray[3] >=48 && CharArray[3]<=54) { PanelSwitch1Code = CharArray[3] - 48; SendVariables(); } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; }; if (CharArray[0]=='s' && CharArray[1]=='2' && CharArray[2]=='=') { if (CharArray[4] ==10 || CharArray[4] == 13) { if (CharArray[3] >=48 && CharArray[3]<=54) { PanelSwitch2Code = CharArray[3] - 48; SendVariables(); } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; }; if (CharArray[0]=='s' && CharArray[1]=='3' && CharArray[2]=='=') { if (CharArray[4] ==10 || CharArray[4] == 13) { if (CharArray[3] >=48 && CharArray[3]<=49) { PanelSwitch3Code = CharArray[3] - 48; SendVariables(); } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; } else { SendStringOnly("Error!"); SendSign(10); SendSign(13); }; }; StateMachine(); SendInternalVariables(); SendOutputVariables(); //SendVariables(); } */ void TestReceiveTransmit (void) { }Пасибки. А то всё "поможите, сами мы не местные" .. хоть один полезный топик на тыщу. :)
Приветствую.
Есть интерес к SSI. Готов отблагодарить. Выходи на связь.