2021年11月4日木曜日

PIC16F1827でPWM&Lチカ

プラモにLEDを組み込みたいと言われて、とりあえずやっつけでPICでPWM&Lチカを試作してみました。。

使用したPICはPIC16F1827です。

動作確認としてPWM&Lチカを行っています。

回路図は省略。

使用したMCCは以下の通り。


CCP3は添付通り

ECCP1は添付通り

TMR2/4は添付通り




プログラムは以下の通り

#include "mcc_generated_files/mcc.h"

void wait(int imax){

    for(int i=0;imax>=i;i++){

        __delay_ms(1);

    }

}


void wait2(int imax){

    for(int i=0;imax>=i;i++){

        __delay_us(1);

    }

}

void LED_CHK(int time){

    PORTB = 0b00000000;    PORTA = 0b00000001;

        wait(time);

    PORTA = 0b00000010;

        wait(time);

    PORTA = 0b00000100;

        wait(time);

    PORTA = 0b00001000;

        wait(time);

    PORTA = 0b00000000;    PORTB = 0b00001000;

        wait(time);

    PORTB = 0b00000100;

        wait(time);

    PORTB = 0b00000010;

        wait(time);

    PORTB = 0b00000001;

        wait(time);

    PORTB = 0b00000000;    PORTA = 0b00000001;

        wait(time);

    PORTA = 0b00000010;

        wait(time);

    PORTA = 0b00000100;

        wait(time);

    PORTA = 0b00001000;

        wait(time);

    PORTA = 0b00000000;    PORTB = 0b00001000;

        wait(time);

    PORTB = 0b00000100;

        wait(time);

    PORTB = 0b00000010;

        wait(time);

    PORTB = 0b00000001;

        wait(time);

    PORTA = 0b00001111;    PORTB = 0b00001111;

        wait(time);

    PORTA = 0b00000000;    PORTB = 0b00000000;

        wait(time);

    PORTA = 0b00001111;    PORTB = 0b00001111;

        wait(time);

    PORTA = 0b00000000;    PORTB = 0b00000000;

        wait(time); 

}



void BLED(){

    int i;

        CCPR1L = 0b00010;

        CCPR3L = 0b10;

        for(CCPR1L=0b00000010;CCPR1L<=0b1100000;CCPR1L = CCPR1L + 0b00000010){

            wait(20);

        }

        for(CCPR1L=0b1100000;CCPR1L>=0b00000010;CCPR1L = CCPR1L - 0b00000010){

            wait(20);

        }

//    }

}



void GLED(){

    int i;

        CCPR1L = 0b00010;

        CCPR3L = 0b1;

        for(CCPR3L=0b0000001;CCPR3L<=0b11000;CCPR3L = CCPR3L + 0b0000001){

            wait(30);

        }

        for(CCPR3L=0b11000;CCPR3L>=0b000001;CCPR3L = CCPR3L - 0b0000001){

            wait(30);

        }

//    }

}


void main(void)

{

    double time,cktime;

    time=0.10;

    cktime=100.0;

    double dut;

    dut=25.0;

    double ton,toff;


    SYSTEM_Initialize();

    while(1){

        LED_CHK(cktime);

        LED_CHK(cktime);

    

 

        BLED();

        GLED();

        BLED();

        GLED();

        BLED();

        GLED();

        BLED();

        GLED();

    }

}

動作は以下の通り。

全体動作は問題なし。

しかし、LEDの制限抵抗が最適化されていないのでPWMの緑LEDが「0b1」でも消灯しない。

赤LEDでPWMのピンを出していないので動作確認していないが同じことが起きると思う。


ざっくりしか計算していないので、もう少し調整が必要だな。(手持ちの抵抗でやるのが正直安上がりだから検討を進めます。)

0 件のコメント:

コメントを投稿