Camera Pan Tilt SPI Encoder

Dependencies:   mbed

/media/uploads/Rbinas/encoder.jpg /media/uploads/Rbinas/wiring_encoder1_aAYi2R4.jpg

Committer:
Rbinas
Date:
Sun Feb 24 03:07:12 2019 +0000
Revision:
1:ba4ae56b4895
Camera Pan Tilt Encoder

Who changed what in which revision?

UserRevisionLine numberNew 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_