Ricardo Binas
/
SPI_EncoderPanTilt_AMT203-V
Camera Pan Tilt SPI Encoder
SPIEncoder.h@1:ba4ae56b4895, 2019-02-24 (annotated)
- Committer:
- Rbinas
- Date:
- Sun Feb 24 03:07:12 2019 +0000
- Revision:
- 1:ba4ae56b4895
Camera Pan Tilt Encoder
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Rbinas | 1:ba4ae56b4895 | 1 | #ifndef SPIENCODER_H_ |
Rbinas | 1:ba4ae56b4895 | 2 | #define SPIENCODER_H_ |
Rbinas | 1:ba4ae56b4895 | 3 | |
Rbinas | 1:ba4ae56b4895 | 4 | #include "mbed.h" |
Rbinas | 1:ba4ae56b4895 | 5 | |
Rbinas | 1:ba4ae56b4895 | 6 | #ifdef __cplusplus |
Rbinas | 1:ba4ae56b4895 | 7 | extern "C" { |
Rbinas | 1:ba4ae56b4895 | 8 | #endif |
Rbinas | 1:ba4ae56b4895 | 9 | |
Rbinas | 1:ba4ae56b4895 | 10 | SPI EncoderSpi(p5, p6, p7);//Mosi Miso Sclk |
Rbinas | 1:ba4ae56b4895 | 11 | DigitalOut cs(p8); //Chip select |
Rbinas | 1:ba4ae56b4895 | 12 | DigitalOut cs1(p9); //Chip select |
Rbinas | 1:ba4ae56b4895 | 13 | |
Rbinas | 1:ba4ae56b4895 | 14 | uint16_t EncoderByteData = 0; |
Rbinas | 1:ba4ae56b4895 | 15 | uint16_t Encoderposition_last = 0; |
Rbinas | 1:ba4ae56b4895 | 16 | uint8_t temp[2]; |
Rbinas | 1:ba4ae56b4895 | 17 | uint16_t Steps; |
Rbinas | 1:ba4ae56b4895 | 18 | |
Rbinas | 1:ba4ae56b4895 | 19 | uint16_t EncoderByteData1 = 0; |
Rbinas | 1:ba4ae56b4895 | 20 | uint16_t Encoderposition_last1 = 0; |
Rbinas | 1:ba4ae56b4895 | 21 | uint8_t temp1[2]; |
Rbinas | 1:ba4ae56b4895 | 22 | uint16_t Steps1; |
Rbinas | 1:ba4ae56b4895 | 23 | |
Rbinas | 1:ba4ae56b4895 | 24 | void wait_ms(int us); |
Rbinas | 1:ba4ae56b4895 | 25 | |
Rbinas | 1:ba4ae56b4895 | 26 | void InitializeEncoder() |
Rbinas | 1:ba4ae56b4895 | 27 | { |
Rbinas | 1:ba4ae56b4895 | 28 | EncoderSpi.format(8,0); |
Rbinas | 1:ba4ae56b4895 | 29 | EncoderSpi.frequency(8000000); |
Rbinas | 1:ba4ae56b4895 | 30 | } |
Rbinas | 1:ba4ae56b4895 | 31 | //------------------------------------------EncoderA--------------------------------------------------- |
Rbinas | 1:ba4ae56b4895 | 32 | uint8_t SPI_T (uint8_t SPITransmit)//Repetive SPI transmit sequence |
Rbinas | 1:ba4ae56b4895 | 33 | { |
Rbinas | 1:ba4ae56b4895 | 34 | uint8_t SPI_temp = 0; //vairable to hold recieved data |
Rbinas | 1:ba4ae56b4895 | 35 | cs=0; //select spi device |
Rbinas | 1:ba4ae56b4895 | 36 | SPI_temp = EncoderSpi.write(SPITransmit);//send and recieve |
Rbinas | 1:ba4ae56b4895 | 37 | cs=1;//deselect spi device |
Rbinas | 1:ba4ae56b4895 | 38 | return(SPI_temp); //return recieved byte |
Rbinas | 1:ba4ae56b4895 | 39 | } |
Rbinas | 1:ba4ae56b4895 | 40 | |
Rbinas | 1:ba4ae56b4895 | 41 | void start() |
Rbinas | 1:ba4ae56b4895 | 42 | { |
Rbinas | 1:ba4ae56b4895 | 43 | uint8_t recieved = 0xA5;//just a temp vairable |
Rbinas | 1:ba4ae56b4895 | 44 | EncoderByteData = 0;//reset position vairable |
Rbinas | 1:ba4ae56b4895 | 45 | cs=0; |
Rbinas | 1:ba4ae56b4895 | 46 | SPI_T(0x10);//issue read command |
Rbinas | 1:ba4ae56b4895 | 47 | wait_ms(50);//give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 48 | |
Rbinas | 1:ba4ae56b4895 | 49 | while (recieved != 0x10) { //loop while encoder is not ready to send |
Rbinas | 1:ba4ae56b4895 | 50 | recieved = SPI_T(0x00); //cleck again if encoder is still working |
Rbinas | 1:ba4ae56b4895 | 51 | wait_ms(1); //again,give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 52 | } |
Rbinas | 1:ba4ae56b4895 | 53 | |
Rbinas | 1:ba4ae56b4895 | 54 | temp[0] = SPI_T(0x00); //Recieve MSB |
Rbinas | 1:ba4ae56b4895 | 55 | temp[1] = SPI_T(0x00); // recieve LSB |
Rbinas | 1:ba4ae56b4895 | 56 | cs=1; |
Rbinas | 1:ba4ae56b4895 | 57 | |
Rbinas | 1:ba4ae56b4895 | 58 | temp[0] &=~ 0xF0;//mask out the first 4 bits |
Rbinas | 1:ba4ae56b4895 | 59 | EncoderByteData = temp[0] << 8; //shift MSB to correct EncoderByteData in EncoderByteData message |
Rbinas | 1:ba4ae56b4895 | 60 | EncoderByteData += temp[1]; // add LSB to EncoderByteData message to complete message |
Rbinas | 1:ba4ae56b4895 | 61 | wait_ms(1);//again,give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 62 | } |
Rbinas | 1:ba4ae56b4895 | 63 | |
Rbinas | 1:ba4ae56b4895 | 64 | |
Rbinas | 1:ba4ae56b4895 | 65 | void EncoderA() |
Rbinas | 1:ba4ae56b4895 | 66 | { |
Rbinas | 1:ba4ae56b4895 | 67 | if (EncoderByteData != Encoderposition_last) { //if nothing has changed dont wast time sending position |
Rbinas | 1:ba4ae56b4895 | 68 | Encoderposition_last = EncoderByteData ; //set last position to current position |
Rbinas | 1:ba4ae56b4895 | 69 | } else { |
Rbinas | 1:ba4ae56b4895 | 70 | start(); //if something has changed in position, catch it |
Rbinas | 1:ba4ae56b4895 | 71 | } |
Rbinas | 1:ba4ae56b4895 | 72 | Steps = EncoderByteData/16; |
Rbinas | 1:ba4ae56b4895 | 73 | } |
Rbinas | 1:ba4ae56b4895 | 74 | //-----------------------------------------------EncoderB--------------------------------------------------------------- |
Rbinas | 1:ba4ae56b4895 | 75 | uint8_t SPI_TT (uint8_t SPITransmit1)//Repetive SPI transmit sequence |
Rbinas | 1:ba4ae56b4895 | 76 | { |
Rbinas | 1:ba4ae56b4895 | 77 | uint8_t SPI_temp1 = 0; //vairable to hold recieved data |
Rbinas | 1:ba4ae56b4895 | 78 | cs1=0; //select spi device |
Rbinas | 1:ba4ae56b4895 | 79 | SPI_temp1 = EncoderSpi.write(SPITransmit1);//send and recieve |
Rbinas | 1:ba4ae56b4895 | 80 | cs1=1;//deselect spi device |
Rbinas | 1:ba4ae56b4895 | 81 | return(SPI_temp1); //return recieved byte |
Rbinas | 1:ba4ae56b4895 | 82 | } |
Rbinas | 1:ba4ae56b4895 | 83 | |
Rbinas | 1:ba4ae56b4895 | 84 | void start1() |
Rbinas | 1:ba4ae56b4895 | 85 | { |
Rbinas | 1:ba4ae56b4895 | 86 | uint8_t recieved1 = 0xA5;//just a temp vairable |
Rbinas | 1:ba4ae56b4895 | 87 | EncoderByteData1 = 0;//reset position vairable |
Rbinas | 1:ba4ae56b4895 | 88 | cs1=0; |
Rbinas | 1:ba4ae56b4895 | 89 | SPI_TT(0x10);//issue read command |
Rbinas | 1:ba4ae56b4895 | 90 | wait_ms(50);//give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 91 | |
Rbinas | 1:ba4ae56b4895 | 92 | while (recieved1 != 0x10) { //loop while encoder is not ready to send |
Rbinas | 1:ba4ae56b4895 | 93 | recieved1 = SPI_TT(0x00); //cleck again if encoder is still working |
Rbinas | 1:ba4ae56b4895 | 94 | wait_ms(1); //again,give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 95 | } |
Rbinas | 1:ba4ae56b4895 | 96 | |
Rbinas | 1:ba4ae56b4895 | 97 | temp1[0] = SPI_TT(0x00); //Recieve MSB |
Rbinas | 1:ba4ae56b4895 | 98 | temp1[1] = SPI_TT(0x00); // recieve LSB |
Rbinas | 1:ba4ae56b4895 | 99 | cs1=1; |
Rbinas | 1:ba4ae56b4895 | 100 | |
Rbinas | 1:ba4ae56b4895 | 101 | temp1[0] &=~ 0xF0;//mask out the first 4 bits |
Rbinas | 1:ba4ae56b4895 | 102 | EncoderByteData1 = temp1[0] << 8; //shift MSB to correct EncoderByteData in EncoderByteData message |
Rbinas | 1:ba4ae56b4895 | 103 | EncoderByteData1 += temp1[1]; // add LSB to EncoderByteData message to complete message |
Rbinas | 1:ba4ae56b4895 | 104 | wait_ms(1);//again,give time to read. Timmig is critical |
Rbinas | 1:ba4ae56b4895 | 105 | } |
Rbinas | 1:ba4ae56b4895 | 106 | void EncoderB() |
Rbinas | 1:ba4ae56b4895 | 107 | { |
Rbinas | 1:ba4ae56b4895 | 108 | if (EncoderByteData1 != Encoderposition_last1) { //if nothing has changed dont wast time sending position |
Rbinas | 1:ba4ae56b4895 | 109 | Encoderposition_last1 = EncoderByteData1 ; //set last position to current position |
Rbinas | 1:ba4ae56b4895 | 110 | } else { |
Rbinas | 1:ba4ae56b4895 | 111 | start1(); //if something has changed in position, catch it |
Rbinas | 1:ba4ae56b4895 | 112 | } |
Rbinas | 1:ba4ae56b4895 | 113 | Steps1 = EncoderByteData1/16; |
Rbinas | 1:ba4ae56b4895 | 114 | } |
Rbinas | 1:ba4ae56b4895 | 115 | |
Rbinas | 1:ba4ae56b4895 | 116 | #ifdef __cplusplus |
Rbinas | 1:ba4ae56b4895 | 117 | } |
Rbinas | 1:ba4ae56b4895 | 118 | #endif |
Rbinas | 1:ba4ae56b4895 | 119 | |
Rbinas | 1:ba4ae56b4895 | 120 | #endif // #ifndef SPIENCODER_H_ |