user38873: I have a system which requires me to obtain different duty cycles at different frequencies. But using the analogWrite() does not allow me to obtain a value lower than 1/255 duty cycle. I need to obtain lower duty cycle values for 1Hz

user4143: Sure - if you program it to.

Turn on an output.
Wait for 500µs less the amount of time it took to turn on the output
Turn off the output
Wait for 0.9995 seconds minus the amount of time it took to turn off the output
Go to 1.

You would probably find using the micros() function easiest to get the timing right - in exactly the same way as the BlinkWithoutDelay example in the IDE.
Also direct port manipulation may be of benefit to make things as fast as possible.

user7508: Expanding from my comment. This is an attempt to generate that signal with Timer 1. No time to test it now... Edit: tested, works as advertised.
/*
 * Configure Timer 1 to generate a slow, low duty cycle PWM signal.
 * Output pin = digital 9 = PB1 = OC1A.
 */

const float PWM_PERIOD  = 1.0;     // 1 s
const float PULSE_WIDTH = 500e-6;  // 500 us

/*
 * With a 16 MHz clock and this prescaler, the resolution is 16 us and
 * the maximum period is 1.048576 s.
 */
const uint16_t TIMER_PRESCALER = 256;
const float F_TIMER = F_CPU / TIMER_PRESCALER;

void setup()
{
    // Configure Timer 1.
    DDRB  |= _BV(PB1);    // set PB1 = OC1A as output
    ICR1   = round(PWM_PERIOD * F_TIMER) - 1;
    OCR1A  = round(PULSE_WIDTH * F_TIMER) - 1;
    TCCR1A = _BV(COM1A1)  // non-inverting PWM on OC1A
           | _BV(WGM11);  // fast PWM mode, TOP = ICR1
    TCCR1B = _BV(WGM12)   // ditto
           | _BV(WGM13)   // ditto
           | _BV(CS12);   // clock at F_CPU/256 = 62.5 kHz
}

void loop() {}


38873: <p>I have a system which requires me to obtain different duty cycles at different frequencies. But using the analogWrite() does not allow me to obtain a value lower than 1/255 duty cycle. I need to obtain lower duty cycle values for 1Hz</p>
 4143: <p>Sure - if you program it to.</p>

<ol>
<li>Turn on an output.</li>
<li>Wait for 500µs less the amount of time it took to turn on the output</li>
<li>Turn off the output</li>
<li>Wait for 0.9995 seconds minus the amount of time it took to turn off the output</li>
<li>Go to 1.</li>
</ol>

<p>You would probably find using the <code>micros()</code> function easiest to get the timing right - in exactly the same way as the <code>BlinkWithoutDelay</code> example in the IDE.</p>

<p>Also <a href="https://www.arduino.cc/en/Reference/PortManipulation" rel="nofollow noreferrer">direct port manipulation</a> may be of benefit to make things as fast as possible.</p>
 7508: <p>Expanding from my comment. This is an attempt to generate that signal with Timer 1. <s>No time to test it now...</s> <strong>Edit</strong>: tested, works as advertised.</p>

<pre><code>/*
 * Configure Timer 1 to generate a slow, low duty cycle PWM signal.
 * Output pin = digital 9 = PB1 = OC1A.
 */

const float PWM_PERIOD  = 1.0;     // 1 s
const float PULSE_WIDTH = 500e-6;  // 500 us

/*
 * With a 16 MHz clock and this prescaler, the resolution is 16 us and
 * the maximum period is 1.048576 s.
 */
const uint16_t TIMER_PRESCALER = 256;
const float F_TIMER = F_CPU / TIMER_PRESCALER;

void setup()
{
    // Configure Timer 1.
    DDRB  |= _BV(PB1);    // set PB1 = OC1A as output
    ICR1   = round(PWM_PERIOD * F_TIMER) - 1;
    OCR1A  = round(PULSE_WIDTH * F_TIMER) - 1;
    TCCR1A = _BV(COM1A1)  // non-inverting PWM on OC1A
           | _BV(WGM11);  // fast PWM mode, TOP = ICR1
    TCCR1B = _BV(WGM12)   // ditto
           | _BV(WGM13)   // ditto
           | _BV(CS12);   // clock at F_CPU/256 = 62.5 kHz
}

void loop() {}
</code></pre>
