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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2317|回復: 13
打印 上一主題 下一主題
收起左側

關于單片機定時器中斷程序分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:826204 發表于 2021-3-9 09:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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;             //這里的定時器初始值重置,在指令執行時不執行,而是直接跳過,
                                                                TL1=(65536-30)%256;            //t調到最下面的定時器初始值設置,
                                  }
                                     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個步進電機  需要不同的速度 ,所以定時器的時間有大有小,  而程序直接跳到最下面的定時器初始值設置,這樣3個步進電機的速度就一樣了,有大佬幫忙看看為什么直接跳到最下面的定時器初始值設置嗎
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

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

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

評分

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

查看全部評分

回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

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

使用道具 舉報

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

例如:1ms觸發一次中;

感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉動   從而達到控制執行機構接觸工件的力恒定  不知道該怎么實現才好   
希望大佬幫幫忙
回復

使用道具 舉報

6#
ID:844772 發表于 2021-3-9 16:10 | 只看該作者
旅途1 發表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉動   從而達到控制執行機構接觸工 ...

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

使用道具 舉報

7#
ID:367369 發表于 2021-3-9 16:17 | 只看該作者
旅途1 發表于 2021-3-9 15:05
感謝您的回答
我其中是需要一個力傳感器來控制其中一個電機的正反向轉動   從而達到控制執行機構接觸工 ...

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

評分

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

查看全部評分

回復

使用道具 舉報

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

好的  沒辦法  做實驗用 師傅要求
回復

使用道具 舉報

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

傳感器是數字式的 不是模擬式的
而且執行機構是有彈性的鋼絲刷   
在工作的過程中需要不停的調整電機  
來控制鋼絲刷與工件的接觸應力
回復

使用道具 舉報

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

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

使用道具 舉報

11#
ID:367369 發表于 2021-3-9 17:00 | 只看該作者
旅途1 發表于 2021-3-9 16:43
傳感器是數字式的 不是模擬式的
而且執行機構是有彈性的鋼絲刷   
在工作的過程中需要不停的調整電機  ...

那就將判斷條件改一下,如:
使用ret保存傳感器返回值;
if(ret在范圍1)//電機正轉
motor=0;
else if(ret在范圍2)//電機反轉
motor=1;
可以放在while(1)中判斷;
回復

使用道具 舉報

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

好的  非常感謝
回復

使用道具 舉報

13#
ID:826204 發表于 2021-3-9 17:19 | 只看該作者
game灬boy 發表于 2021-3-9 17:00
那就將判斷條件改一下,如:
使用ret保存傳感器返回值;
if(ret在范圍1)//電機正轉

好的  非常感謝
回復

使用道具 舉報

14#
ID:367369 發表于 2021-3-9 17:34 | 只看該作者
旅途1 發表于 2021-3-9 17:19
好的  非常感謝

思路:

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

u8 get_num() //傳感器值獲取函數()
{
        u8 temp; //保存傳感器值
        /*
                在此將傳感器值保存于temp;
        */
        if(temp 在正轉范圍)
                return 0;
        if(temp 在反轉范圍)
                return 1;
}
int main()
{
        u8 flag_x=0;                //電機正反轉標志位
        T0_Init();
        while(1)
        {
                flag_x = get_num();
                if(flag_x==0)
                        motor_x正轉; //自行編寫正轉的條件
                if(flag_x==1)
                        motor_x反轉;       
        }
        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 ;
}

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区在线 | 欧美极品一区二区 | 美女福利网站 | 狠狠久 | 亚洲欧美成人影院 | 婷婷中文字幕 | 国产精品日韩欧美一区二区三区 | 视频一区中文字幕 | 国产欧美日韩精品一区二区三区 | 久久这里只有精品首页 | 欧美性jizz18性欧美 | 国产高清视频在线 | 亚洲精品自拍 | 精品久久九九 | 亚洲天堂精品一区 | 国产91丝袜在线播放 | 黑人精品 | 亚洲一区二区 | 国产一区久久精品 | 久久综合久色欧美综合狠狠 | 爱爱免费视频网站 | 91av在线视频观看 | 日本久久精品视频 | 国产一区二区三区 | 欧美日韩高清在线观看 | 日韩欧美在线观看视频 | 亚洲一区二区在线免费观看 | 色婷婷av一区二区三区软件 | 在线观看中文字幕av | 三级在线视频 | 日韩视频在线一区 | 99久久婷婷国产综合精品电影 | 视频在线一区二区 | 亚洲欧美日韩精品久久亚洲区 | 秋霞av国产精品一区 | 欧美日韩综合视频 | 日韩一区二区三区在线观看视频 | 国产精品999 | 成人动慢 | 99精品一级欧美片免费播放 | 超碰天天 |