通过SPI

时间:2018-03-26 08:44:47

标签: arduino spi encoder

我的目标是通过SPI将编码器中的速度值从从Arduino传输到主Arduino。我目前在主端串行打印上得到零,我不确定我做错了什么。我已经增加了等待几次以查看它是否是处理时间问题的时间,但是我等待100mS仍然没有变化。我知道unsigned int是4个字节,我不确定在这种情况下联合是否是最佳选择,因为我可能会因为单独的中断而覆盖我的数据,但我不确定。我想要使​​用一个结构,因为我将不得不转移到各种传感器(包括此编码器)后通过SPI传输浮点数和整数。以下是我的代码,感谢您收到的任何帮助:

#include "math.h"
#define M_PI

byte command = 0;
const int encoder_a = 2; // Green - pin 2 - Digital
const int encoder_b = 3; // White - pin 3 - Digital
long encoder = 0;
int Diameter = 6; // inches
float previous_distance = 0;
unsigned long previous_time = 0;


void setup (void)
{
  Serial.begin(115200);
  pinMode(MOSI, INPUT);
  pinMode(SCK, INPUT);
  pinMode(SS, INPUT);   
  pinMode(MISO, OUTPUT);

  // turn on SPI in slave mode
  SPCR |= _BV(SPE);

  // turn on interrupts
  SPCR |= _BV(SPIE);

  pinMode(encoder_a, INPUT_PULLUP);
  pinMode(encoder_b, INPUT_PULLUP);

  attachInterrupt(0, encoderPinChangeA, CHANGE);
  attachInterrupt(1, encoderPinChangeB, CHANGE);
 }  

// SPI interrupt routine
ISR (SPI_STC_vect)
{
  union Data{
    float f;
    byte buff[4];}
   data;

  byte c = SPDR;

  data.f = assembly_speed();

  command = c; 

  switch (command)
  {
  // no command? then this is the command
  case 0:

    SPDR = 0;
    break;

  // incoming byte, return byte result
  case 'a':

    SPDR = data.buff[0];  
    break;

  // incoming byte, return byte result
  case 'b':

    SPDR = data.buff[1];  
    break;

  // incoming byte, return byte result    
  case 'c':

    SPDR = data.buff[2];  
    break;

  // incoming byte, return byte result    
  case 'd':

    SPDR = data.buff[3];  
    break;

  } 

}  

void loop (void)
{

  // if SPI not active, clear current command
  if (digitalRead (SS) == HIGH)
    command = 0;
}


void encoderPinChangeA() 
{
 encoder += digitalRead(encoder_a) == digitalRead(encoder_b) ? -1 : 1;
}

void encoderPinChangeB() 
{
encoder += digitalRead(encoder_a) != digitalRead(encoder_b) ? -1 : 1;
}

float distance_rolled()
{
  float distance_traveled = (float (rotation()) / 8) * PI * Diameter;
  return distance_traveled;
}
int rotation()
{
  float eigth_rotation = encoder / 300;
  return eigth_rotation;
}

float assembly_speed()
{
 float current_distance = (float (rotation()) / 8) * PI * Diameter;
 unsigned long current_time = millis();
 unsigned long assemblySpeed = (((current_distance - previous_distance) / 
 12) * 1000) / (current_time - previous_time);  // gives ft/s
 previous_distance = current_distance;
 previous_time = current_time;
 return assemblySpeed;

}

#include <SPI.h>

void setup (void)
{
    pinMode(MOSI, OUTPUT);
    pinMode(MISO, INPUT);
    pinMode(SCK, OUTPUT);
    pinMode(SS, OUTPUT);

    Serial.begin (115200);
    Serial.println ();

    digitalWrite(SS, HIGH);

    SPI.begin ();

    SPI.setClockDivider(SPI_CLOCK_DIV8);
 }

 byte transferAndWait (const byte what)
 {
  byte a = SPI.transfer (what);
  delayMicroseconds(10000);
  return a;
 } 

  union Data
  {
    float f;
    byte buff[4];
  }
  data;

void loop (void)
{

  digitalWrite(SS, LOW);
  transferAndWait ('a');  
  data.buff[0] = transferAndWait ('b');
  data.buff[1] = transferAndWait ('c');
  data.buff[2] = transferAndWait ('d');
  data.buff[3] = transferAndWait (0);

  digitalWrite(SS, HIGH);

  Serial.print("data.f = ");Serial.print(data.f);Serial.println(" Ft/s");

  delay(200);

}

0 个答案:

没有答案