標題: 關(guān)于單片機定時器中斷程序分析 [打印本頁]

作者: 旅途1    時間: 2021-3-9 09:36
標題: 關(guān)于單片機定時器中斷程序分析
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;
                     }
             }
     }
}
因為控制3個步進電機  需要不同的速度 ,所以定時器的時間有大有小,  而程序直接跳到最下面的定時器初始值設(shè)置,這樣3個步進電機的速度就一樣了,有大佬幫忙看看為什么直接跳到最下面的定時器初始值設(shè)置嗎

作者: game灬boy    時間: 2021-3-9 13:47
添加全局計次變量count;在定時器中斷中自加

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

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

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

感謝您的回答
我仿真了一下  它在不符合if else語句的情況下 直接跳到了else的內(nèi)部語句  也就是最下面我注釋的地方
我想做的就是在重置完定時器初始值后 立馬調(diào)出中斷  這樣就有30us的時間  進行進入中斷的次數(shù)計數(shù)也是就是程序內(nèi)的a++
所以  我想不明白的是 為什么在不符合else(e>80&&e<=100)語句的情況下  直接跳到了里面的執(zhí)行語句
希望大佬費費心  幫忙看看  感謝
作者: 旅途1    時間: 2021-3-9 15:05
game灬boy 發(fā)表于 2021-3-9 13:47
添加全局計次變量count;在定時器中斷中自加

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

感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉(zhuǎn)動   從而達到控制執(zhí)行機構(gòu)接觸工件的力恒定  不知道該怎么實現(xiàn)才好   
希望大佬幫幫忙
作者: glinfei    時間: 2021-3-9 16:10
旅途1 發(fā)表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉(zhuǎn)動   從而達到控制執(zhí)行機構(gòu)接觸工 ...

要是弄好了,分享一下唄。我覺得你直接上步進電機控制精度太差,不如上個帶導(dǎo)桿的氣缸,去控制氣壓來的方便。
作者: game灬boy    時間: 2021-3-9 16:17
旅途1 發(fā)表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉(zhuǎn)動   從而達到控制執(zhí)行機構(gòu)接觸工 ...

直接檢測力傳感器引腳的電平,高電平設(shè)置motor=1;低電平設(shè)置motor=0;不就行了嗎
if(ret==0)
motor=0;
else
motor=1;
直接在main函數(shù)的while(1)中寫,或者定時器中斷中每隔固定時間(如10ms)檢測一次傳感器狀態(tài)
作者: 旅途1    時間: 2021-3-9 16:35
glinfei 發(fā)表于 2021-3-9 16:10
要是弄好了,分享一下唄。我覺得你直接上步進電機控制精度太差,不如上個帶導(dǎo)桿的氣缸,去控制氣壓來的方 ...

好的  沒辦法  做實驗用 師傅要求
作者: 旅途1    時間: 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í)行機構(gòu)是有彈性的鋼絲刷   
在工作的過程中需要不停的調(diào)整電機  
來控制鋼絲刷與工件的接觸應(yīng)力
作者: glinfei    時間: 2021-3-9 16:48
旅途1 發(fā)表于 2021-3-9 16:35
好的  沒辦法  做實驗用 師傅要求

那有個小建議,算一下壓力跟脈沖的關(guān)系,去幾次測的均值打幾個脈沖,不能高頻率控制電機正反轉(zhuǎn)的,考慮慣性啊,要查一下電機手冊。
作者: game灬boy    時間: 2021-3-9 17:00
旅途1 發(fā)表于 2021-3-9 16:43
傳感器是數(shù)字式的 不是模擬式的
而且執(zhí)行機構(gòu)是有彈性的鋼絲刷   
在工作的過程中需要不停的調(diào)整電機  ...

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

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

好的  非常感謝
作者: 旅途1    時間: 2021-3-9 17:19
game灬boy 發(fā)表于 2021-3-9 17:00
那就將判斷條件改一下,如:
使用ret保存?zhèn)鞲衅鞣祷刂担?br /> if(ret在范圍1)//電機正轉(zhuǎn)

好的  非常感謝
作者: game灬boy    時間: 2021-3-9 17:34
旅途1 發(fā)表于 2021-3-9 17:19
好的  非常感謝

思路:

int count=0;  //計次變量    time = count * 0.1ms
T1_Init()
{
        定時器1初始化;
        設(shè)定計時周期 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;                //電機正反轉(zhuǎn)標志位
        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)         //計時時間為0.3ms   電機1 pwm生成
        {       
                motor_z = !motor_z;
                motor_x = !motor_x;
        }
        if(count%6 == 0)         //計時時間為0.6ms   電機2 pwm生成
        {
                motor_y = !motor_y;
                count = 0;
        }       
        else
                return ;
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1