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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2680|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1041297 發(fā)表于 2023-3-1 13:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大伙,飛梭旋鈕快旋和慢旋的單片機代碼思路要怎么寫?快旋每次讓數(shù)碼管顯示的數(shù)字加5,,慢旋每次讓數(shù)碼管顯示的數(shù)字加1.
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:996773 發(fā)表于 2023-3-1 14:40 | 只看該作者
這個有點難講,我做過,沒有做過得人也很難理解,旋轉(zhuǎn)編碼器無非是讀取io口11,開始進入

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

這時候旋轉(zhuǎn)編碼器轉(zhuǎn)到10,說明你手速快,轉(zhuǎn)到數(shù)值加5子程序,如果你手速慢,旋轉(zhuǎn)編碼器

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

轉(zhuǎn)到了10,那么執(zhí)行加1子程序。反正這種程序關(guān)鍵靠延時,摸索自己手速來調(diào)整延時
回復(fù)

使用道具 舉報

板凳
ID:996773 發(fā)表于 2023-3-1 14:48 | 只看該作者


順便發(fā)個圖,發(fā)現(xiàn)我做的東西很多是別人問的,我這個就是用上了旋轉(zhuǎn)編碼器,

慢轉(zhuǎn)和快轉(zhuǎn)就用了兩段延時思路
回復(fù)

使用道具 舉報

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

使用道具 舉報

5#
ID:213173 發(fā)表于 2023-3-1 20:47 | 只看該作者
快旋每次讓數(shù)碼管顯示的數(shù)字加5,慢旋每次讓數(shù)碼管顯示的數(shù)字加1。不如選一圈多脈沖的旋轉(zhuǎn)編碼器來的方便。
回復(fù)

使用道具 舉報

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



回復(fù)

使用道具 舉報

7#
ID:384109 發(fā)表于 2023-3-2 07:55 | 只看該作者
不難的東西,老早就做過了,類似地板的做法,但是感覺地板做法復(fù)雜了,其實就是一個編碼器計數(shù),加一個定時器就可以了
回復(fù)

使用道具 舉報

8#
ID:1034262 發(fā)表于 2023-3-2 10:46 | 只看該作者
檢測脈沖速度,超過某個速度的N個脈沖開始每個脈沖表示5個,我常用此方法,操作順滑。
回復(fù)

使用道具 舉報

9#
ID:1041297 發(fā)表于 2023-3-2 14:28 | 只看該作者
coody_sz 發(fā)表于 2023-3-2 10:46
檢測脈沖速度,超過某個速度的N個脈沖開始每個脈沖表示5個,我常用此方法,操作順滑。

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

使用道具 舉報

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

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


  3. //----------------編碼器參數(shù)微調(diào)宏定義----------------//
  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 //長按按鍵的回報率的倒數(shù),即一直長按按鍵時響應(yīng)的時間間隔200
  15. #endif

  16. //----------------重入緩存結(jié)構(gòu)體----------------//
  17. typedef struct tongdaoHC {
  18. unsigned char EC11_A_dq; //EC11的A引腳讀到的當(dāng)前狀態(tài)
  19. unsigned char EC11_B_dq; //EC11的B引腳讀到的當(dāng)前狀態(tài)
  20. unsigned char EC11_D_dq; //EC11的D引腳讀到的當(dāng)前狀態(tài)
  21. unsigned char EC11_A_Last; //EC11的A引腳上一次的狀態(tài)
  22. unsigned char EC11_B_Last; //EC11的B引腳上一次的狀態(tài)
  23. unsigned char EC11_IN_Click; //EC11按鍵狀態(tài)機動作標志
  24. unsigned char EC11_j_km; //EC11判斷轉(zhuǎn)動快慢的計數(shù)器
  25. unsigned int EC11_j_COUNT; //EC11按鍵動作計數(shù)器        

  26. }tongdaoHC;

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

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

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

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

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

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

  162. #endif
復(fù)制代碼

回復(fù)

使用道具 舉報

11#
ID:26645 發(fā)表于 2023-3-3 10:52 來自觸屏版 | 只看該作者
慢旋加1快旋加5少了中間的數(shù)值,慢旋加1慢,快旋加1變快
回復(fù)

使用道具 舉報

12#
ID:965189 發(fā)表于 2023-3-3 11:08 | 只看該作者
如果你已經(jīng)能正確讀取編碼器并顯示的話,就是加上時間識別就可以了。
回復(fù)

使用道具 舉報

13#
ID:401564 發(fā)表于 2023-3-3 21:44 | 只看該作者
這種功能是真的雞肋,甚至是反人類設(shè)計
優(yōu)利德示波器用的就是這種設(shè)計,要測量電壓,時間數(shù)據(jù),扭半天都扭不到位置,扭慢了一動不動的,一扭快了就飛到另一邊去
調(diào)個位置像做賊一樣,得一下一下扭...........
回復(fù)

使用道具 舉報

14#
ID:477441 發(fā)表于 2023-3-4 10:08 | 只看該作者
接觸過幾臺用飛梭旋鈕的設(shè)備,飛梭旋鈕帶按壓開關(guān)的

按一下飛梭旋鈕,旋轉(zhuǎn)飛梭快進,再按一下飛梭旋鈕,旋轉(zhuǎn)飛梭慢進,感覺挺方便的
回復(fù)

使用道具 舉報

15#
ID:1065084 發(fā)表于 2023-3-4 11:56 | 只看該作者
根據(jù)狀態(tài)機思想編程實際可用的代碼需要占用一個外部中斷一個定時器。
外部中斷負責(zé)判斷旋鈕左右旋轉(zhuǎn),記得旋鈕硬件并聯(lián)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--; //反轉(zhuǎn)
}
定時器呢負責(zé)判斷快旋轉(zhuǎn)慢旋轉(zhuǎn),定時器觸發(fā)時記錄當(dāng)前的旋鈕值,當(dāng)前旋鈕值與上次旋鈕值比較,如果差距大就將旋轉(zhuǎn)值乘以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旋轉(zhuǎn)值大于2說明旋轉(zhuǎn)的比較快  ,旋轉(zhuǎn)值乘以5,注意這里KT是有符號變量 可以為負值

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 刘亦菲国产毛片bd | 亚洲精品国产电影 | 欧美日韩综合一区 | 欧美a在线看| 日韩一级在线 | 一区二区三区国产视频 | 欧洲av在线| 成人福利网 | www.亚洲一区| 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 91久久久久久久久久久 | 亚洲国产一区二区视频 | 欧美群妇大交群中文字幕 | 欧美国产日韩在线观看成人 | 亚洲人成人一区二区在线观看 | 欧美a在线看 | 精品一二三区 | av激情在线 | 国产在视频一区二区三区吞精 | 久久久久亚洲精品 | 久久成人免费观看 | 男女在线免费观看 | 偷拍自拍网站 | 日韩欧美三级电影 | 欧美视频xxx | 欧美精品1区2区3区 免费黄篇 | 午夜综合| 日本三级做a全过程在线观看 | 国产乱码精品1区2区3区 | 亚洲精品久久久 | 日韩伦理一区二区 | 中文字幕日韩一区 | 日韩一区二区福利视频 | 久久香焦 | 日日操夜夜摸 | 国产在线小视频 | 91麻豆精品国产91久久久久久 | 欧美中文在线 | 久产久精国产品 | 成人国产一区二区三区精品麻豆 | 91久久|