找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機(jī)論壇 51單片機(jī)論壇 馬達(dá)驅(qū)動.dcd.pdf

        馬達(dá)驅(qū)動.dcd.pdf

         

        利用PWM信號驅(qū)動DC馬達(dá)并精確控制馬達(dá)位置:
        把自己做的DC馬達(dá)驅(qū)動電路拿出分享下

          利用PWM信號驅(qū)動馬達(dá),通過調(diào)整PWM信號高低電平a和b的時間比來調(diào)節(jié)速度
          當(dāng)a>b時,馬達(dá)正轉(zhuǎn),當(dāng)a<b時,反轉(zhuǎn),a=b時正停止,
          (由于不知道怎么在文件中直接插入圖形編輯,發(fā)在附件圖片中說明)
          由于馬達(dá)的底端以及轉(zhuǎn)子的周圍有傳感器感應(yīng),所以要求精確定位
          復(fù)位時要求馬達(dá)停在離底端0.3mm的地方,而升出時要求不觸及頂端,
          通過計數(shù)FG信號脈沖數(shù)來確定,經(jīng)過2天的不斷思考和調(diào)試,終于可以精確復(fù)位了
          有時間把示波器上的調(diào)試過程發(fā)出來.
          此次只有伸出(TELE)和縮回(WIDE)2個動作,如果要求開關(guān)控制的話,
          自己可以加開關(guān)控制伸出一半,加速等,
          馬達(dá)驅(qū)動是用的驅(qū)動IC,原來想用MOS管搭H橋驅(qū)動的,后來發(fā)現(xiàn)驅(qū)動精度不好控制.
          如果要單純控制馬達(dá)驅(qū)動,則用來確認(rèn)馬達(dá)位置的信號就不用了
          這樣程序就簡單多了,
          第一次發(fā),也不知道說清楚沒,大家原諒啊

        下面是程序
            include 16f84.h ;
        .osc hs   ;
        .wdt off    ;

        ;__CONFIG _HS_OSC & _PWRTE_ON & _CP_OFF & _WDT_OFF ;
               org  0ch
        tim0 ds   1 ;
        tim1 ds   1 ;
        tim2 ds  1 ;
        timx0 ds   1 ;
        timx1 ds   1 ;
        timx2 ds   1 ;
        timy0 ds   1 ;
        timy1 ds  1 ;
        timy2 ds   1 ;
        width ds   1 ;
        width0 ds   1 ;
        width1 ds   1 ;
        counta0 ds   1 ;
        counta1 ds   1 ;
        countb0 ds   1 ;
        countb1 ds   1 ;

                org 0
                goto start ;程序起始地址

        org 4H ;中斷程序地址
        clrb intcon.2 ;toif 復(fù)位中斷標(biāo)志位
        goto intproc ;去執(zhí)行中斷

        start
        clrb intcon.7 ;gie 關(guān)中斷允許
            clr ra ;
                clr rb ;
               mov !ra,#00000b        ;RA全部輸出
            mov !rb,#01111111b       ;RA.7輸出,其他輸入
        setb rb.7 ;置高電平
        setb status.5 ;bank1 以設(shè)置TMR0
        movlw 81H ;10000011 分頻比1︰4
        mov option,w ;
        clrb status.5 ;bank0
        sw jb rb.4,left1 ;
        jb rb.5,right1 ;
        goto sw ;
        left1
        jb rb.1,left ;
        goto sw ;
        right1
        jb rb.1,sw ;
        goto right ;
        left
        movlw 04BH ;定時時間初值
        mov tmr0,w ;
        clr counta0 ;
        clr counta1 ;
        clr countb0 ;
        clr countb1 ;
        setb intcon.5 ;toie 開TMR0定時中斷
        setb intcon.7 ;gie 開全局中斷
        setb ra.1 ;馬達(dá)控制位
        setb ra.0 ;
        goto iddp1 ;
        right movlw 04BH ;
        mov tmr0,w ;
        setb intcon.5 ;toie
        setb intcon.7 ;gie
        setb ra.1 ;
        clrb ra.0 ;
        goto iddp2 ;

        iddp1 nop ;循環(huán)等待中斷
        jb rb.2,cn0 ;FG信號
        goto iddp1 ;
        cn0 inc counta0 ;FG信號計數(shù)755后停止
        cje counta0,#255,c1 ;
        goto cn01 ;
        c1 inc counta1 ;
        clr counta0 ;
        cje counta1,#3,stop ;
        goto cn01
        cn01 nop
        jb rb.3,cn1 ;
        goto cn01 ;
        cn1 inc countb0 ;
        cje countb0,#255,c2 ;
        goto cn11 ;
        c2 inc countb1 ;
        clr countb0 ;
        cje countb0,#3,stop ;計數(shù)FG信號到達(dá)目標(biāo)值后停止移動,                           ;以免觸及頂端
        goto cn11 ;
        cn11 nop
        jnb rb.2,iddp1 ;
        goto cn11 ;


        iddp2 nop ;循環(huán)等待中斷
        jb rb.1,reset       ;RESET信號
        goto iddp2 ;
        reset ;開始復(fù)位
        clrb intcon.5 ;
        clrb intcon.7 ;
        call wait1 ;重要!等待馬達(dá)穩(wěn)定后再判斷(重力,                           ;f等慣性影響)
        jnb rb.0,ccc ;FG0
        jnb rb.1,bbb ;FG1
        goto finish ;復(fù)位完成

        judge
        call wait1 ; 重要!等待馬達(dá)穩(wěn)定后再判斷(重力,                           ;f等慣性影響)
        jnb rb.0,aaa ;
        jnb rb.1,bbb ;
        goto finish ;
        aaa ;250個脈沖一組,共5組
        clr width0 ;伸出方向移動
        clr width1 ;
        mov width0,250 ;
        mov width1,#5 ;
        loop1 call wait1 ;
        dec width1 ;
        jb rb.0,judge       ;防止在上一個250個脈沖里沒復(fù)位,下                           ;一個復(fù)位成功,則立即停止,如果去                           ;掉這條指令,比如在第3個250
                                   ;脈沖組時沒有復(fù)位ok,第4個后o                           ;k了,則它會繼續(xù)運(yùn)行第5個,就過                           ;了,所以加上后縮短復(fù)位時間
        loop2 dec width0 ;
        call tele ;
        cje width0,#0,loop1 ;
        cje width1,#0,judge ;
        goto loop2 ;
        bbb
        clr width0 ;縮回方向移動
        clr width1 ;
        mov width0,250 ;
        mov width1,#5 ;
        loop3 call wait1 ;
        dec width1 ;
        jb rb.1,judge ;
        loop4 dec width0 ;
        call wide ;
        cje width0,#0,loop3 ;
        cje width1,#0,judge ;
        goto loop4 ;
        ccc ;由于一開始下去速度快,肯定到達(dá)底                            ;部,所以先快速的往伸出方向移動一                           ;點(diǎn),然后再慢點(diǎn)復(fù)位,以減短復(fù)位時                           ;間
        clr width0 ;
        clr width1 ;
        mov width0,200 ;
        mov width1,#5 ;
        loop5 dec width1
        loop6 dec width0 ;
        call tele1 ;區(qū)別于tele,快速伸出來一點(diǎn)點(diǎn),                           ;利用wait4
        cje width0,#0,loop5 ;
        cje width1,#0,judge ;
        goto loop6 ;
        tele ;tele方向移動一個脈沖(慢速)
        setb ra.1 ;
        setb ra.0 ;
        call wait2 ;
        clrb ra.0 ;
        nop
        nop
        nop
        nop
        nop
        clr ra ;
        ret
        tele1 ;tele方向移動一個脈沖(快速)
        setb ra.1 ;
        setb ra.0 ;
        call wait4 ;
        clrb ra.0 ;
        nop
        nop
        nop
        nop
        nop
        clr ra ;
        ret
        wide ;wide方向移動一個脈沖(慢速)
        setb ra.1 ;
        clrb ra.0 ;
        call wait3 ;
        setb ra.0 ;
        nop
        nop
        nop
        nop
        nop
        clr ra ;
        ret
        finish
        jb rb.4,left ;復(fù)位成功
        goto finish ;
        stop
        clrb intcon.5 ;
        clrb intcon.7 ;
        setb ra.1 ;
        setb ra.0 ;
        nop
        nop
        nop
        nop
        call wait2 ;
        clrb ra.0 ;
        call wait2 ;
        jb rb.5,right ;
        goto stop ;
        intproc ;中斷程序
        movlw 04BH ;重新裝入初值
        mov tmr0,w ;
        call rc ;pwm信號高低電平時間比設(shè)置以調(diào)節(jié)馬達(dá)速度
        movlw 01H ;取反ra.0
        xor ra,w ;
        call wait ;
        movlw 01H ; 取反ra.0
        xor ra,w ;
        retfie ;


        rc ;利用電容充放電時間來設(shè)定width值
        clr width ;
        clrb rb.7 ;電容開始放電
        lp11 sb rb.6 ;電容放電完了嗎?
        goto lp12 ;放電完了則跳,取得時間常數(shù)width
        nop ;
        incsz width ;
        goto lp11 ;
        movlw 0FFH ;
        mov width,w ;
        lp12 setb rb.7 ;電容充電
        return ;




        wait
        mov tim0,#1 ;如果使用VR10K的電阻,則1變?yōu)?,
        wa0 mov tim1,width ;
        wa1 nop
        nop
        djnz tim1,wa1
        djnz tim0,wa0
        ret
        wait1
        mov tim2,#50
        wa2 mov timx1,#250
        wa3 djnz timx1,wa3
        djnz tim2,wa2
        ret

        wait2
        mov timx0,#13
        wax1 djnz timx0,wax1
        ret
        wait3
        mov timy0,#13
        way0 djnz timy0,way0
        ret
        wait4
        mov timx2,#23
        wax3 djnz timx2,wax3
        ret



        QQ|手機(jī)版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網(wǎng)站地圖

        GMT+8, 2025-5-5 07:05 , Processed in 0.039987 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        亚洲∧v久久久无码精品| 最新国产精品拍自在线观看| 成人在线免费电影| 亚洲AV乱码久久精品蜜桃| 国产女主播精品大秀系列| 韩国精品欧美一区二区三区 | 中文字幕精品亚洲无线码一区| 99国产精品国产精品九九| 国产精品美女久久久久AV福利| 一二三四视频中文字幕在线看| 国语自产少妇精品视频| 国产成人精品免费视频大全| 在线影院国内精品| 国产精品福利在线观看| 久久精品国产99国产精品| 欧美午夜精品久久久久免费视| 91精品国产自产在线观看| 亚洲一区二区三区国产精品| 91精品国产91久久综合| 久久精品中文字幕第23页| 久久棈精品久久久久久噜噜| 国产精品白丝AV嫩草影院| 欧美特黄一片aa大片免费看| 国产精品久久久久久影院| 日韩AV毛片精品久久久| 久久精品国产亚洲av高清漫画| 国产精品白丝AV嫩草影院| 亚洲精品国产首次亮相| 四虎永久在线精品国产免费| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 中文字幕久久精品| 岛国精品一区免费视频在线观看| 国产啪亚洲国产精品无码| 久久精品一本到99热免费| 国产精品一区在线观看你懂的| 欧产日产国产精品精品| 久久99精品久久久久久不卡| 久久精品无码专区免费青青| 精品久久久久久无码中文字幕| 国产精品无码无需播放器| 久久成人国产精品一区二区|