新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)實(shí)現(xiàn)直流電機(jī)的調(diào)速控制

        51單片機(jī)實(shí)現(xiàn)直流電機(jī)的調(diào)速控制

        作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
        前一段時(shí)間一直拿一個(gè)開發(fā)板練習(xí)51,覺得對(duì)AD還不是很熟練,就想單獨(dú)畫一塊板子,圖都做完了一查價(jià)錢,小小的一個(gè)樣板就要上百,實(shí)在有點(diǎn)舍不得,就先再proteus上仿真了一下,然后準(zhǔn)備在萬用板上搭電路。

        電路圖如下

        本文引用地址:http://www.104case.com/article/201611/321819.htm



        占空比18%-82%連續(xù)可調(diào),通過調(diào)節(jié)電路中的電位器實(shí)現(xiàn)。

        做了單定時(shí)器控制和雙定時(shí)器控制兩個(gè)程序,電路圖一樣。

        單定時(shí)器控制程序

        #include //
        #include
        int count0=1000;
        bit A=0;
        sbit IN1=P3^4;
        sbit IN2=P3^5;
        sbit INTR=P3^2;
        sbit wr=P3^6;
        sbit rd=P3^7;
        sbit PB1=P3^0;
        int T0_H,T0_L;
        char TAB[11]={0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,0xff};
        void delay(int);
        void display(void);
        main()
        {int i,DATA;
        IE=0x82;
        TMOD=0x01;
        T0_H=(65535-count0)/256;
        T0_L=(65535-count0)%6;
        TH0=T0_H;
        TL0=T0_L;
        IN1=0;
        IN2=1;
        TR0=1;
        P2=0xff;
        while(1)
        {INTR=1;
        wr=1;
        rd=1;
        P0=0xff;
        PB1=1;
        wr=0;
        _nop_();
        wr=1;
        _nop_();
        while(INTR==1);
        for(i=0;i<10;i++)
        {_nop_();}
        rd=0;
        _nop_();
        DATA=P0;
        wr=1;
        DATA=DATA<<5;
        count0=1000+DATA;
        display();
        }
        }

        void t0(void)interrupt 1
        {if(A==0)
        {
        T0_H=(65535-count0)/256;
        T0_L=(65535-count0)%6;
        TH0=T0_H;
        TL0=T0_L;
        IN1=~IN1;IN2=0;
        A=1;
        }
        else
        {
        T0_H=(55535+count0)/256;
        T0_L=(55535+count0)%6;
        TH0=T0_H;
        TL0=T0_L;
        IN1=~IN1;IN2=0;
        A=0;
        }

        }

        void display(void)
        {int i,j,per,scan;
        per=count0;
        if(per<2700)per=per+650;
        else if((per>2700)&(per<4400))per=per+250;
        else if((per>5800)&(per<6700))per=per-250;
        else if(per>6700)per=per-650;
        scan=0x03;
        for(i=0;i<4;i++)
        {j=per;
        P1=scan;
        P2=TAB[j];
        delay(4);
        per=per/10;
        scan=scan-1;
        }
        }
        void delay(int x)
        {int i,j;
        for(i=0;ifor(j=0;j<120;j++);
        }

        雙定時(shí)器控制的程序

        #include //
        #include
        #define LED P2
        int count1=0;
        int count0=10000;
        #define T0_H (65535-count0)/256
        #define T0_L (65535-count0)%6
        #define T1_H (65535-count1)/256
        #define T1_L (65535-count1)%6
        sbit IN1=P3^4;
        sbit IN2=P3^5;
        sbit INTR=P3^2;
        sbit wr=P3^6;
        sbit rd=P3^7;
        char TAB[11]={0xc0,0xf9,0xa4,0xb0,0x99,
        0x92,0x82,0xf8,0x80,0x90,0xff};
        void delay(int);//1ms
        void display(void);
        void T(int);
        main()
        {int i;
        unsigned char DATA;
        IE=0x8a;
        TMOD=0x11;
        TH0=T0_H;TL0=T0_L;
        TH1=T1_H;TL1=T1_L;
        TR0=0;
        TR1=1;
        IN1=1;
        IN2=0;
        P2=0xff;
        while(1)
        {INTR=1;wr=1;rd=1;
        P0=0xff;
        wr=0;
        _nop_();
        wr=1;
        _nop_();
        _nop_();
        while(INTR==1);
        for(i=0;i<10;i++)
        {_nop_();}
        rd=0;
        _nop_();
        _nop_();
        DATA=P0;
        wr=1;
        T(DATA);
        display();
        }
        }
        void t1(void)interrupt 3
        {TH1=T1_H;TL1=T1_L;
        IN1=0;
        TR0=1;
        TR1=0;
        }
        void t0(void)interrupt 1
        {count0=10000-count1;
        TH0=T0_H;TL0=T0_L;
        IN1=1;
        TR1=1;
        TR0=0;
        }
        void T(int Tw)
        { Tw=Tw<<5;
        count1=1000+Tw;
        }
        void display(void)
        {int i,j,per,scan;
        per=count1;
        if(per<2650)per=per+300;
        else if(per>5890)per=per-300;
        scan=0x03;
        for(i=0;i<4;i++)
        {j=per;
        P1=scan;
        LED=TAB[j];
        delay(4);
        per=per/10;
        scan=scan-1;
        }
        }
        void delay(int x)
        {int i,j;
        for(i=0;ifor(j=0;j<120;j++);
        }
        不足之處:這兩種方法實(shí)現(xiàn)都有一個(gè)問題,輸出PWM波的周期時(shí)長(zhǎng)與期望有一定相差,期望一周期10ms,仿真后得到波形周期為12.5ms左右,具體的解決辦法不是很清楚,希望有高人路過,不吝賜教!



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 青阳县| 聊城市| 锦州市| 固原市| 宿迁市| 巫山县| 奈曼旗| 隆昌县| 卢湾区| 长兴县| 苍梧县| 三明市| 蒙城县| 仙桃市| 常宁市| 沙坪坝区| 永昌县| 巫山县| 新余市| 安丘市| 博爱县| 磐石市| 中西区| 吉首市| 农安县| 双流县| 建湖县| 玉门市| 惠安县| 天峻县| 宜昌市| 寻甸| 砀山县| 合江县| 家居| 彰武县| 瑞安市| 义马市| 灌阳县| 得荣县| 汉中市|