久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 51單片機的計數器問題,電機圈數怎么達不到停止條件? [打印本頁]

作者: niejiangong    時間: 2022-5-23 18:51
標題: 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);         
}

作者: glinfei    時間: 2022-5-24 09:13
1、把while(k<s1);    改成while(count<s1); 2、把 delay_ms(5000);  改成while(1);3、  另外電機停止應該都置低位吧。
作者: 興安xa    時間: 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;               //對電機轉動圈數進行累加
}

作者: 興安xa    時間: 2022-5-24 11:21
下面的方法  
TH0=0xFC;        //計數器賦初值,和初值設置,用這個初值只能轉一轉
TL0=0x9D;
TH0=0xDE;        //計數器賦初值,和初值設置,用這個初值轉十轉
TL0=0x22;
作者: hzhehe    時間: 2022-5-24 11:39
我覺得樓主的主要問題在于k=count沒有附上導致do while沒有辦法跳出,count已為全局變量,所以無需緩沖也可以用于判斷,另外主函數不帶while的話應該不會重復跑把,可以的話還是加一個大循環,通過大循環來保持mcu的持續運行
作者: niejiangong    時間: 2022-5-24 11:52
glinfei 發表于 2022-5-24 09:13
1、把while(k

1,改成cuont<s1解決問題,k只在開始時等于了count,后面就失去作用了
2,改成while(1)可以一直停止下去,用delay_ms(5000)停止5秒又繼續轉了,在此我不明白,main主程序執行完了還會從頭開始再來嗎?
3,主要我用了個直流電機驅動模塊,真值表上說都置高位是剎車,也可以停止
作者: niejiangong    時間: 2022-5-24 11:54
興安xa 發表于 2022-5-24 11:21
下面的方法  
TH0=0xFC;        //計數器賦初值,和初值設置,用這個初值只能轉一轉
TL0=0x9D;

一轉的控制精度高些,10轉走的太遠了
作者: glinfei    時間: 2022-5-24 14:51
niejiangong 發表于 2022-5-24 11:52
1,改成cuont

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91视频在线观看 | 一级毛片免费完整视频 | 翔田千里一区二区 | 精品亚洲一区二区三区 | 九九色综合 | 男人天堂99 | 亚洲精品综合一区二区 | 成人一区在线观看 | 亚洲国产精品99久久久久久久久 | 国产精品免费福利 | 日本一区二区三区免费观看 | 精品一区二区三区在线播放 | 蜜桃免费一区二区三区 | 国产99视频精品免费播放照片 | 国产激情自拍视频 | 成人h视频在线 | 成人av一区二区亚洲精 | 亚洲精品在线看 | 91在线看 | 国产一区二区三区四区hd | 亚洲精品免费观看 | 欧美激情在线精品一区二区三区 | 中文字幕一区二区三区乱码在线 | 国产三级精品三级在线观看四季网 | 伊人伊人 | 国产精品国产三级国产播12软件 | 狠狠操婷婷| 午夜男人免费视频 | 国产乱码精品1区2区3区 | 成人欧美一区二区三区白人 | 亚洲国产精品美女 | 国产不卡在线播放 | 欧美一级大片 | 久草色播| 欧美精品国产一区二区 | 久久久精品一区二区三区 | 日韩在线不卡视频 | 拍真实国产伦偷精品 | 国产一区二区三区 | 黄色片av| 欧美11一13sex性hd |