PWM / タイマーは使わずにループだけでPWMを実現する

pp.204-206

#include <avr/io.h>
#include <util/delay.h>

void pwm_PORTB(uint8_t pin, int duty){
    uint8_t _pin = (1 << pin);

    DDRB |= _pin;                     // 指定されたピンのIOをOUTにし、
    for(int i=0; i<100; i++){         // 1周期の間に全部で100回ループするが、
        if(i < duty){PORTB |=  _pin;} // そのうちdutyで指定した回数だけLEDを点けっぱなしにして、
        else        {PORTB &= ~_pin;} // それ以降は消しておく。
        _delay_us(20);
    }
}

int main(void) {
    while (1) {
        pwm_PORTB(0, 99); // (pin=0~7, duty=0~100)
    }

    return 0;
}

これがデューティ5%のとき:
f:id:ti-nspire:20190731091030p:plain:w400

これがデューティ50%のとき:
f:id:ti-nspire:20190731091044p:plain:w400

これがデューティ95%のとき:
f:id:ti-nspire:20190731091053p:plain:w400

f:id:ti-nspire:20190731092644p:plain:h300 f:id:ti-nspire:20190731092716p:plain:h300