Pages: [1]   Go Down
Author Topic: BUG delayMicroseconds(input), output=input/0.75  (Read 1932 times)
0 Members and 1 Guest are viewing this topic.
Lithuania
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a bug with the arduino 1.0.1 IDE
I have 2 brushless controllers, which require 1-2ms of pulses.
So i write BLDC_us=1500; and I get nothing, so I measured with digital signal osciloscope, and it was actually 2000us. Now I have to use Kproportional=0.75 to change it. In software 1500*0.75=1125
Well I dont like this anyway it consumes my time. smiley-cry

Please help to fix the delayMicroseconds() function

Quote
#include <IRremote.h>
#define TSOPG         49
#define TSOPV         51
#define RECV          53

#define UP            0x2C9B //Inflate duty cycle, as button T
#define DOWN          0x6C9B //Deflate duty cycle, as button W
#define POWER         0x4C9D //Turn off 0 as RED "Power" button

#define BLDC          12
int BLDC_us=1125; //1125/0.75=1500us

IRrecv irrecv(RECV);
decode_results results;

void setup() {
  pinMode(TSOPG, OUTPUT);
  pinMode(TSOPV, OUTPUT);
  pinMode(RECV, INPUT);
  pinMode(BLDC, OUTPUT);
  digitalWrite(TSOPG, LOW);
  digitalWrite(TSOPV, HIGH);
  irrecv.enableIRIn();          //Start the IR receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    switch (results.value) {
      case UP    : BLDC_us=constrain(BLDC_us+1,750,1500); break;
      case DOWN  : BLDC_us=constrain(BLDC_us-1,750,1500); break;
      case POWER : BLDC_us=1125; break;
      default: break;
     }
    irrecv.resume();      //Prepare to receive the next value
  }  
  digitalWrite(BLDC, HIGH);
  delayMicroseconds(BLDC_us);
  digitalWrite(BLDC, LOW);
  delayMicroseconds(BLDC_us);
}

Logged

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 216
Posts: 13664
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Note that the other instructions in loop() especially digitalwrite() also consumes time.

have a look at - http://www.arduino.cc/en/Reference/PortManipulation - for faster writing.

(especially if you prepare the bitmasks in advance).

And I would remove the constrain from the switch and use only 2 if statements.

partially patched - not tested
Code:
void loop() {
  if (irrecv.decode(&results))
  {
    switch (results.value)
    {
      case UP    : if (BLDC_us < 1500) BLDC_us++;
                       break;
      case DOWN  : if (BLDC_us > 750) BLDC_us--;
                      break;
      case POWER : BLDC_us=1125;
                      break;
      default: break;
     }
    irrecv.resume();      //Prepare to receive the next value
  } 
  //digitalWrite(BLDC, HIGH);
  PORTB = highmask;
  delayMicroseconds(BLDC_us);
  // digitalWrite(BLDC, LOW);
  PORTB = lowmask;
  delayMicroseconds(BLDC_us);
}
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 300
Posts: 26219
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I have 2 brushless controllers, which require 1-2ms of pulses.
Do you have a link to the controller?
The pulse timings you give are suspiciously like R/C PWM timings, except your code always give a low frequency 50% duty cycle, which is fairly unusual.

If it is an R/C controller, you'll get better results with the servo library.
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Lithuania
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Well, i tested the stuff, before I had arduino, directly with ATmega16 and Atmel Studio, and it just receives a pulse width 1-2ms, possible minimum gap between as low as 10us.
Hobby King 100A Car ESC. But it doesent matter, the code bugs with the other ESC from Ebay. I have to keep a correction.
Logged

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 300
Posts: 26219
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Have you tried the Servo library?
Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Pages: [1]   Go Up
Jump to: