# 100 kHz interleaved signal generation?

1. ## 100 kHz interleaved signal generation?

I am generating a 100 kHz interleaved signal (image attached below) with 80 % duty cycle using the following code for Arduino UNO. However, when I measure the signal frequency with oscilloscope, I get 48 kHz only. If I try to reduce the delayMicroseconds() the maximum achievable frequency is 61 kHz.

Why this is happening? Either with UNO I cannot get more than 61 kHz or the oscilloscope measurements are incorrect... I could figure out the reason. Please help me with this issue.

```Code C - [expand]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup()
{
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);

digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}

void loop()
{
digitalWrite(13, LOW);
delayMicroseconds(2);
digitalWrite(13, HIGH);
delayMicroseconds(3);
digitalWrite(11, LOW);
delayMicroseconds(2);
digitalWrite(11, HIGH);
delayMicroseconds(3);
}```

•

2. ## Re: 100 kHz interleaved signal generation?

Is your clock frequency correct?

Also, from the Arduino reference:
"This function works very accurately in the range 3 microseconds and up. We cannot assure that delayMicroseconds will perform precisely for smaller delay-times."
I don't know anything about the Arduino, but this is a very scary statement to me. This is a digital system and everything SHOULD be deterministic, right?

What is the overhead of the digitalWrite statement? Is it a single clock-cycle? 100 clock cycles?

3. ## Re: 100 kHz interleaved signal generation?

Originally Posted by barry
What is the overhead of the digitalWrite statement? Is it a single clock-cycle? 100 clock cycles?
digitalWrite takes 3 us on UNO... thats what the problem is. Any solution?

•

4. ## Re: 100 kHz interleaved signal generation?

Yes, have a search on the Web for some way to configure compilation to generate output listing of disassembled code, so that you can precisely determine how long each microprocessor instruction take from the core.

•

5. ## Re: 100 kHz interleaved signal generation?

I've not done this myself on the Uno but doing a little Googling I found https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM that mentions the MCU in the Uno has 3 hardware PWMs and shows how to manipulate the registers directly. Using the hardware is generally a better approach than bit-banging when timing is important.
Susan

6. ## Re: 100 kHz interleaved signal generation?

48 clocks to set a bit. Pffft. This apparently not very good for realtime applications.

Maybe you have to write some subroutines in assembler to get any kind of speed out of this.

7. ## Re: 100 kHz interleaved signal generation?

Don't forget that everything is done via library code written in C++ on Arduinos. That and the library code tries to handle all of the variants of processor that can make up an Arduino.
Susan

•

8. ## Re: 100 kHz interleaved signal generation?

With some examples I have managed to get one of the required signals with the following code using Time 1. How I can get the other phase-shifted signal?

```Code C - [expand]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void setup()
{
// Set PB1 to be an output (Pin9 Arduino UNO)
DDRB |= (1 << PB1);

// Clear Timer/Counter Control Registers
TCCR1A = 0;
TCCR1B = 0;

// Set inverting mode
TCCR1A |= (1 << COM1A1);
TCCR1A |= (1 << COM1A0);

// Set PWM Phase Correct, Mode 10
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM13);

// Set prescaler to 1 and starts PWM
TCCR1B |= (1 << CS10);
TCCR1B |= (0 << CS11);

// Set PWM frequency = 100kHz, duty-cycle = 20%
ICR1 = (F_CPU / (1*200000)) - 1;
OCR1A = ICR1 / (100 / 20);
}

void loop()
{
// main loop code
}```

9. ## Re: 100 kHz interleaved signal generation?

How I can get the other phase-shifted signal?
One thing is modulation by pulse width varying in time, where the signal period is constant, but another thing is phase modulation where the pulse width can be constant. Should we assume that you mean by "phase-shifted", another PWM signal? Keep in mind that many uC's PWM peripherals have the same source for the period, therefore you likely would not be able to generate another PWM output shifted in time. Anyway, how about doing some calculation on you own? There are numerous tools available on the web that could help you use another timer to provide such a delay; this is a straightforward task.

--[[ ]]--