baud rate calculation

Status
Not open for further replies.

tonton81

Well-known member
is there any specific way to calculate the baud rate on teensy? on an lcd's diablo16 processor running at 600,000 baud, the datasheet states it runs that at 4.17% error rate, and the _real_ speed is also listed at 625,000

I've setup Serial1 @ 625,000 baud and it seems to be working, should the teensy baud rate be more accurate due to it's fine steps ?
 
It is way more accurate. Attached a little table I made some time ago.
You can add you custom baudrate simply by adding a line to the sheet.
 

Attachments

  • Baudrates Teensy.xls
    39 KB · Views: 439
The answer depends on which Teensy you're using, and what speed it's using, from the Tools > CPU Speed menu.

The Teensy 3.x models have high-res baud rate circuity. For example, when using Teensy 3.2 running at 96 MHz, the closest baud rate is 625,407. That's an error of only 0.065%. Since serial usually works up to about 2.5% error, 0.065% is very good. :)

Regarding your original question:

is there any specific way to calculate the baud rate on teensy?

Well, yes, of course there is a way. But it's not always simple. For any of the 32 bit boards, you'd look at the code in HardwareSerial.h. Near the top are several BAUD2DIV macros. First, figure out which one applies to your situation. Then figure out what F_PLL, F_CPU or F_BUS is for your board at the CPU speed you're using. Then do the calculation of the macro. When you truncate it to an integer, that's the error.

For the example above, the macro is "BAUD2DIV(baud) (((F_CPU * 2) + ((baud) >> 1)) / (baud))" and F_CPU is 96 MHz. The result is 307.7, which truncates to 307. The "+ ((baud) >> 1)" is done simple for proper round-off. So to compute the actual baud, you'd divide (F_CPU * 2) by 307. That's what I did just now, to give you 625,407 baud.

Of course, that was based on the assumption you're using Teensy 3.2 and running it at the default 96 MHz. Because you didn't give these sorts of details, I just made up a guess. But if I guessed wrong, hopefully this long-winded explanation gives you enough to do it yourself for whatever board and speed you're actually using.
 
teensy 3.5 Serial1 @ 625,000 baud, 120MHZ, lcd @ 625,000 max baud



https://www.youtube.com/watch?v=kH7kpKJNEYI&feature=youtu.be



random bench code:

Code:
#include <genieArduino.h>
Genie genie;


void setup() {
  delay(1000);
  Serial.begin(200000);
  Serial1.begin(625000);
  genie.Begin(Serial1);
  genie.AttachEventHandler(myGenieEventHandler);
  Serial.println("Begin...");
  genie.WriteObject(GENIE_OBJ_FORM, 1, 0);
}

uint8_t roll;

void loop() {
  genie.DoEvents();
  genie.WriteObject(GENIE_OBJ_CUSTOM_DIGITS, 0, random(111, 999));
  genie.WriteObject(GENIE_OBJ_CUSTOM_DIGITS, 1, random(1111, 9999));

  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 0, random(100, 120));
  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 1, random(100, 120));
  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 2, random(40, 60));
  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 3, random(40, 60));
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 4, 1) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 4, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 5, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 5, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 6, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 6, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 7, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 7, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 8, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 8, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 9, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 9, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 10, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 10, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 11, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 11, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 12, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 12, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 13, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 13, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 14, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 14, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 15, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 15, 0xFFFF);
  random(0, 2) ? genie.WriteObject(GENIE_OBJ_USERIMAGES, 16, 0) : genie.WriteObject(GENIE_OBJ_USERIMAGES, 16, 0xFFFF);

  //  roll = roll + 5;
  //  if ( roll >= 245 ) roll = 5;
  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 0, roll);
  //  genie.WriteObject(GENIE_OBJ_USERIMAGES, 1, roll);

}

void myGenieEventHandler(void) {
  genieFrame Event;
  genie.DequeueEvent(&Event);
  Serial.println(Event.reportObject.object);
  Serial.println(Event.reportObject.index);
  Serial.println(genie.GetEventData(&Event));
}
 
Status
Not open for further replies.
Back
Top