欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2273|回復: 7
收起左側

51單片機的計數器問題,電機圈數怎么達不到停止條件?

[復制鏈接]
ID:1005338 發表于 2022-5-23 18:51 | 顯示全部樓層 |閱讀模式
通過T0計數器對減速直流電機軸的轉動圈數進行累計(直流電機帶有編碼器),轉到一定圈數后讓電機停止,但不知道為什么,程序運行后,電機一直轉,不會停,不知道為什么?求大俠們幫忙指點指點:

單片機源程序如下:
#include "reg52.h"

typedef unsigned int u16;        //對系統默認數據類型進行重定義
typedef unsigned char u8;

sbit MOTOR1_A=P0^0;          //直流電機的正極
sbit MOTOR1_B=P0^1;          //直流電機的負極

u16 s1=10;                //設定電機旋轉圈數
u16 count=0;               //電機圈數

/*******************************************************************************
* 函 數 名       : delay_ms
* 函數功能                 : ms延時函數,ms=1時,大約延時1ms
* 輸    入       : ten_us
* 輸    出             : 無
*******************************************************************************/
void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}

/*******************************************************************************
* 函 數 名       : time0_init
* 函數功能       : 定時器0中斷配置函數,通過設置TH和TL即可確定計數值
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/

void counter0_init(void)
{
        TMOD|=0X05;                //選擇為計數器0模式,工作方式1
        TH0=0xFC;                  //電機編碼器867個脈沖,減速器軸轉一圈,初值設置為FC9D
        TL0=0x9D;      
        TF0=0;
        TR0=1;        //打開計數器
        ET0=1;        //打開計數器0中斷允許
        EA=1;        //打開總中斷
}

/*******************************************************************************
* 函 數 名       : contor0
* 函數功能       : 定時器0中斷函數,通過設置TH和TL即可確定計數值,并對減速器軸圈數進行累加
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/

void conter0() interrupt 1 //定時器0中斷函數
{
        TH0=0xfC;        //給計數器賦初值
        TL0=0x9D;
        count++;                 //對電機轉動圈數進行累加
}


/*******************************************************************************
* 函 數 名       : main
* 函數功能       : 主函數
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/
void main()
{      
        u16 k;                                //緩沖變量
        k=count;      

        counter0_init();        //計數器0中斷配置

        MOTOR1_A=1;                   //直流電機開始正轉
        MOTOR1_B=0;
        do
        {
                ;
        }
        while(k<s1);                  //檢測編碼器計數是否達到設定值s1
        TR0=0;                                //計數器停止計數
        MOTOR1_A=1;                            //電機停止
        MOTOR1_B=1;
        delay_ms(5000);         
}
回復

使用道具 舉報

ID:844772 發表于 2022-5-24 09:13 | 顯示全部樓層
1、把while(k<s1);    改成while(count<s1); 2、把 delay_ms(5000);  改成while(1);3、  另外電機停止應該都置低位吧。
回復

使用道具 舉報

ID:979299 發表于 2022-5-24 10:51 | 顯示全部樓層
信號線接好,這樣改一下,如果還不行就用最下面的方法先試一下
    MOTOR1_A=1;                   //直流電機開始正轉
    MOTOR1_B=0;
        while(1)
        {
                if(k>s1)  
                {                //檢測編碼器計數是否達到設定值s1
                        TR0=0;                                //計數器停止計數
                        MOTOR1_A=0;                            //電機停止
                        MOTOR1_B=0;
                        delay_ms(5000);
                }
        }

另一種試驗
#include "reg52.h"

typedef unsigned int u16;        //對系統默認數據類型進行重定義
typedef unsigned char u8;

sbit MOTOR1_A=P0^0;          //直流電機的正極
sbit MOTOR1_B=P0^1;          //直流電機的負極

u16 s1=10;                //設定電機旋轉圈數
//u16 count=0;               //電機圈數



void counter0_init(void)
{
    TMOD|=0X05;                //選擇為計數器0模式,工作方式1
    TH0=0xFF;                  //電機編碼器867個脈沖,減速器軸轉一圈,初值設置為FC9D
    TL0=0xF5;      
    TF0=0;
    TR0=1;        //打開計數器
    ET0=1;        //打開計數器0中斷允許
    EA=1;        //打開總中斷
}
main()
{
        counter0_init();
    MOTOR1_A=1;                   //直流電機開始正轉
    MOTOR1_B=0;
        while(1);
}


void conter0() interrupt 1 //定時器0中斷函數
{
    TH0=0xFF;        //給計數器賦初值
    TL0=0xF5;
    MOTOR1_A=0;                            //電機停止
        MOTOR1_B=0;               //對電機轉動圈數進行累加
}
回復

使用道具 舉報

ID:979299 發表于 2022-5-24 11:21 | 顯示全部樓層
下面的方法  
TH0=0xFC;        //計數器賦初值,和初值設置,用這個初值只能轉一轉
TL0=0x9D;
TH0=0xDE;        //計數器賦初值,和初值設置,用這個初值轉十轉
TL0=0x22;
回復

使用道具 舉報

ID:735831 發表于 2022-5-24 11:39 | 顯示全部樓層
我覺得樓主的主要問題在于k=count沒有附上導致do while沒有辦法跳出,count已為全局變量,所以無需緩沖也可以用于判斷,另外主函數不帶while的話應該不會重復跑把,可以的話還是加一個大循環,通過大循環來保持mcu的持續運行
回復

使用道具 舉報

ID:1005338 發表于 2022-5-24 11:52 | 顯示全部樓層

1,改成cuont<s1解決問題,k只在開始時等于了count,后面就失去作用了
2,改成while(1)可以一直停止下去,用delay_ms(5000)停止5秒又繼續轉了,在此我不明白,main主程序執行完了還會從頭開始再來嗎?
3,主要我用了個直流電機驅動模塊,真值表上說都置高位是剎車,也可以停止
回復

使用道具 舉報

ID:1005338 發表于 2022-5-24 11:54 | 顯示全部樓層
興安xa 發表于 2022-5-24 11:21
下面的方法  
TH0=0xFC;        //計數器賦初值,和初值設置,用這個初值只能轉一轉
TL0=0x9D;

一轉的控制精度高些,10轉走的太遠了
回復

使用道具 舉報

ID:844772 發表于 2022-5-24 14:51 | 顯示全部樓層

嵌入系統主程序是不能返回的,結果不可測,我覺得沒必要研究究竟會跑飛還是軟啟動,因為這要看編譯器和芯片設計情況。
兩個高位沒有剎車作用,短路兩極才剎車。我不大習慣程序結束了還置高位。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表