找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2409|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)定時器中斷程序分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:826204 發(fā)表于 2021-3-9 09:36 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
void clock(void) interrupt 3    //T1
{
  if(e>=10)
  {         
            if((e>=10&&e<80)||(e>=100))
        {
                        
                          if(i>=0&&i<422)
                      {
                                     if(i>=0&&i<25)                                         //z軸
                                  {
                                                                DIR2=1;
                                                                aa++;
                                                                shudu2=!shudu2;
                                                                TH1=(65536-30)/256;             //這里的定時器初始值重置,在指令執(zhí)行時不執(zhí)行,而是直接跳過,
                                                                TL1=(65536-30)%256;            //t調(diào)到最下面的定時器初始值設(shè)置,
                                  }
                                     else if(i>=25&&i<285)
                                 {
                                               if(e>=10&&e<80)
                                           {
                                                                 DIR2=1;
                                                                 shudu2=!shudu2;  
                                            }
                                               else
                                           {
                                                                  DIR2=0;
                                                                  shudu2=!shudu2;
                                           }
                                                                TH1=(65536-600)/256;
                                                                TL1=(65536-600)%256;
                                 }
                                    else
                                {     
                                               if(e>=10&&e<80)
                                            {         
                                                           if(i>=285&&i<310)
                                                      {
                                                                 DIR2=0;
                                                                 shudu2=!shudu2;        
                                                      }
                                                           else if(i>=310&&i<384)
                                                     {
                                                                  DIR=1;
                                                                  shudu=!shudu;
                                                     }
                                                           else
                                                     {
                                                                   DIR1=0;
                                                                   shudu1=!shudu1;
                                                     }
                                                                   aa++;
                                                                   TH1=(65536-30)/256;
                                                                   TL1=(65536-30)%256;
                                           }
                                 }
                         }
                }
             else
         {
                              if(i>=25&&i<310)
                        {
                                          if((i>=25&&i<99)||(i>=118&&i<192)||(i>=211&&i<285))   //y軸
                                     {
                                                       if(i>=118&&i<192)
                                                   {
                                                                   DIR=1;
                                                    }
                                                       else
                                                    {
                                                                   DIR=0;
                                                    }
                                                                   shudu=!shudu;
                                                    }
                                           else if((i>=99&&i<118)||(i>=192&&i<211))  //x軸
                                    {
                                                                   DIR1=1;
                                                                   shudu1=!shudu1;
                                     }  
                                          else
                                   {
                                                                   DIR2=0;
                                                                       shudu2=!shudu2;                                 
                                   }
                                                                    aa++;
                                                                    TH1=(65536-30)/256;                  //直接跳到這里  ,不知道為什么?
                                                                    TL1=(65536-30)%256;
                     }
             }
     }
}
因?yàn)榭刂?個步進(jìn)電機(jī)  需要不同的速度 ,所以定時器的時間有大有小,  而程序直接跳到最下面的定時器初始值設(shè)置,這樣3個步進(jìn)電機(jī)的速度就一樣了,有大佬幫忙看看為什么直接跳到最下面的定時器初始值設(shè)置嗎
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:367369 發(fā)表于 2021-3-9 13:47 | 只看該作者
添加全局計(jì)次變量count;在定時器中斷中自加

例如:1ms觸發(fā)一次中;
需要10ms的中斷時間就判斷count為10的倍數(shù)時電機(jī)取反
if(count%10==0)
{
    motor1=!motor1;
}
需要3ms的中斷時間就判斷count為3的倍數(shù)時電機(jī)取反
if(count%3==0)
{
    motor2=!motor2;
}

然后讓count在幾種時間的公倍數(shù)時清零;上面這兩個時間數(shù)值就可以讓
if(count==3)
    count = 0;

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:844772 發(fā)表于 2021-3-9 14:31 | 只看該作者
你想要30微秒左右的中斷,但中斷函數(shù)又寫的特別長,我覺得它不是跳到下邊,而是在反復(fù)進(jìn)中斷呢。這么短的時間,也就夠計(jì)個數(shù),還必須使用自動重裝功能。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:826204 發(fā)表于 2021-3-9 14:58 | 只看該作者
glinfei 發(fā)表于 2021-3-9 14:31
你想要30微秒左右的中斷,但中斷函數(shù)又寫的特別長,我覺得它不是跳到下邊,而是在反復(fù)進(jìn)中斷呢。這么短的時 ...

感謝您的回答
我仿真了一下  它在不符合if else語句的情況下 直接跳到了else的內(nèi)部語句  也就是最下面我注釋的地方
我想做的就是在重置完定時器初始值后 立馬調(diào)出中斷  這樣就有30us的時間  進(jìn)行進(jìn)入中斷的次數(shù)計(jì)數(shù)也是就是程序內(nèi)的a++
所以  我想不明白的是 為什么在不符合else(e>80&&e<=100)語句的情況下  直接跳到了里面的執(zhí)行語句
希望大佬費(fèi)費(fèi)心  幫忙看看  感謝
回復(fù)

使用道具 舉報

5#
ID:826204 發(fā)表于 2021-3-9 15:05 | 只看該作者
game灬boy 發(fā)表于 2021-3-9 13:47
添加全局計(jì)次變量count;在定時器中斷中自加

例如:1ms觸發(fā)一次中;

感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機(jī)的正反向轉(zhuǎn)動   從而達(dá)到控制執(zhí)行機(jī)構(gòu)接觸工件的力恒定  不知道該怎么實(shí)現(xiàn)才好   
希望大佬幫幫忙
回復(fù)

使用道具 舉報

6#
ID:844772 發(fā)表于 2021-3-9 16:10 | 只看該作者
旅途1 發(fā)表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機(jī)的正反向轉(zhuǎn)動   從而達(dá)到控制執(zhí)行機(jī)構(gòu)接觸工 ...

要是弄好了,分享一下唄。我覺得你直接上步進(jìn)電機(jī)控制精度太差,不如上個帶導(dǎo)桿的氣缸,去控制氣壓來的方便。
回復(fù)

使用道具 舉報

7#
ID:367369 發(fā)表于 2021-3-9 16:17 | 只看該作者
旅途1 發(fā)表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機(jī)的正反向轉(zhuǎn)動   從而達(dá)到控制執(zhí)行機(jī)構(gòu)接觸工 ...

直接檢測力傳感器引腳的電平,高電平設(shè)置motor=1;低電平設(shè)置motor=0;不就行了嗎
if(ret==0)
motor=0;
else
motor=1;
直接在main函數(shù)的while(1)中寫,或者定時器中斷中每隔固定時間(如10ms)檢測一次傳感器狀態(tài)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

8#
ID:826204 發(fā)表于 2021-3-9 16:35 | 只看該作者
glinfei 發(fā)表于 2021-3-9 16:10
要是弄好了,分享一下唄。我覺得你直接上步進(jìn)電機(jī)控制精度太差,不如上個帶導(dǎo)桿的氣缸,去控制氣壓來的方 ...

好的  沒辦法  做實(shí)驗(yàn)用 師傅要求
回復(fù)

使用道具 舉報

9#
ID:826204 發(fā)表于 2021-3-9 16:43 | 只看該作者
game灬boy 發(fā)表于 2021-3-9 16:17
直接檢測力傳感器引腳的電平,高電平設(shè)置motor=1;低電平設(shè)置motor=0;不就行了嗎
if(ret==0)
motor=0; ...

傳感器是數(shù)字式的 不是模擬式的
而且執(zhí)行機(jī)構(gòu)是有彈性的鋼絲刷   
在工作的過程中需要不停的調(diào)整電機(jī)  
來控制鋼絲刷與工件的接觸應(yīng)力
回復(fù)

使用道具 舉報

10#
ID:844772 發(fā)表于 2021-3-9 16:48 | 只看該作者
旅途1 發(fā)表于 2021-3-9 16:35
好的  沒辦法  做實(shí)驗(yàn)用 師傅要求

那有個小建議,算一下壓力跟脈沖的關(guān)系,去幾次測的均值打幾個脈沖,不能高頻率控制電機(jī)正反轉(zhuǎn)的,考慮慣性啊,要查一下電機(jī)手冊。
回復(fù)

使用道具 舉報

11#
ID:367369 發(fā)表于 2021-3-9 17:00 | 只看該作者
旅途1 發(fā)表于 2021-3-9 16:43
傳感器是數(shù)字式的 不是模擬式的
而且執(zhí)行機(jī)構(gòu)是有彈性的鋼絲刷   
在工作的過程中需要不停的調(diào)整電機(jī)  ...

那就將判斷條件改一下,如:
使用ret保存?zhèn)鞲衅鞣祷刂担?br /> if(ret在范圍1)//電機(jī)正轉(zhuǎn)
motor=0;
else if(ret在范圍2)//電機(jī)反轉(zhuǎn)
motor=1;
可以放在while(1)中判斷;
回復(fù)

使用道具 舉報

12#
ID:826204 發(fā)表于 2021-3-9 17:18 | 只看該作者
glinfei 發(fā)表于 2021-3-9 16:48
那有個小建議,算一下壓力跟脈沖的關(guān)系,去幾次測的均值打幾個脈沖,不能高頻率控制電機(jī)正反轉(zhuǎn)的,考慮慣 ...

好的  非常感謝
回復(fù)

使用道具 舉報

13#
ID:826204 發(fā)表于 2021-3-9 17:19 | 只看該作者
game灬boy 發(fā)表于 2021-3-9 17:00
那就將判斷條件改一下,如:
使用ret保存?zhèn)鞲衅鞣祷刂担?br /> if(ret在范圍1)//電機(jī)正轉(zhuǎn)

好的  非常感謝
回復(fù)

使用道具 舉報

14#
ID:367369 發(fā)表于 2021-3-9 17:34 | 只看該作者

思路:

int count=0;  //計(jì)次變量    time = count * 0.1ms
T1_Init()
{
        定時器1初始化;
        設(shè)定計(jì)時周期 0.1ms ;
}

u8 get_num() //傳感器值獲取函數(shù)()
{
        u8 temp; //保存?zhèn)鞲衅髦?br />         /*
                在此將傳感器值保存于temp;
        */
        if(temp 在正轉(zhuǎn)范圍)
                return 0;
        if(temp 在反轉(zhuǎn)范圍)
                return 1;
}
int main()
{
        u8 flag_x=0;                //電機(jī)正反轉(zhuǎn)標(biāo)志位
        T0_Init();
        while(1)
        {
                flag_x = get_num();
                if(flag_x==0)
                        motor_x正轉(zhuǎn); //自行編寫正轉(zhuǎn)的條件
                if(flag_x==1)
                        motor_x反轉(zhuǎn);       
        }
        return 0;
}


void T1_clock(void) interrupt 3    //T1
{
        count++;
        if(count%3 == 0)         //計(jì)時時間為0.3ms   電機(jī)1 pwm生成
        {       
                motor_z = !motor_z;
                motor_x = !motor_x;
        }
        if(count%6 == 0)         //計(jì)時時間為0.6ms   電機(jī)2 pwm生成
        {
                motor_y = !motor_y;
                count = 0;
        }       
        else
                return ;
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表