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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3117|回復: 14
收起左側

飛梭旋鈕快旋和慢旋的單片機代碼思路要怎么寫?

  [復制鏈接]
ID:1041297 發表于 2023-3-1 13:57 | 顯示全部樓層 |閱讀模式
各位大伙,飛梭旋鈕快旋和慢旋的單片機代碼思路要怎么寫?快旋每次讓數碼管顯示的數字加5,,慢旋每次讓數碼管顯示的數字加1.
回復

使用道具 舉報

ID:996773 發表于 2023-3-1 14:40 | 顯示全部樓層
這個有點難講,我做過,沒有做過得人也很難理解,旋轉編碼器無非是讀取io口11,開始進入

延時等待變成10,這個第1階段延時得自己摸索手速延時多少,延時后加個識別10指令,如果

這時候旋轉編碼器轉到10,說明你手速快,轉到數值加5子程序,如果你手速慢,旋轉編碼器

還是剛開始的11,那么執行第二階段延時,再加第二個識別10指令,如果這時候旋轉編碼器

轉到了10,那么執行加1子程序。反正這種程序關鍵靠延時,摸索自己手速來調整延時
回復

使用道具 舉報

ID:996773 發表于 2023-3-1 14:48 | 顯示全部樓層
TA8127x6a64.jpg

順便發個圖,發現我做的東西很多是別人問的,我這個就是用上了旋轉編碼器,

慢轉和快轉就用了兩段延時思路
回復

使用道具 舉報

ID:1053178 發表于 2023-3-1 16:47 | 顯示全部樓層
我做過一個
搞個定時器中斷,最大值和最小值時檢查編碼器數值,根據數值差,差值大于某個數就啟動快步進,快件停下5秒就恢復慢步進,一直快進就一直保持。
以前用pic,最大延時1.6秒輕松判斷,改51后最大延時只有100毫秒左右
回復

使用道具 舉報

ID:213173 發表于 2023-3-1 20:47 | 顯示全部樓層
快旋每次讓數碼管顯示的數字加5,慢旋每次讓數碼管顯示的數字加1。不如選一圈多脈沖的旋轉編碼器來的方便。
回復

使用道具 舉報

ID:230500 發表于 2023-3-1 22:39 | 顯示全部樓層
是不是你的程序反應不靈敏; 放到中斷里面10毫秒掃描一次,我感覺一個脈沖數字加1 挺快的, EC12 ,30脈沖的轉一圈可以加到30;
如果要每次加5,可以做個設置,比如步進1 ;步進5 ;收到一個脈沖數字加1 或者數字加5; 另外一種方法就是類似于按鍵長按短按;每次收到編碼的時候數字加1,同時用一個變量存儲這個脈沖做判斷;如果連續收到超過5個編碼后,接下來的連續脈沖就每個脈沖加5; 如果沒有繼續收到脈沖 就把變量標志清零;等待下次的脈沖;這樣LED顯示就比較順滑,先是從1-2-3-4-5-10-15-20-25; 下次又是26-27-28-29-30-35-40-45-50;
ae8e98792edcbb5e63f048b04ab4fe6.jpg


回復

使用道具 舉報

ID:384109 發表于 2023-3-2 07:55 | 顯示全部樓層
不難的東西,老早就做過了,類似地板的做法,但是感覺地板做法復雜了,其實就是一個編碼器計數,加一個定時器就可以了
回復

使用道具 舉報

ID:1034262 發表于 2023-3-2 10:46 | 顯示全部樓層
檢測脈沖速度,超過某個速度的N個脈沖開始每個脈沖表示5個,我常用此方法,操作順滑。
回復

使用道具 舉報

ID:1041297 發表于 2023-3-2 14:28 | 顯示全部樓層
coody_sz 發表于 2023-3-2 10:46
檢測脈沖速度,超過某個速度的N個脈沖開始每個脈沖表示5個,我常用此方法,操作順滑。

你好,請問你有一段源碼嗎?能否看看
回復

使用道具 舉報

ID:857072 發表于 2023-3-2 19:08 來自觸屏版 | 顯示全部樓層
哪有那么懸啊就是拿一個全局變量讓他在掃描編碼器的定時器里一直自減,然后你正常檢測編碼器的旋轉每次檢測到旋轉的時候就讀這個變量里面的值如果是零的話就是慢轉不是零的話就是快轉,讀完后給它的值重置一下。給你看看我的庫文件

單片機源程序如下:
  1. #ifndef _EC11_51_H_
  2. #define _EC11_51_H_


  3. //----------------編碼器參數微調宏定義----------------//
  4. #ifndef KEY_COUNT_DESHAKING
  5. #define KEY_COUNT_DESHAKING 15 //按鍵消抖時間15
  6. #endif
  7. #ifndef KEY_COUNT_LONGT
  8. #define KEY_COUNT_LONGT 1500 //長按按鍵判斷時間1500
  9. #endif
  10. #ifndef KEY_COUNT_DUAL
  11. #define KEY_COUNT_DUAL 180 //雙擊按鍵判斷時間180
  12. #endif
  13. #ifndef KEY_LONG_REPEAT
  14. #define KEY_LONG_REPEAT 200 //長按按鍵的回報率的倒數,即一直長按按鍵時響應的時間間隔200
  15. #endif

  16. //----------------重入緩存結構體----------------//
  17. typedef struct tongdaoHC {
  18. unsigned char EC11_A_dq; //EC11的A引腳讀到的當前狀態
  19. unsigned char EC11_B_dq; //EC11的B引腳讀到的當前狀態
  20. unsigned char EC11_D_dq; //EC11的D引腳讀到的當前狀態
  21. unsigned char EC11_A_Last; //EC11的A引腳上一次的狀態
  22. unsigned char EC11_B_Last; //EC11的B引腳上一次的狀態
  23. unsigned char EC11_IN_Click; //EC11按鍵狀態機動作標志
  24. unsigned char EC11_j_km; //EC11判斷轉動快慢的計數器
  25. unsigned int EC11_j_COUNT; //EC11按鍵動作計數器        

  26. }tongdaoHC;

  27. //----------------函數聲明列表----------------//
  28. unsigned char Encoder_EC11_Scan(tongdaoHC *HC);

  29. //*******************************************************************/
  30. //功能:掃描EC11旋轉編碼器的動作并動作分析
  31. //形參:無
  32. //返回:EC11動作返回 0無動作 1正轉 2反轉 3按著按鍵正轉 4按著按鍵反轉 5短按 6雙擊 7長按 8長按松開
  33. //詳解:對EC11旋轉編碼器的動作進行模式分析
  34. //*******************************************************************/
  35. unsigned char Encoder_EC11_Scan(tongdaoHC *HC)
  36. {
  37. unsigned char ScanResult = 0; //用于分析編碼器動作的變量
  38. if(HC->EC11_j_km)
  39. HC->EC11_j_km--;
  40. if(!HC->EC11_A_dq && !HC->EC11_A_Last && !HC->EC11_B_dq && HC->EC11_B_Last) //A相當前狀態和上次狀態都為低電平時,抓B相上次狀態為高當前狀態為低的下降沿。
  41. {
  42. ScanResult = 1; //正轉
  43. }
  44. else if(!HC->EC11_A_dq && HC->EC11_A_Last && !HC->EC11_B_dq && !HC->EC11_B_Last) //B相當前狀態和上次狀態都為低電平時,抓A相上次狀態為高當前狀態為低的下降沿。
  45. {
  46. ScanResult = 2; //反轉
  47. }
  48. HC->EC11_A_Last = HC->EC11_A_dq; //更新編碼器上一個狀態暫存變量
  49. HC->EC11_B_Last = HC->EC11_B_dq; //更新編碼器上一個狀態暫存變量

  50. if(HC->EC11_D_dq == 0) //如果EC11的按鍵按下,
  51. {
  52. if(ScanResult == 0) //狀態記錄值為0表示EC11沒有轉動
  53. {
  54. ScanResult = 5; //返回值為5
  55. }        
  56. else
  57. {
  58. if(ScanResult == 1) //按下按鍵時候正轉
  59. {
  60. HC->EC11_IN_Click = 7;
  61. return 3; //編碼器按鍵按下并正轉返回值為3
  62. }        
  63. if(ScanResult == 2) //按下按鍵時候反轉
  64. {
  65. HC->EC11_IN_Click = 7;
  66. return 4; //編碼器按鍵按下并反轉返回值為4
  67. }        
  68. }
  69. }
  70. else //如果EC11的按鍵沒有按下,
  71. {
  72. if(ScanResult=1)
  73. return 1; //編碼器正轉返回值為1
  74. else if(ScanResult=2)
  75. return 2; //編碼器正轉返回值為1
  76. }        

  77. if(HC->EC11_IN_Click = 7)//有旋轉動作等待釋放
  78. {
  79. if(ScanResult==0) //按鍵被釋放
  80. {
  81. HC->EC11_IN_Click = 0; //按鍵狀態機清零
  82. }
  83. }        
  84. else //沒有旋轉動作等待進入按鍵處理
  85. {
  86. if(HC->EC11_j_COUNT<3000) //打開按鍵按下時間定時器
  87. HC->EC11_j_COUNT++;
  88. switch (HC->EC11_IN_Click) //狀態機
  89. {
  90. case 0://初始狀態
  91. if(ScanResult==5)
  92. {
  93. HC->EC11_IN_Click = 1; //進入狀態1有鍵按下
  94. HC->EC11_j_COUNT = 0; //復位計時器
  95. }
  96. break;
  97. case 1://有鍵按下狀態
  98. if(ScanResult==5 && HC->EC11_j_COUNT > KEY_COUNT_DESHAKING)//按下消抖時間結束
  99. {
  100. HC->EC11_IN_Click = 2; //進入狀態2按鍵以穩定按下。
  101. }
  102. break;        
  103. case 2://按鍵以穩定按下。

  104. if(HC->EC11_j_COUNT <KEY_COUNT_DUAL && ScanResult==0)//按鍵釋放且計時小于180MS
  105. {
  106. HC->EC11_IN_Click = 3;//進入狀態3按鍵雙擊等待狀態。
  107. HC->EC11_j_COUNT = 0; //復位計時器
  108. }
  109. else if(HC->EC11_j_COUNT >=KEY_COUNT_DUAL && ScanResult==5)//按鍵按下且計時大于180MS
  110. {
  111. HC->EC11_IN_Click = 5;//進入狀態5按鍵長按等待狀態。
  112. }
  113. break;
  114. case 3://按鍵雙擊等待狀態。
  115. if(HC->EC11_j_COUNT <KEY_COUNT_DUAL && ScanResult==5)//按鍵按下且計時重新計數小于180MS
  116. {
  117. HC->EC11_IN_Click = 4;//進入狀態4按鍵雙擊二次按下狀態。
  118. HC->EC11_j_COUNT = 0; //復位計時器
  119. }
  120. else if(HC->EC11_j_COUNT >=KEY_COUNT_DUAL && ScanResult==0)//按鍵釋放且計時重新計數大于180MS
  121. {
  122. HC->EC11_IN_Click = 0; //按鍵狀態機清零
  123. return 5;//單擊返回1

  124. }
  125. break;
  126. case 4://按鍵雙擊二次按下狀態。
  127. if(HC->EC11_j_COUNT > KEY_COUNT_DESHAKING && ScanResult==0)//按下消抖時間結束且按鍵被釋放
  128. {
  129. HC->EC11_IN_Click = 0; //按鍵狀態機清零
  130. return 6;        //雙擊返回鍵值        
  131. }
  132. break;
  133. case 5://按鍵長按等待狀態。
  134. if(HC->EC11_j_COUNT <KEY_COUNT_LONGT && ScanResult==0)//按鍵被釋放且計時小于1600MS
  135. {
  136. HC->EC11_IN_Click = 0; //按鍵狀態機清零
  137. return 5;//單擊返回1
  138. }
  139. else if(HC->EC11_j_COUNT >=KEY_COUNT_LONGT && ScanResult==5)//記錄鍵值在按下鍵值表里且計時大于1600MS
  140. {
  141. HC->EC11_IN_Click = 6;//進入狀態6按鍵長按時間到達狀態。
  142. HC->EC11_j_COUNT = 0; //復位計時器
  143. return 7;//連續按下返回鍵值
  144. }        
  145. break;
  146. case 6://按鍵長按時間以到達。
  147. if(ScanResult==0) //按鍵被釋放
  148. {
  149. HC->EC11_IN_Click = 0; //按鍵狀態機清零
  150. return 8;//連續按下松開返回鍵值
  151. }
  152. else if(HC->EC11_j_COUNT >=KEY_LONG_REPEAT && ScanResult==5)//記錄鍵值在按下鍵值表里大于200MS
  153. {
  154. HC->EC11_j_COUNT = 0; //復位計時器
  155. return 7;//連續按下返回鍵值
  156. }
  157. break;
  158. }
  159. }        
  160. return 0;//沒有按鍵返回0
  161. }

  162. #endif
復制代碼
51hei圖片20230302213848.png 51hei圖片20230302213857.png
回復

使用道具 舉報

ID:26645 發表于 2023-3-3 10:52 來自觸屏版 | 顯示全部樓層
慢旋加1快旋加5少了中間的數值,慢旋加1慢,快旋加1變快
回復

使用道具 舉報

ID:965189 發表于 2023-3-3 11:08 | 顯示全部樓層
如果你已經能正確讀取編碼器并顯示的話,就是加上時間識別就可以了。
回復

使用道具 舉報

ID:401564 發表于 2023-3-3 21:44 | 顯示全部樓層
這種功能是真的雞肋,甚至是反人類設計
優利德示波器用的就是這種設計,要測量電壓,時間數據,扭半天都扭不到位置,扭慢了一動不動的,一扭快了就飛到另一邊去
調個位置像做賊一樣,得一下一下扭...........
回復

使用道具 舉報

ID:477441 發表于 2023-3-4 10:08 | 顯示全部樓層
接觸過幾臺用飛梭旋鈕的設備,飛梭旋鈕帶按壓開關的

按一下飛梭旋鈕,旋轉飛梭快進,再按一下飛梭旋鈕,旋轉飛梭慢進,感覺挺方便的
回復

使用道具 舉報

ID:1065084 發表于 2023-3-4 11:56 | 顯示全部樓層
根據狀態機思想編程實際可用的代碼需要占用一個外部中斷一個定時器。
外部中斷負責判斷旋鈕左右旋轉,記得旋鈕硬件并聯22nf電容來硬件濾波,這樣單片機不用消抖了。
旋鈕方向代碼如下
void INT0_Isr() interrupt 0 using 1
{ //必須加消抖電容22nf
  bit bZZ = 0;//使用該臨時變量是為了加快端口讀取過程
        if (KL) {if (!KR) bZZ = 1;} //上跳
        else{if (KR) bZZ = 1;} //下跳
        if (bZZ) KT++; //正傳
        else KT--; //反轉
}
定時器呢負責判斷快旋轉慢旋轉,定時器觸發時記錄當前的旋鈕值,當前旋鈕值與上次旋鈕值比較,如果差距大就將旋轉值乘以5
void tm0_isr() interrupt 1 using 0
{
        if(KT>KTL)
        {
                if(KT-KTL)>2
                KT=KT*5;
        }
        else
        {
                if(KTL-KT)>2
                KT=KT*5;
        }
        KTL=KT;
}
例如每20ms旋轉值大于2說明旋轉的比較快  ,旋轉值乘以5,注意這里KT是有符號變量 可以為負值

加減速不好用,建議不搞,和人的手感不能相符。

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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