2021年11月8日月曜日

PIC16F1827でPWM&Lチカ2

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

今回は「LEDが流れるように点灯する」と「LEDの明るさが段階的に明るさが変化する」を同時に動かします。(ざっくりの動作。)

マイコンを単体で二つの動作同時にそれっぽく見せるはプログラムをきちんとそれぽく書けばいい。

それっぽく見せるというのは、人間の目は速い点滅は点灯にしか見えない。という考え方だ。

中学の理科で発光ダイオードを交流の電源とつないでそのままだとただ点灯しているだけだが、振ると点滅しているのが解る。(参考:https://exam.fukuumedia.com/dcandac/)

このように人間の目をだますような形のものをつくればいい。



プログラムは以下の通り

 #include "mcc_generated_files/mcc.h"

void wait(int imax){

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

        __delay_ms(1);

    }

}


void MIXLED1(double time){

    int i, j = 1;


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

        PORTA = 0b00000001;

        CCPR1L = CCPR1L + j;

        if(j ==  1){if(CCPR1L>=0b11000)j = -1;}

        if(j == -1){if(CCPR1L<=0b0001)j =  1;}

        wait(time);


        PORTA = 0b00000010;

        CCPR1L = CCPR1L + j;

        if(j ==  1){if(CCPR1L>=0b11000)j = -1;}

        if(j == -1){if(CCPR1L<=0b0001)j =  1;}

        wait(time);


        PORTA = 0b00000100;

        CCPR1L = CCPR1L + j;

        if(j ==  1){if(CCPR1L>=0b11000)j = -1;}

        if(j == -1){if(CCPR1L<=0b0001)j =  1;}

        wait(time);


        PORTA = 0b00001000;

        CCPR1L = CCPR1L + j;

        if(j ==  1){if(CCPR1L>=0b11000)j = -1;}

        if(j == -1){if(CCPR1L<=0b0001)j =  1;}

        wait(time);


        PORTA = 0b00000000;

        CCPR1L = CCPR1L + j;

        if(j ==  1){if(CCPR1L>=0b11000)j = -1;}

        if(j == -1){if(CCPR1L<=0b0001)j =  1;}

        wait(time);

    }

}


void main(void)

{

    double time,cktime;

    time=100;

    CCPR1L = 0b00;

    SYSTEM_Initialize();

    while(1){

        MIXLED1(time);

    }

}

動作は以下の通り。

前回同様、LEDの制限抵抗(200Ω)が小さいのでPWMの青LEDが「0b11」から点灯し始めている。もう少し大きい抵抗を付ければ問題ないと思う。



今度はとりあえず青LEDの抵抗値を決めます。抵抗でだめならプログラムで考えないとな....

0 件のコメント:

コメントを投稿