找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 5_39472_24135745e976592.jpg

        5_39472_24135745e976592.jpg

         

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

          利用PWM信號驅動馬達,通過調整PWM信號高低電平a和b的時間比來調節速度
          當a>b時,馬達正轉,當a<b時,反轉,a=b時正停止,
         ?。ㄓ捎诓恢涝趺丛谖募兄苯硬迦雸D形編輯,發在附件圖片中說明)
          由于馬達的底端以及轉子的周圍有傳感器感應,所以要求精確定位
          復位時要求馬達停在離底端0.3mm的地方,而升出時要求不觸及頂端,
          通過計數FG信號脈沖數來確定,經過2天的不斷思考和調試,終于可以精確復位了
          有時間把示波器上的調試過程發出來.
          此次只有伸出(TELE)和縮回(WIDE)2個動作,如果要求開關控制的話,
          自己可以加開關控制伸出一半,加速等,
          馬達驅動是用的驅動IC,原來想用MOS管搭H橋驅動的,后來發現驅動精度不好控制.
          如果要單純控制馬達驅動,則用來確認馬達位置的信號就不用了
          這樣程序就簡單多了,
          第一次發,也不知道說清楚沒,大家原諒啊

        下面是程序
            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 復位中斷標志位
        goto intproc ;去執行中斷

        start
        clrb intcon.7 ;gie 關中斷允許
            clr ra ;
                clr rb ;
               mov !ra,#00000b        ;RA全部輸出
            mov !rb,#01111111b       ;RA.7輸出,其他輸入
        setb rb.7 ;置高電平
        setb status.5 ;bank1 以設置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 ;馬達控制位
        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 ;循環等待中斷
        jb rb.2,cn0 ;FG信號
        goto iddp1 ;
        cn0 inc counta0 ;FG信號計數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 ;計數FG信號到達目標值后停止移動,                           ;以免觸及頂端
        goto cn11 ;
        cn11 nop
        jnb rb.2,iddp1 ;
        goto cn11 ;


        iddp2 nop ;循環等待中斷
        jb rb.1,reset       ;RESET信號
        goto iddp2 ;
        reset ;開始復位
        clrb intcon.5 ;
        clrb intcon.7 ;
        call wait1 ;重要!等待馬達穩定后再判斷(重力,                          ?。唬娴葢T性影響)
        jnb rb.0,ccc ;FG0
        jnb rb.1,bbb ;FG1
        goto finish ;復位完成

        judge
        call wait1 ; 重要!等待馬達穩定后再判斷(重力,                          ?。唬娴葢T性影響)
        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個脈沖里沒復位,下                          ?。灰粋€復位成功,則立即停止,如果去                           ;掉這條指令,比如在第3個250
                                  ?。幻}沖組時沒有復位ok,第4個后o                          ??;k了,則它會繼續運行第5個,就過                           ;了,所以加上后縮短復位時間
        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 ;由于一開始下去速度快,肯定到達底                            ;部,所以先快速的往伸出方向移動一                           ;點,然后再慢點復位,以減短復位時                          ??;間
        clr width0 ;
        clr width1 ;
        mov width0,200 ;
        mov width1,#5 ;
        loop5 dec width1
        loop6 dec width0 ;
        call tele1 ;區別于tele,快速伸出來一點點,                           ;利用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 ;復位成功
        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信號高低電平時間比設置以調節馬達速度
        movlw 01H ;取反ra.0
        xor ra,w ;
        call wait ;
        movlw 01H ; 取反ra.0
        xor ra,w ;
        retfie ;


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




        wait
        mov tim0,#1 ;如果使用VR10K的電阻,則1變為8,
        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



        5_39472_24135745e976592.jpg

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

        GMT+8, 2025-5-5 11:37 , Processed in 0.041613 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        日韩精品无码Av一区二区 | 日本精品高清一区二区不卡| 欧美 日韩 精品 另类视频| 在线精品国产一区二区三区 | 99久久99久久久精品齐齐| 亚洲日韩精品欧美一区二区| 久久国产午夜精品一区二区三区| 男人狂扒美女尿口亲尿口动态图 | 成人国产精品一区二区网站| 国产精品亚洲w码日韩中文| 一二三四日本视频中文| 国产精品拍天天在线| 国产精品亚洲欧美大片在线看| 亚洲精品tv久久久久久久久久| 日本精品一区二区久久久| 国产精品不卡高清在线观看| 91久久婷婷国产综合精品青草| 国产香蕉国产精品偷在线| 5g影院天天5g天天爽精品| 久久久九九有精品国产| 日本午夜精品理论片A级APP发布| 日韩精品人妻系列无码专区| 777被窝午夜精品影院| 91麻豆精品国产| 国产综合免费精品久久久| 亚洲日韩国产AV无码无码精品| 国产精品麻豆高清在线观看 | **网站欧美大片在线观看| 国内精品51视频在线观看 | 久久er99热精品一区二区| 国产精品国产三级在线专区| 免费人成在线观看视频色| 欧美精品免费线视频观看视频| 亚洲国产精品碰碰| 国产精品一二三区| 偷自视频区视频真实在线| 欧美性videofree精品| 香蕉在线精品视频在线观看一级| 精品国产免费一区二区三区香蕉| 久久亚洲AV永久无码精品| 99国产精品国产精品九九|